julia_v_iluhina

Untitled

Sep 14th, 2016
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.45 KB | None | 0 0
  1.     public void openUrl() {
  2.         open("https://www.google.com/gmail/about/");
  3.     }
  4. /*
  5.     если воспользоваться урлом  http://gmail.com
  6.     некоторые действия делать просто не придется)
  7. */
  8. *****************************
  9.  
  10.     SelenideElement signIn = $(".gmail-nav__nav-links-wrap>a:nth-child(2)");
  11.  ...
  12.  
  13.     public void signIn() {
  14.         signIn.click();
  15.     ...
  16. /*
  17.     вот это действие - signIn.click()
  18.     делать бы не пришлось - если использовать урл gmail-а
  19.  
  20.     но - и для такого способа - для элемента signIn
  21.     можно найти селектор полаконичнее и понагляднее
  22.     например = [data-g-label='Sign in']
  23.     а может быть - прошел бы и такой вариант - $(By.linkText("Sign in"))
  24.  
  25.     поскольку - в таких вариантах - код и без переменой signIn
  26.     получится наглядным
  27.     а она используется только в одном методе - советую избавиться от переменной)
  28.  
  29. */
  30. ***************************************
  31.     String email = "[email protected]";
  32.     String password = "123Ballamy";
  33. /*
  34.     это - тестовые данные
  35.  
  36.     пейдж и тестовые даные не должны ничего знать друг о друге
  37.  
  38.     пейдж - это контейнер универсальных вспомогательных методов и переменных
  39.     которые нам пригодятся для тестирования конкретного приложения или его части
  40.     эти методы - хоть и специализированные - т к разработаны под конкретное приложение
  41.     все равно должны быть универсальными - не привязанными ни к каким тестовым ситуациям
  42.     ни к каким вариантам тестовых данных
  43.  
  44.     к примеру - для метода  пейджа signIn(...)
  45.     нам нужны параметры метода - String login, String password
  46.     тогда - ты для своего теста - при вызове метода пейджа - передашь свои логин-пароль
  47.     а я - свои
  48.  
  49.     а если мы внутри метода пейджа прошьем - какой аккаунт мы используем
  50.     то наши методы - не будут универсальными
  51.     т к будут автоматизировать конкретную тестовую ситуацию
  52.  
  53.     для тестовых данных - логина и пароля
  54.     организуй свой класс - TestData, Credentials ...
  55.  
  56.     для методов пейджа - позаботься о правильных наборах параметров у них
  57.     цель - получить универсальные инструменты
  58.  
  59.     как расположить классы - позже распишу
  60. */
  61. ********************************
  62.     public void sendTestLetter(){
  63.     /*
  64.         метод можно назвать и полаконичнее - send
  65.  
  66.         а вот параметров - ему надо бы добавить)
  67.  
  68.         отправляя письмо - мы можем задать - кому отправить и с какой темой
  69.         это и надо вынести в параметры
  70.     */
  71.         ...
  72.         /*
  73.             собственно реализация отправки письма - ок
  74.  
  75.             единственное - запустив тест дважды - получим проблему
  76.             мы с темой "Sended Test Message" - уже 2 письма найдем)
  77.  
  78.             чтоб такой проблемы  не было - нужно отправлять письмо с уникальной темой
  79.             уникальность темы - можно обеспечить очень разными методами
  80.             хоть к строке добавить дату-время в милисекундах, хоть какое-то случайное число
  81.             думаю, ты найдешь вариант
  82.  
  83.             заостряю внимание - уникальная тема письма - это тестовые данные
  84.             и мы их передадим в этот метод, указав как значение соответствующего параметра метода
  85.  
  86.             не надо зашивать внутри метода - тему письма
  87.         */
  88.         $(".vh").shouldHave(exactText("Your message has been sent. View message"));
  89.         /*
  90.             вот этого - ждать не нужно
  91.  
  92.             во-первых - в условии задачи сказано - используйте таймаут = 15 секундам
  93.             мне, кстати, иногда и бОльший таймаут нужен
  94.  
  95.             а во-вторых - чтобы гарантировать - что во входящих мы увидим письмо -
  96.             лучше всего после отправки письма - выполнить рефреш - принудительно получить письма
  97.             собственно - метод для этого у тебя есть ) - refresh()
  98.             и с ним все ок)
  99.  
  100.             этого - достаточного таймаута и выполнения рефреша - вполне достаточно
  101.         */
  102.     }
  103. ***************************
  104.     public void assertEmailPresent(int index, String emailSubject){
  105.             $$("[role='main'] .zA").get(index).shouldHave(text(emailSubject));
  106.     }
  107. /*
  108.     будет понятно - если метод назвать лаконичнее assertEmail или assertMail
  109.  
  110.     mail vs email - это надо будет определиться - чтоб один термин употреблять)
  111.  
  112.  
  113.     что касается второго параметра String emailSubject
  114.     судя по реализованной проверке - мы не четко Subject проверяем
  115.     это - ок
  116.     но - лучше - чтобы имя параметра точно описывало это
  117.     mailText, mailHeaderText - будет уместнее
  118.  
  119.     сама реализация  - ок
  120.  
  121.     $$("[role='main'] .zA") - вот это - список мейлов
  122.     он может и для других целей пригодиться
  123.     стоит вынести в переменную пейджа
  124. */
  125. *****************************
  126. src / test / java / gmail / features /
  127.  
  128. /*
  129.     не надо располагать тест-класс в features
  130.  
  131.     за исключением случаев - когда в проекте есть еще и сьюты
  132.     тогда - это будет хорошим решением
  133.  
  134.     подними пока тест-метод на уровень вверх
  135. */
  136. ***********************************
  137.  
  138. public class GoogleEmailTest extends GoogleEmail {
  139. /*
  140.     неожиданно)
  141.  
  142.     не надо наследовать тест-класс - от пейджа
  143.     практика плохая
  144.  
  145.     повспоминай вот эти материалы
  146.     http://joxi.ru/nAyqEx7HXJZBMA
  147.  
  148.     в данной работе - пейджи-модули были бы удобным решением (ниже напишу подробнее)
  149.  
  150.     имя тест-класса - GmailTest - было бы ок
  151.     четко описывает - что тестим
  152.  
  153.     кстати, ты видел? - здорово расширился faq по неймингу
  154.     https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.zfcd0angknhf
  155. */
  156.  
  157.     @Test
  158.     public void basicEmailLifeCycle() {
  159.     /*
  160.         можно так
  161.  
  162.         а можно и перечислить - что тестим
  163.  
  164.         testSignInSendReceiveAndSearch - не очень длинно)
  165.     */
  166.         openUrl();
  167.  
  168.         signIn();
  169.  
  170.         sendTestLetter();
  171.         refresh();
  172.  
  173.         assertEmailPresent(0, "Sended Test Message");
  174.  
  175.         switchToSent();
  176.         assertEmailPresent(0, "Sended Test Message");
  177.  
  178.         /*
  179.             это не все, что нужно сделать)
  180.  
  181.             осталось - search the arrived mail by topic and ensure only 1 is present in search results
  182.             а это значит - надо вернуться в папку Входящие
  183.             с помощью строки поиска - найти по теме письма
  184.             и убедиться - что найдено 1 письмо, причем наше
  185.         */
  186.     }
  187. }
  188. *****************************************************************
  189.  
  190. /*
  191.     Тут это, конечно, немного за уши притянуто
  192.                 Просто попробуем разделить функционал на несколько пейджей, чтоб понять,
  193.                 как это использовать и как оформлять код, когда используем несколько пейджей
  194.    
  195.                 Ниже приведу код, когда используется несколько пейдж модулей
  196.                 обрати внимание на
  197.                     названия самих методов
  198.    
  199.                     статик импорт не используем, в коде уточняем имя пейджа -
  200.                     это детализирует смысл вызова
  201.                     и когда методов в каждом из пейджей реально много -
  202.                     такой способ вызова позволяет легче ориентироваться в коде
  203.    
  204.                         Gmail.vizit();
  205.    
  206.                         Gmail.logIn(TestData.email, TestData.password);
  207.    
  208.                         Mails.send(TestData.email, subject);
  209.    
  210.                         Menu.refresh();
  211.                         Mails.assertMail(0,subject);
  212.    
  213.                         Menu.goToSent();
  214.                         Mails.assertMail(0,subject);
  215.    
  216.                         Menu.goToInbox();
  217.                         Mails.searchBySubject(subject);
  218.    
  219.                         Mails.assertMails(subject);
  220. */
  221.  
  222. /*
  223.     http://joxi.ru/nAyqEx7HXvxQoA
  224.    
  225.     вот пример хорошей структуры проекта
  226.    
  227.     в src \ main
  228.    
  229.       core - универсальное, что можно переиспользовать в разных проектах
  230.       pages - пейджи тоже можно переиспользовать для других тестов этого же приложения
  231.    
  232.    
  233.     в src \ test
  234.    
  235.       testdata - тестовые данные (если такие есть и они вынесены в отдельный класс)
  236.       testconfigs - предки тест-класса (так можно их изолировать от  собственно тест-классов - чтоб легче было ориентироваться
  237.    
  238.    
  239.     про пекеджи еще немного)
  240.     если GroupID = com.somesite
  241.     а проект todomvctest
  242.     то пакет корневой должен быть com.somesite.todomvctest
  243.    
  244.     логика  - чтобы "не смешивались имена сущностей"
  245.    
  246.     внутри одной компании - может быть несколько проектов)
  247.     и у всех у них один com.somesite  - базовый пекедж
  248.     но для каждого проекта должен быть свой  “базовый пекедж проекта"
  249.     иначе все смешается)
  250.     важно то, что когда этот проект выльется в отдельную библиотеку,
  251.     то не будет конфликтов при его подключении
  252. */
Advertisement
Add Comment
Please, Sign In to add comment