julia_v_iluhina

Untitled

Jul 27th, 2016
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.81 KB | None | 0 0
  1. public class ToDoMVC {
  2. /*
  3.     почитай про   conventions для имен тест-классов
  4.     https://docs.google.com/document/d/10qSwWTQ6pGfVZSwOes-1QSmdflMiGD2U_y53VHq2m20/edit#bookmark=id.bligsp5b94xo
  5.     и поправь имя тест-класса)
  6. */
  7.  
  8.     String task1 = "do something1";
  9.     String task2 = "do something2";
  10.     String task3 = "do something3";
  11.     String task4 = "do something4";
  12.     /*
  13.         С таким вынесением тестовых данных в переменные надо быть осторожным - далеко не всегда это полезно.
  14.         Часто тестовые данные разумно оставлять в логике самих тестов - таким образом код тестов более очевидный.
  15.         Тут - как раз тот случай)
  16.  
  17.         Используй в качестве текстов тасок что-то лаконичное (task1, task2 .../ t1,t2,..../ a,b,..../ 1,2,....)
  18.         Тогда код будет по-прежнему наглядный и не загроможденный и при этом - простой для восприятия
  19.         Важно - чтобы код теста был как можно более очевидным и простым - с первого взгляда на него.
  20.        
  21.         И потому тестовые данные - как правило - не стоит выносить в переменные -
  22.         чтобы не приходилось при анализе кода отвлекаться на то, что это за переменные, где объявлены или чем инициализированы.
  23.         Почитай про KISS principle
  24.        
  25.         Какие тестовые данные стоит выносить в переменные.
  26.         То, что применяется в нескольких методах и является строго определенным (не произвольные данные,
  27.         а какие-то конкретные). Пример - логин-пароль для аккаунта, или какие-то предопределенные данные -
  28.         которые всегда есть на начало работы с приложением.
  29.  
  30.         У нас - другой случай. Просто тестовые данные, которые нужны в единственном тест-методе.
  31.         Эти данные не какие-то строго определенные - они такие, какими мы их решили сделать = произвольные
  32.         И у нас нет цели использовать значение - длинные строки, которые будут загромождать код.
  33.         В таких случаях - лучшим решением будет просто указывать в коде значения текстов тасок,
  34.         без использования дополнительных переменных.
  35.         Ну и, конечно, разумно остановиться на лаконичном варианте - для текстов тасок - чтобы код не загромождать.
  36.  
  37.         Понимаю твое стремление разгрузить код тест-метода)
  38.         Мы это сделаем обязательно. Но чуть позже)
  39.         Пока - разберемся с самыми базовыми вещами.
  40.     */
  41.  
  42.  
  43.     @Test
  44.     public void ToDo() throws InterruptedException {
  45.     /*
  46.         имя тест-метода тоже не отвечает conventions
  47.         https://docs.google.com/document/d/10qSwWTQ6pGfVZSwOes-1QSmdflMiGD2U_y53VHq2m20/edit#
  48.  
  49.         также постарайся отразить в имени - что же мы тестируем
  50.  
  51.         мы это описали в общем - в имени тест-класса - тестируем мы приложение TodoMVC
  52.         тут уже не повторяемся, и лишь уточняем
  53.         если бы мы тестировали какую-то одну операцию - мы бы ее имя отразили в имени класса
  54.         ну 2-3 так тоже моно отразить
  55.         у нас получится слишком длинно - если следовать этой логике
  56.         в таких случаях как часть фразы можно использовать LifeCycle, CommonFlow ....
  57.         при этом - надо соблюсти конвеншенсы и уточнить - чей это флоу или жизненный цикл.
  58.         В нашем случае это жизненный цикл тасок)
  59.  
  60.         throws InterruptedException  - тебе не пригодится
  61.     */
  62.         open("https://todomvc4tasj.herokuapp.com/");
  63.  
  64.         //Enter tasks
  65.         $("#new-todo").setValue(task1).pressEnter();
  66.         $("#new-todo").setValue(task2).pressEnter();
  67.         $("#new-todo").setValue(task3).pressEnter();
  68.         $("#new-todo").setValue(task4).pressEnter();
  69.         /*
  70.             Посмотри на задание - там эти действия описываются как create task...
  71.             поскольку термин уже известен  - лучше его и придерживаться, а не вводить новый - //Enter tasks
  72.             здесь и далее - мы будем придерживаться принципа = для одного понятия будем использовать только один термин
  73.             в результате получим - максимально точный однозначно понимаемый код
  74.             это очень важно)
  75.  
  76.             И самое главное
  77.             Мы пишем тест-метод
  78.             Мы не только должны выполнить каждое действие сценария, но и проверить результат его выполнения
  79.             Причем - не откладывая это на потом. Т к нам важно понимать -
  80.             если тест отработал - то все действия сценария выполнились и выполнились верно(с ожидаемым нами результатом)
  81.             если тест упал - то мы можем быстро и точно определить - что работает не так, как мы ожидали.
  82.         */
  83.  
  84.         // Delete task
  85.         /*
  86.             пока код у нас такой - что не очень понятно - какую именно таску мы удаляем
  87.             потому в комментарии стоит уточнить // Delete task2
  88.             общее правило такое - если из кода что-то не понятно - поясняем комментарием
  89.             при этом все равно стараемся его писать полаконичнее
  90.             как только код написан понятно - и что делаем, и с какими тествыми данными работаем -
  91.             комментарий либо сократится, либо вообще уйдет - на комментариях мы тоже будем экономить)
  92.         */
  93.         Thread.sleep(2000);
  94.         /*
  95.             В нормальных ситуациях, в тест-методах тебе не придется применять слипы
  96.             У тебя есть набор ждущих проверок
  97.             Мало того, в Selenide, когда мы вызвали click() (или любой другой метод, требующий видимости элемента),
  98.             ожидание видимости элемента будет выполнено автоматически.
  99.             Попробуй просто убрать эти слипы.
  100.             Если у тебя нету проблем с качеством /скоростью канала интернета - так тест и без слипов отработает
  101.             Если есть такие проблемы - можно увеличить интервал ожидания -
  102.             Configuration.timeout установить вместо 4000(4 сек) бОльшее значение 10000(10 сек)
  103.             делать это надо только если необходимо - сначала убедись в необходимости - убедись, что тест-метод падает без слипов
  104.             Пока можно сделать вначале тест-метода - Configuration.timeout = 10000;
  105.             Потом разберем - как это сделать правильно.
  106.             Суть изменения такой настройки - ранее когда мы вызвали click() - мы ожидали в рамках 4 секунд -
  107.             что элемент станет видимым. Теперь - ждем в рамках 10 секунд. В обоих случаях -
  108.             если элемент становится видимым раньше этого интервала - код выполняется далее - т е лишних тормозов нету.
  109.  
  110.             Раз слипы ушли, то  убери и throws InterruptedException в зщаголовке метода
  111.             Чем плохи слипы.
  112.             Они гарантированно замедляют тест на столько-то времени.
  113.             И при этом - не гарантируют выполнения факта - что мы дождались того, чего планировали
  114.             Плохое сочетание - медленно и ненадежно
  115.  
  116.             Далее по курсу, и далеко не сразу, мы рассмотрим - когда нам нужен такой инструмент, как слип
  117.             А общее правило такое - в логике самого тест-метода слипам не место)
  118.  
  119.             Далее про слипы уже не пишу)
  120.         */
  121.         $("#todo-list li:nth-of-type(2) label").click();
  122.         /*
  123.             В данном случае - можно было не уточняться до label
  124.             А также - нам надо не кликнуть по таске
  125.             А лишь навести на нее курсор мыши
  126.             Это другой метод - не click()
  127.         */
  128.         $("#todo-list li:nth-of-type(2) button").click();
  129.         /*
  130.             button - технически верно получила селектор для кнопки
  131.             предпочитай из нескольких вариантов - самый наглядный
  132.             чтобы текст селектора уже рассказывал - что это за элемент
  133.             выбирай, что отразить в селекторе, просматривая атрибуты в такой последовательности -
  134.             id, class, name, other attributes. И выбирай наиболее подходящий вариант.
  135.             http://joxi.ru/xAe1zDPsYEP63A - тут наиболее наглядный вариант - другой
  136.         */
  137.         /*
  138.             про проверки результата выполненной операции далее не пишу...
  139.             это и кода ниже - тоже касается
  140.         */ 
  141.  
  142.         //Check task to complete and clear
  143.         /*
  144.             complete task4 and clear
  145.             такой комментарий будет точнее и лаконичнее
  146.         */
  147.       ....
  148.  
  149.         //Mark all as completed and clear
  150.         /*
  151.             вот этого избегай - разных терминов для одного или похожих понятий
  152.             Check task to complete или Mark all as completed
  153.             лучше  - complete или complete all
  154.             и лаконичнее, и в одних терминах
  155.             упрости комментарий
  156.         */ 
  157.         ...
Advertisement
Add Comment
Please, Sign In to add comment