julia_v_iluhina

Untitled

Jan 16th, 2017
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.82 KB | None | 0 0
  1. public class ToDoMVCTest {
  2.  
  3.     @Test
  4.     public void taskManagement() {
  5.  
  6.         open("https://todomvc4tasj.herokuapp.com/#/");
  7.  
  8.         add("1");
  9.         edit("1", "1_edited");
  10.         toggle("1_edited");
  11.         assertTasksAre("1_edited");
  12.  
  13.         switchFilter("Active");
  14.         assertNoTasks();
  15.         add("2");
  16.         itemsLeftCounter("1");
  17.         cancelEdit("2", "2_edited");
  18.         assertTasksAre("2");
  19.         toggleAll();
  20.         assertNoTasks();
  21.  
  22.         switchFilter("Completed");
  23.         assertTasksAre("1_edited","2");
  24.         reopen("2");
  25.         clearCompleted();
  26.         assertNoTasks();
  27.  
  28.         switchFilter("All");
  29.         delete("2");
  30.         assertNoTasks();
  31.  
  32.  /*
  33.     я бы вот так использовала пропуски строк
  34.     в таком варианте - каждый блок = цепочка действий на одном из фильтров
  35.  
  36.     сценарий - то что надо, оптимальный
  37.     с проверками тоже все ок
  38.  
  39.     есть вопросы к реализации переходов по фильтрам
  40.     и к имени метода itemsLeftCounter
  41.     это ниже прокомментирую
  42.  */
  43.     }
  44.  **************************************
  45.     private ElementsCollection tasksList = $$("#todo-list li");
  46.  /*
  47.     достаточно точно и лаконичнее - tasks
  48.  
  49.     селектор "#todo-list li" - ок, рабочий
  50.     будет точнее "#todo-list>li"
  51.     иногда это важно
  52.  
  53.     тут, в нашем несложном приложении и твой вариант вполне ок
  54.  */
  55. ***********************
  56.     private void edit(String taskText, String taskTextEdited) {
  57.     /*
  58.         сотояния было-стало - удобно обозначить old & new / from & to
  59.         oldTaskText & newTaskText
  60.         так наиболее однозначно получится
  61.     */
  62.         tasksList.find(exactText(taskText)).doubleClick();
  63.         $("#todo-list [class~=editing]").$(".edit").setValue(taskTextEdited).pressEnter();
  64.         /*
  65.             вот этот способ получить таску в режиме редактирования - $("#todo-list [class~=editing]")
  66.             да, он рабочий
  67.             но у него есть недостаток - мы используем новый независимый селектор
  68.  
  69.             лучше придерживаться такого правила
  70.             если у тебя уже используется переменная для коллекции / элемента
  71.             и нужно что-то получить изнутри этой структуры
  72.             то правильнее - доступаться к этому - через уже объявленную переменную
  73.  
  74.             по сути - что нам нужно
  75.             нам нужен элемент коллекции tasksList
  76.             найденный по классу editing
  77.             это = tasksList.findBy(...)
  78.             в Selenide есть кондишен cssClass
  79.             он в качестве параметра - принимает как раз имя класса
  80.  
  81.             дальнейшая цепочка действий - ок
  82.  
  83.             рекомендую вот этот ресурс еще
  84.             https://selenide.gitbooks.io/user-guide/content/ru/
  85.  
  86.             иносказательно про цсс классы
  87.                 Имя элемента и его классы
  88.                 в выражении
  89.                 <element class=“green bold”>
  90.                 element - имя элемента
  91.                 class -  имя атрибута
  92.                 “green bold” - значение атрибута class
  93.                 green - цсс класс элемента element
  94.                 bold - еще один цсс класс элемента element
  95.  
  96.             в итоге - вместо - $("#todo-list [class~=editing]").$(".edit").setValue(taskTextEdited).pressEnter();
  97.             получишь tasksList.findBy(...).$(".edit").setValue(taskTextEdited).pressEnter();
  98.             второй вариант лучше
  99.             потому что не используется лишний независимый селектор
  100.             потому что так понятнее - что работаем с таской из списка тасок
  101.             и потому что в случае ошибки - текст ошибки точнее опишет нам причину проблемы
  102.  
  103.             в общем - советую применять такое правило
  104.             если работаем с коллекцией/элементом через переменную
  105.             и нужно что-то изнутри - то доступаться до этого - через эту переменную
  106.             идя от общего к частному
  107.                 список тасок
  108.                 таска в режиме редактирования
  109.                 внутренний элемент этой таски
  110.             получишь более DRY и более понятный код
  111.             про DRY принцип - почитай в faq
  112.         */
  113.     }
  114. ************************************
  115.     private void cancelEdit(String taskText, String taskTextEdited) {
  116.         tasksList.find(exactText(taskText)).doubleClick();
  117.         $("#todo-list [class~=editing]").$(".edit").setValue(taskTextEdited).pressEscape();
  118.     }
  119. /*
  120.     к именам параметров и реализации этого метода - тоже примени выше описанное для edit
  121.  
  122.     обрати внимание - код этого метода и метода edit - очень похожи
  123.  
  124.     это можно реализовать более DRY
  125.  
  126.      реализуй метод xxx который будет возвращать SelenideElement = элемент
  127.         в котором мы указали новый текст
  128.  
  129.         и потом будешь его переиспользовать как xxx(.....).pressEnter();
  130.  
  131.         подумай над именем метода
  132.         чтоб оно отражало - что метод делает
  133.         фактически - он лишь начинает/стартует редактирование
  134. */
  135. *********************************
  136.     private void switchFilter(String filter) {
  137.         $("#filters").findElementByLinkText(filter).click();
  138.     }
  139. /*
  140.     тут - поскольку приложение простое - можно проще $(By.linkText(...))
  141.  
  142.     а в сложных случаях - конечно, стоило конкретизироваться до элемента-контейнера ссылок переходов по фильтрам
  143.  
  144.     по организации методов перехода по фильтам - попробуй применить вот это
  145.     https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.8bflixemdgfw
  146. */
  147. **********************************************
  148.     private void reopen(String taskText) {
  149.         tasksList.find(exactText(taskText)).hover().$(".toggle").click();
  150.     }
  151. /*
  152.     метод делает то же самое что и toggle(String taskText)
  153.     только еще и лишнее действие = .hover()
  154.  
  155.     примени reopen к активной таске
  156.     получишь - что таска закомплитится
  157.  
  158.     т е - имя метода reopen в таком случае не будет описывать корректно - что мы делаем
  159.     а это плохо
  160.     и этого надо избегать
  161.  
  162.     собственно, наиболее простой метод - использовать метод toggle
  163.     и для закомпличивания таски и для ее переоткрытия
  164.     toggle = переключить
  165.     термин корректный и для закомпличивания таски и для ее переоткрытия
  166.  
  167.     а если хочется отдельные методы для закомпличивания таски и для ее переоткрытия -
  168.     тогда нужны методы в которых сначала выполняется некая проверка состояния таски
  169.     и лишь затем - действие
  170.     тут проверка - обеспечит верное поведение метода - или выполнится вергое действие или тест упадет
  171.     но - стоит ли так делать в данном случае - еще вопрос)
  172.  
  173.     вечный баланс между эффективностью и удобством
  174.  
  175.     допустим - create & reopen - сравнительно легко реализовать в таком ключе
  176.     а вот reopen all & complete all - будет уже посложнее
  177.     (если говорить о реализации, которая даст с одной стороны точность,
  178.     а с другой - не станет ограничивать нас)
  179.  
  180.     потому - советую работать с  toggle & toggleAll
  181. */
  182. ***************************************************
  183.     private void itemsLeftCounter(String tasksLeft){
  184.         $("#todo-count > strong").shouldHave(exactText(tasksLeft));
  185.     }
  186. /*
  187.     "#todo-count > strong" - да, технически все ок
  188.     но я бы применяла "#todo-count>strong"
  189.     т к у пробела - есть свое значение для цсс селектора
  190.     так - "#todo-count>strong" - наиболее однозначно все будет восприниматься
  191.     http://www.w3schools.com/cssref/css_selectors.asp
  192.  
  193.     мы что проверяем
  194.     мы проверяем количество актывных тасок
  195.     логичнее было бы оперировать параметром-числом
  196.     а не строкой
  197.  
  198.     а по сути проверки  - да, она верная
  199.     чтоб работать с параметром-числом - придется внутри метода число преобразовать к строке
  200.     и далее уже работать также как и сейчас
  201.  
  202.     вопрос к имени метода -
  203.     https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.sswzyp7qkm9o
  204. */
  205. }
Advertisement
Add Comment
Please, Sign In to add comment