julia_v_iluhina

Untitled

Oct 27th, 2016
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.10 KB | None | 0 0
  1. public class TodoMVCTest {
  2.     TodoMVCPage tasks = new TodoMVCPage();
  3.  
  4.     @Test
  5.     public void testTasksLifeCycle() {
  6.  
  7.         open("https://todomvc4tasj.herokuapp.com/");
  8.  
  9.         //All filter
  10.         tasks.add("t1");
  11.         tasks.editPressEnter("t1", "t1_renamed");
  12.         /*
  13.             имени метода edit - будет достаточно
  14.             как мы делаем действие - будем уточнять в additional edit operations
  15.             (когда будем покрывать их, не в этом задании)
  16.  
  17.             а про способы реализации базовых операций - мы не писали в именах методов
  18.             это - тоже базовая операция, в ее стандартном варианте
  19.             потому уточнений и не надо
  20.         */
  21.         tasks.assertItemsLeft(1);
  22.         //complete
  23.         tasks.toggle("t1_renamed");
  24.         /*
  25.             проверка?
  26.             см строки 99, 156-170 прошлого ревью
  27.             следующая операция - не проверяет эту
  28.             значит - нужна явная проверка
  29.         */
  30.  
  31.         //Active filter
  32.         tasks.filterActive();
  33.         /*
  34.             все равно мне кажется - что тут комментарий лишний)
  35.             буквально в следующей строке кода это же написано)
  36.         */
  37.         tasks.assertTasksAre("");
  38.         /*
  39.             а вот тут - не очень-то ок реализована проверка
  40.             можно решить - что в списке тасок - должна быть одна таска с пустым текстом
  41.             но ведь это не так)
  42.  
  43.             http://joxi.ru/l2ZNaR0F83gJv2
  44.             надеюсь, ты это увидел)
  45.             по-прежнему - все таски - есть в списке
  46.             только - некоторые из них - не видимы - согласно статуса
  47.  
  48.             таким образом - если проверять тексты видимых тасок - то проверка будет корректнее
  49.             нас ведь интересуют именно видимое - что такие-то таски видимы в списке
  50.  
  51.             Посмотри видео Якова про это -
  52.             https://drive.google.com/file/d/0B8hgIBw8-V-AdGxxU1R3enl1RzQ/view?ts=567ab8d7
  53.  
  54.             мы можем быть максимально точными и держать 4 проверки
  55.                 2 -
  56.                     в списке = такси с такими-то текстами
  57.                     в списке = пусто
  58.                 и еще 2 -
  59.                     в отфильтрованном по visible списке = таски с такими-то текстами
  60.                     в отфильтрованном по visible списке = пусто
  61.                 И за точность будем платить  тем - что надо думать - когда какую проверку вызвать правильнее
  62.                 и если это делать бездумно - то при небольших изменениях сценариев - могут тесты падать на проверках,
  63.                 или второй вариант - не будем нормально пользоваться полученной точностью...
  64.  
  65.                 мы можем исходить из того, что ошибку, когда невидимые таски копятся в списке - мы тестим на более низком уровне,
  66.                 и на UI уровне - нам не нужно до этого уточняться. Поэтому - мы будем держать всего 2 проверки
  67.                       в отфильтрованном по visible списке = таски с такими-то текстами
  68.                       в отфильтрованном по visible списке = пусто
  69.                 В таком случае - каждый раз понятно - какую проверку вызывать - получаем более KISS картину
  70.                 правда, платим за это точностью) Но - возможно - если мы уже отдельно это в тестах покрыли -
  71.                 что у нас не копятся невидимые таски - так мы и не платим ) И - тогда - все проще в написании тестов,
  72.                 и в их сопровождении.
  73.                 Тогда - поскольку обе проверки реализованы одинаково и других нету - можно из имен проверок скрыть этот нюанс
  74.                 и назвать их assertTasks и assertNoTasks (хотя в них работаем с отфильтрованным по visible списком тасок)
  75.  
  76.                 подправь все проверки в тесте
  77.         */
  78.         tasks.add("t2");
  79.         tasks.editPressEscape("t2", "t2_renamed");
  80.         /*
  81.             ну, на самом деле, это не edit
  82.             а cancel edit
  83.             и это существенно
  84.             и поскольку cancel edit невозможно выполнить по-другому - можно в имени метода не уточняться до PressEscape
  85.  
  86.             также вызов будет чуть нагляднее - если тестовые данные для этого тоже использовать
  87.             tasks.cancelEdit("t2", "t2 edit canceled");
  88.         */
  89.         tasks.assertTasksAre("", "t2");
  90.         //complete all
  91.         tasks.toggleAll();
  92.         tasks.assertTasksAre("", "");
  93.  
  94.         //Completed filter
  95.         tasks.filterCompleted();
  96.         tasks.assertTasksAre("t1_renamed", "t2");
  97.         //activate
  98.         tasks.toggle("t1_renamed");
  99.         /*
  100.             следующая операция не проверяет предыдущую -
  101.             нет точности в проверке - так мы не проверим, что таска "t1_renamed" стала не видимой
  102.             нужна проверка списка тасок
  103.  
  104.             да и edit - уже покрыта, уже не нужно ее проверять
  105.             стоит тут проверить состояние списка тасок и выполнить clear completed -
  106.             чтоб разгрузить немного All фильтр
  107.         */
  108.         tasks.editPressEnter("t2", "t2_renamed");
  109.         tasks.assertTasksAre("", "t2_renamed");
  110.  
  111.         //switch to All filter
  112.         tasks.filterAll();
  113.         /*
  114.             комментарии перед работой на других фильтрах - были в другом формате
  115.             еще раз советую задуматься - так ли они нужны
  116.             ведь первая операция блока - как раз переход на фильтр
  117.  
  118.             мне кажется - это излишним
  119.             да, я помню, ты спрашивал про это в слеке
  120.             ну, требовать убрать эти комментарии не буду
  121.             но я бы не стала их делать)
  122.  
  123.             после перехода на этот фильтр - у тебя 2 таски
  124.             delete("t1_renamed") - не проверяет состояние всего списка
  125.             значит - в таком случае нужна явная проверка
  126.         */
  127.         tasks.delete("t1_renamed");
  128.         tasks.assertTasksAre("t2_renamed");
  129.         //clear completed
  130.         tasks.clearCompleted();
  131.         /*
  132.             писала выше
  133.             советую покрыть это на  Completed фильтре - так равномернее распределишь операции по фильтрам
  134.         */
  135.         tasks.assertTasksEmpty();
  136. /*
  137.     сценарий - почти оптимальный
  138.     всего несколько замечаний, которые не повлияют принципиально на логику е2е -
  139.     это уже достаточно легко подправить
  140. */
  141. *************************************
  142. public ElementsCollection tasks = $$("#todo-list li");
  143. /*
  144.     тут и такой селектор ок
  145.     вариант точнее "#todo-list>li"
  146.  
  147.     в данном несложном приложении оба варианта ок
  148.  
  149.     часто бывает эта разница существенной
  150. */
  151. *********************************
  152.     public ElementsCollection filters = $$("#filters li");
  153.  
  154.     public void filterAll(){
  155.         filters.find(exactText("All")).click();
  156.     }
  157.  
  158.     public void filterActive(){
  159.         filters.find(exactText("Active")).click();
  160.     }
  161.  
  162.     public void filterCompleted(){
  163.         filters.find(exactText("Completed")).click();
  164.     }
  165. /*
  166.     еще одно следствие простоты нашего приложения
  167.     можно в данном случае - обойтись - без filters
  168.     просто - обращаться к линкам напрямую
  169.     $(By.linkText(...))
  170.  
  171.     т к элементов a - вообще не много и они с разным текстом - то можно так поступить
  172.     а в более сложных случаях - да, твой вариант верен
  173.  
  174.     на изменениях не настаиваю
  175. */
  176. ***********************
  177. http://joxi.ru/n2YkKaGUjLn0yr
  178. /*
  179.     мне кажется это уже обсуждали )
  180.     а может это я путаю
  181.  
  182.     зачам тут аж по 2 скобочки?
  183. */
  184. *************************
  185.     public void assertItemsLeft(Integer count){
  186.         String counter = count.toString();
  187.         $("#todo-count").find("strong").shouldHave(exactText(counter));
  188.     }
  189. /*
  190.     технически верно
  191.     можно то же, но лаконичнее реализовать
  192.     $("#todo-count>strong").shouldHave(exactText(count.toString()));
  193.     советую именно такой вариант
  194.     заодно - избежим создания переменной counter
  195.     заодно и придираться к имени переменной не буду (таки ее имя мне не нравится)
  196. */
  197. ************************************************
  198.     public void editPressEnter(String oldTaskName, String newTaskName){
  199.         tasks.find(exactText(oldTaskName)).doubleClick();
  200.         $(".editing").find(".edit").setValue(newTaskName).pressEnter();
  201.     }
  202.  
  203.     public void editPressEscape(String oldTaskName, String newTaskName){
  204.         tasks.find(exactText(oldTaskName)).doubleClick();
  205.         $(".editing").find(".edit").setValue(newTaskName).pressEscape();
  206.     }
  207. /*
  208.     выше - для текста таски ты использовал термин taskText
  209.     почему для этих методов - TaskName?
  210.  
  211.     раз в остальных методах - taskText
  212.     то и тут придерживайся той же линии
  213.     oldTaskText и newTaskText - в твоем случае будет корректнее
  214.     в твоем случае - т к ты ранее остановил свой выбор именно на термине taskText
  215.     кстати, и мне он кажется более точным по сравнению с TaskName)
  216.     про это - уже было пару ревью назад - http://pastebin.com/KXb41iNm
  217.  
  218.     еще такой момент
  219.     что такое $(".editing").find(".edit")
  220.     это элемент ".edit" внутри редактируемой таски внутри списка тасок
  221.    
  222.     да, твой способ получить элемент - технически верный
  223.     но - не самый наглядный
  224.    
  225.     лучше придерживаться такого правила
  226.     если у тебя для некой коллекции/элемента
  227.     уже используется переменая
  228.     и тебе нужно что-то изнутри этой коллекции/элемента
  229.     то лучше оттолкнись от переменной = внешней коллекции/элемента
  230.    
  231.     сравни
  232.     $(".editing").find(".edit")
  233.     и
  234.     tasks.findBy(....).find(".edit")
  235.    
  236.     да, чуть длиннее
  237.     зато - четко видно - что по-прежнему работаем со списком тасок
  238. */
Advertisement
Add Comment
Please, Sign In to add comment