julia_v_iluhina

Untitled

Sep 29th, 2016
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.96 KB | None | 0 0
  1. public class GmailMain {
  2. /*
  3.     Вынести вспомогательные методы и переменные в пейдж - правильная идея
  4.  
  5.     и разумно - что реализовала именно пейдж-модуль
  6.     меньше лишнего кода)
  7.  
  8.     по структуре проекта - надо будет чуть подравнять
  9.     ниже продублирую описание хорошей структуры поекта
  10.  
  11.     для пейджей - лучше используй пекедж pages
  12.  
  13.     а насчет имени пейджа-модуля - ниже будет больше предложений)
  14. */
  15. *************************************************
  16.     public static String login = ...
  17.     public static String password = ...
  18. /*
  19.     вот это важный момент
  20.     не стоит смешивать тестовые даные и пейджи
  21.  
  22.     пейдж вообще ничего не должен знать про конкретные тестовые данные
  23.     методы пейджа - должны оперировать теми значениями, которые им передали как
  24.     значения параметров
  25.  
  26.     в таком случае методы пейджа действительно будут максимально универсальными и не завязанными
  27.     на конкретные данные
  28.  
  29.     более того
  30.     при правильной структуре проекта
  31.     пейджи расположены в src \ main \ ...
  32.     а тестовые данные - в src \ test \ ...
  33.  
  34.     соответственно - при таком расположении внутри пейджа мы не сможем воспользоваться тестовыми данными
  35.     чисто технически это не получится)
  36.  
  37.     в задании предлагалось вынести эти данные в отдельный класс
  38.     во-первых, с целью безопасности - можно этот класс не выкладывать в репозиторий
  39.     так ты оставишь засекреченными  пароли-явки
  40.  
  41.     во-вторых, это неплохой прием в принципе
  42.     конечно, надо продумывать такое
  43.     если это какие-то данные типа паролей-явок, или стандартых данных в базе после ее ресета -
  44.     то разумно такие - не произвольные, а вполне определенные данные вынести в отдельный класс или -
  45.     отдельные переменные тест-класса (если он один, например, или если только там они нужны)
  46.     А вот произвольные тестовые данные - не стоит выносить в переменные - так код тестов становится сложнее
  47.  
  48.     Вынеси эти данные в отдельный класс - как публичные статические поля
  49.     и используй их в тест-методе - в качестве значений параметров для тест-методов
  50. */
  51. **********************
  52.         $("[aria-label='To']").setValue(login);
  53.         /*
  54.             по-моему, там name - тоже красивый)
  55.         */
  56.         ...
  57.         $(withText("Your message has been sent.")).shouldBe(visible);
  58.         /*
  59.             этой проверки делать не нужно
  60.             после отправки письма - лучше принулительно обновить состояние аккаунта
  61.  
  62.             почта обновляется согласно настройке аккаунта
  63.                         не факт - что таймаута хватит - чтобы отправленное нами письмо отразилось в Inbox
  64.  
  65.                         перед проверкой - что письмо пришло
  66.                         хорошо выполнить действие - принудительно получить почту = обновить -
  67.                         нажать на кнопку - http://joxi.ru/V2VBQLqf05vL92
  68.  
  69.             но - этот рефреш правильнее реализовывать как отдельный метод
  70.         */
  71. ******************************************
  72.     public static void sentFolder(){
  73.         $("[role='navigation']").find(withText("Sent")).click();
  74.     }
  75. /*
  76.     имя метода = что делать
  77.     ниже предложу варианты
  78.  
  79.     насчет методов класса By
  80.     тут - не стоит использовать import static
  81.     мы не так много экономим на By.
  82.     да и по только названию многих из этих методов не всегда можно быстро понять - о чем речь
  83.     уточнение By. - бывает важным
  84.  
  85.     т е тут правило такое
  86.     если имена методов достаточно однозначны, или если контекст вызова добавляет однозначности -
  87.     смело используй import static
  88.     в остальных случаях - лучше уточнять и класс
  89. */
  90. *********************************
  91.  
  92.     public static void assertMailExist(String topic){
  93.         $$(byText(topic)).filter(visible).shouldHaveSize(1);
  94.     }
  95. /*
  96.     тут можно и поточнее, и пошустрее проверку использовать)
  97.  
  98.     будем считать - что мы молностью контролируем свой аккаунт
  99.  
  100.     в том смысле - что если мы не посылали на этот адрес писем - то никто другой и не послал)
  101.  
  102.     потому - можно использовать более однозначную проверку
  103.     что в списке у элемента с индексом ... текст содержит ...
  104.  
  105.     что хорошо в такой проверке
  106.     что мы оперируем именно списком мейлов
  107.     что мы сначала определяемся - какой мейл будем проверять
  108.     и затем - проверяем его текст
  109.  
  110.     а сейчас реализация - мы выбираем все видимые элементы с текстом ...
  111.     и убеждаемся - что таких элементов = 1
  112.  
  113.     не факт - что найдем именно мейл из списка мейлов)
  114.     лучше оттолкнуться именно от коллекции мейлов
  115.  
  116.     заметь - в данном случае - мы не уточняемся конкретно до колонки с topic
  117.     значит - и параметр метода - не стоит так называть ...
  118. */
  119. *************************************************
  120.     public static void searchMailAndAssertUnique(String topic){
  121.         $("[aria-label='Search']").setValue(topic).pressEnter();
  122.         $$(byText(topic)).filter(visible).shouldHaveSize(1);
  123.     }
  124. /*
  125.     писала тебе в прошлый раз)
  126.  
  127.     должно быть = проверка - отдельно , действие - отдельно
  128.     не надо скрывать тестовую логику)
  129.     в ревью к прошлому заданию - мы это обсуждали
  130.  
  131.     да и методы
  132.         1 - реализация поиска
  133.         2 - реализация проверки - что в списке мейлов - столько-то элементов,
  134.         и в текст этих элементов входят такие-то тексты
  135.     вот такие 2 метода - они более универсальны
  136.     их и отдельно друг от друга - запросто будут востребованы
  137.  
  138.     насчет имени параметра метода - тоже - это не topic)
  139.     может мы и передаем topic
  140.     но в контексте этого метода - это queryText )
  141.  
  142.     для cтроки поиска - подойдет вариант - как и для google search
  143.     используй тот вариант)
  144. */
  145. ******************************
  146. public class GmailMainTest {
  147. /*
  148.    Main - не добавляет никаких сведений полезых )
  149.    я бы сократила до GmailTest
  150. */
  151. ...
  152.     @Test
  153.     public void testSendAndSearch(){
  154.     /*
  155.         тестируем login, send, receive and search )
  156.         можно все и перечислить)
  157.     */
  158.         open("https://mail.google.com");
  159.  
  160.         login();
  161.  
  162.         send("My New Topic");
  163.         /*
  164.             давай запустим тест дважды подряд
  165.             в ящике будет 2 письма с одинаковым топиком
  166.             и тест должен будет упасть на последней проверке
  167.  
  168.             если мы будем при каждом запуске тест-метода оперировать уникальным топиком
  169.             то такой проблемы не будет
  170.         */
  171.  
  172.         /*
  173.             дальше мы должны сделать согласно задания
  174.  
  175.             check that mail arrived
  176.  
  177.             это значит - надо проверить -
  178.             что самое верхнее письмо во входящих - наше
  179.  
  180.             а перед этим - надо принудительно обновить почту
  181.             http://joxi.ru/V2VBQLqf05vL92
  182.  
  183.             встроенной в send проверки - недостаточно
  184.             да и такое сообщение может быть показано
  185.             а в инбоксе - не будет нужного письма
  186.             нас именно этот факт интересует)
  187.  
  188.         */
  189.  
  190.         sentFolder();
  191.         assertMailExist("My New Topic");
  192.  
  193.         searchMailAndAssertUnique("My New Topic");
  194.         /*
  195.             search the arrived mail by topic
  196.             значит - перед поиском надо вернуться в папку входящие
  197.         */
  198.     }
  199. ***********************************************
  200. /*
  201.  
  202.     Тут это, конечно, немного за уши притянуто
  203.             Просто попробуем разделить функционал на несколько пейджей, чтоб понять,
  204.             как это использовать и как оформлять код, когда используем несколько пейджей
  205.  
  206.             Ниже приведу код, когда используется несколько пейдж модулей
  207.             обрати внимание на
  208.                 названия самих методов
  209.  
  210.                 статик импорт не используем, в коде уточняем имя пейджа -
  211.                 это детализирует смысл вызова
  212.                 и когда методов в каждом из пейджей реально много -
  213.                 такой способ вызова позволяет легче ориентироваться в коде
  214.  
  215.                     Gmail.vizit();
  216.  
  217.                     Gmail.logIn(TestData.email, TestData.password);
  218.  
  219.                     Mails.send(TestData.email, subject);
  220.  
  221.                     Menu.refresh();
  222.                     Mails.assertMail(0,subject);
  223.  
  224.                     Menu.goToSent();
  225.                     Mails.assertMail(0,subject);
  226.  
  227.                     Menu.goToInbox();
  228.                     Mails.searchBySubject(subject);
  229.  
  230.                     Mails.assertMails(subject);
  231. */
  232. ********************************
  233.  
  234. /*
  235.     http://joxi.ru/nAyqEx7HXvxQoA
  236.    
  237.     вот пример хорошей структуры проекта
  238.    
  239.     в src \ main
  240.    
  241.       core - универсальное, что можно переиспользовать в разных проектах
  242.       pages - пейджи тоже можно переиспользовать для других тестов этого же приложения
  243.    
  244.    
  245.     в src \ test
  246.    
  247.       testdata - тестовые данные (если такие есть и они вынесены в отдельный класс)
  248.       testconfigs - предки тест-класса (так можно их изолировать от  собственно тест-классов - чтоб легче было ориентироваться
  249.    
  250.    
  251.     про пекеджи еще немного)
  252.     если GroupID = com.somesite
  253.     а проект todomvctest
  254.     то пакет корневой должен быть com.somesite.todomvctest
  255.    
  256.     логика  - чтобы "не смешивались имена сущностей"
  257.    
  258.     внутри одной компании - может быть несколько проектов)
  259.     и у всех у них один com.somesite  - базовый пекедж
  260.     но для каждого проекта должен быть свой  “базовый пекедж проекта"
  261.     иначе все смешается)
  262.     важно то, что когда этот проект выльется в отдельную библиотеку,
  263.     то не будет конфликтов при его подключении
  264.  
  265. */
Advertisement
Add Comment
Please, Sign In to add comment