julia_v_iluhina

Untitled

Jul 24th, 2016
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.55 KB | None | 0 0
  1. public class BaseTest {
  2.  
  3.     static {
  4.         Configuration.timeout = 15000;
  5.     }
  6.  
  7.     @After
  8.     public void tearDown() throws IOException {
  9.         screenshot();
  10.     }
  11.  
  12.     @Attachment(type = "image/png")
  13.     public byte[] screenshot() throws IOException {
  14.         File screenshot = Screenshots.takeScreenShotAsFile();
  15.         return Files.toByteArray(screenshot);
  16.     }
  17. }
  18. /*
  19.     Такой предок тест-класса пригодился бы для различных тест-классов
  20.    
  21.     портит картину лишь Configuration.timeout = 15000;
  22.     это стоит перенести непосредственно в тест-класс
  23.     т к это особенность конкретно этого тест-класса
  24.    
  25.     а в предке - пусть будет единственная и универсальная функциональность -
  26.     прикрепить скриншот к репорту на момент окончания теста
  27.    
  28.     почитай про Single Resopnsibility Principle
  29. */
  30. ****************************
  31.  
  32. public class GmailSendAndSearchTest extends BaseTest {
  33. /*
  34.     Вспоминаем)
  35.     имя тест-класса - описываем в общем - что же мы тестируем
  36.     в общем - мы тестируем  Gmail )
  37.     GmailTest - вполне достаточно
  38.    
  39.     а вот в имени тест-метода - можно и уточниться)
  40. */
  41.     @Test
  42.     public void sendAndSearchTest(){
  43.       /*
  44.          мы тут тестим - login, send and search
  45.          
  46.          а также - вспомни про конвеншенсы для имен тест-методов
  47.       */
  48.         open("http://gmail.com");
  49.  
  50.         Gmail.loginToGmail(Credentials.email,Credentials.password);
  51.         /*
  52.             Если пейдж - Gmail
  53.             и вызываем метод пейджа, указывая и имя класса пейдж-модуля
  54.             то метод можно назвать и лаконичнее
  55.             Gmail.login(Credentials.email,Credentials.password); - не хуже ничем)
  56.             точности не потеряешь, а лаконичнее - будет
  57.         */
  58.         Gmail.sendMail(Credentials.email, "Topic");
  59.         /*
  60.             Gmail.send(...) - тоже достаточно точно )
  61.            
  62.             читаем задание
  63.             search the arrived mail by topic and ensure only 1 is present in search results
  64.            
  65.             запустив второй раз тест - у тебя уже 2 письма с таким топиком будет...
  66.             потому - для каждого запуска теста должен быть использован свой, уникальный топик
  67.            
  68.             это сделать можно разными способами, например, добавив к "Topic" = дату-время в милисекундах
  69.         */
  70.  
  71.         Gmail.refresh();
  72.         Gmail.assertMailPresent(0,"Topic");
  73.         /*
  74.             Gmail.assertMail(0,"Topic"); - будет лучше )
  75.             мы ведь не просто наличие письма проверяем)
  76.             а то, что такое-то по счету письмо содержит такой-то текст
  77.         */
  78.  
  79.         Gmail.goToSend();
  80.         /*
  81.             точнее будет - не Send, а Sent
  82.         */
  83.         Gmail.assertMailPresent(0,"Topic");
  84.  
  85.         Gmail.goToInbox();
  86.         Gmail.search("Topic");
  87.         Gmail.assertResultCount(1);
  88.         /*
  89.             Хорошо бы проверить не только то, что найдено одно письмо, но и то, что это наше письмо
  90.             наше письмо = содержит наш уникальный топик
  91.         */
  92. **************************************
  93.  
  94. public class Gmail {
  95. ...    
  96.  
  97.     public static void loginToGmail(String login, String password) {
  98.  /*
  99.     селекторы можно упростить - input - лишнее
  100. */  
  101. *****************************
  102.     public static void sendMail(String login, String topic) {
  103. /*
  104.     все ли ок у тебя с работой с русскими буквами?
  105.     $(byText(“НАПИСАТЬ”)) may not work on windows because of encoding issues.
  106.     you can switch to English in Gmail Settings to avoid such issues and use locating by “english captions”
  107.    
  108.     для полей кому и топик - можно найти локаторы понагляднее
  109.     просмотри у элементов - id, class, name, other attributes
  110.    
  111.     login - имя параметра = емайл получателя
  112.     не очень удачное имя)
  113.     подбери более точное
  114.    
  115.     про имя метода - писала выше)
  116.  
  117. */
  118. ****************************  
  119.     public static void refresh(){
  120. /*
  121.     нужно ли уточнять в селекторе элемент-родитель?
  122.     проанализируй - можно ли без ущерба для точности сократить селектор
  123. */  
  124. ***********************************
  125.     public static void goToInbox(){
  126.     public static void goToSend(){
  127. /*
  128.     Обрати внимание на tilte єлементов
  129.     есть такой метод byTitle(...)
  130.    
  131.     за счет этого можно получить код понагляднее
  132. */
  133. ****************************      
  134.     public static void assertMailPresent(int id,String topic) {
  135. /*
  136.     реализация  - ок
  137.     вопросы - по неймингу
  138.     выше писала про имя метода
  139.    
  140.     id - термин не очень общепринятый в данном случае
  141.     index - часто используется для обозначения индекса, номера нужного элемента в коллекции
  142.     и лишний раз напоминает - что как в любой коллекции - ждем номер при нумерации с нуля
  143.     (общепринятый термин index - для обращения к такому-то элементу коллекции)
  144.    
  145.     topic - мы не точно topic письма сопоставляем
  146.     мы проверяем - что такой-то текст содержится в описании мейла
  147.     так что и для этого параметра надо имя получше подобрать)
  148. */
  149. ******************************  
  150.     @Step
  151.     public static void search(String topic){
  152.         $("input[name='q']").setValue("subject:"+topic).pressEnter();
  153.     }
  154. /*
  155.     можно использовать $(By.name("q"))
  156.    
  157.     а вот и сюрприз)
  158.    
  159.     мы тему письма называли topic
  160.     вылез еще один термин - subject), причем обойти это - не получится, придется использовать этот термин)
  161.    
  162.     не очень хорошо, если для одного понятия будет 2 термина
  163.     предлагаю использовать термин subject - да и в некоторых селекторах это слово тоже будет содержаться
  164. */  
  165. *********************************  
  166.  
  167.     @Step
  168.     public static void assertResultCount(int count){
  169. /*
  170.     уже писала - что проверки количества результатов - недостаточно
  171.    
  172.     давай вспомним todoMVC
  173.     как мы проверяли - что в списке тасок - столько-то задач и их тексты - такие-то
  174.     разве двумя проверками?
  175.    
  176.     есть аналогичный кондишен, который точно также проверит количество и порядок текстов
  177.     только тексты сравнит не на полное соотвествие, а на вхождение
  178. */
  179. ******************************************
  180.  
  181. /*
  182.   http://joxi.ru/nAyqEx7HXvxQoA
  183.  
  184.   вот пример хорошей структуры проекта
  185.    
  186.   в src \ main
  187.    
  188.     core - универсальное, что можно переиспользовать в разных проектах
  189.     pages - пейджи тоже можно переиспользовать для других тестов этого же приложения
  190.  
  191.  
  192.   в src \ test
  193.    
  194.     testdata - тестовые данные (если такие есть и они вынесены в отдельный класс)
  195.     testconfigs - предки тест-класса (так можно их изолировать от  собственно тест-классов - чтоб легче было ориентироваться  
  196.  
  197.  
  198.   про пекеджи еще немного)
  199.   если GroupID = com.somesite
  200.   а проект todomvctest
  201.   то пакет корневой должен быть com.somesite.todomvctest
  202.  
  203.   логика  - чтобы "не смешивались имена сущностей"
  204.  
  205.   внутри одной компании - может быть несколько проектов)
  206.   и у всех у них один com.somesite  - базовый пекедж
  207.   но для каждого проекта должен быть свой  “базовый пекедж проекта"
  208.   иначе все смешается)
  209.   важно то, что когда этот проект выльется в отдельную библиотеку,
  210.   то не будет конфликтов при его подключении
  211.  
  212. */  
  213. *****************
  214. /*
  215.     Также - попробуй прикинуть
  216.     как можно было бы использовать не один пейдж-модуль, а несколько (2-3)
  217.     тут, это, конечно, за уши притянуто
  218.    
  219.     но - хочется увидеть и структурно - проект с несколькими пейджами
  220.     и вообще - попробовать разделить функциоальость на несколько пейджей
  221.    
  222.     если не будет идей - в следующий раз подскажу больше)
  223.     ну или в слек приходи)    
  224. */
Advertisement
Add Comment
Please, Sign In to add comment