julia_v_iluhina

Untitled

Sep 23rd, 2016
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.62 KB | None | 0 0
  1. public class ToDoMvcTest {
  2.  
  3.     @Test
  4.     public void taskWorkFlow() {
  5.  
  6.         open("https://todomvc4tasj.herokuapp.com/");
  7.  
  8.         add("a");
  9.         cancelEdit("a", "a edited");
  10.         counter("1");
  11.         /*
  12.             этой проверки недостаточно
  13.             нужна проверка списка тасок
  14.  
  15.             еще по этой проверке - ниже напишу
  16.         */
  17.  
  18.         completeAll();
  19.         /*
  20.             вот тут с неймингом проблемы... ниже напишу
  21.         */
  22.         assertTasksAre("a");
  23.  
  24.         filterActive();
  25.         assertTasksVisibleEmpty();
  26.         /*
  27.             пока все ок по сценарию)
  28.             и удачно фильтеринг проверили
  29.  
  30.             по названиям методов - будет ниже
  31.         */
  32.  
  33.         add("b");
  34.         edit("b", "b edited");
  35.  
  36.         complete("b edited");
  37.         assertTasksVisibleEmpty();
  38.         /*
  39.             тут тоже хорошо - эффективно неявные проверки использованы
  40.         */
  41.  
  42.         filterCompleted();
  43.         assertTasksAre("a", "b edited");
  44.  
  45.         complete("a");
  46.         /*
  47.             мы тут делаем не complete, a reopen
  48.             про это - ниже будет
  49.         */
  50.         assertTasksVisible("b edited");
  51.  
  52.         clearCompleted();
  53.         assertTasksVisibleEmpty();
  54.  
  55.         filterAll();
  56.         assertTasksAre("a");
  57.  
  58.         delete("a");
  59.         assertTasksEmpty();
  60.     }
  61.     /*
  62.         сценарий - оптимальный
  63.         вопросов к нему - лишь один - одна не точная проверка
  64.  
  65.         остальные вопросы - к неймингу
  66.         ниже разберем
  67.     */
  68. **************************************
  69.     ElementsCollection tasks = $$("#todo-list li");
  70. /*
  71.     есть селектор поточнее "#todo-list>li"
  72.     тут  можно и твой вариант использовать
  73.  
  74.     но бывают  случаи - когда это критичная разница)
  75. */
  76. **************************************
  77.     private void complete(String taskText) {
  78.         tasks.find(exactText(taskText)).$(".toggle").click();
  79.     }
  80. /*
  81.     как думаешь, а почему в прошлой работе - метод называли toggle ?
  82.  
  83.     ты и сам использовал complete - чтобы переоткрыть таску)
  84.     это не правильно - когда имя не отражает того, что делает метод (или не всегда отражает)
  85.  
  86.     имя метода должно всегда отражать - что делает метод
  87.     toggle = переключить
  88.     да, именно это мы и делаем - и когда комплитим, и когда переоткрываем таску
  89.     поэтому - разумно оставить методу (так реализованному) имя toggle
  90.  
  91.     а чтобы было понятно - что это
  92.     будут уместны комментарии в коде
  93.         //reopen
  94.         toggle("a");
  95.     см https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.tmkuktenqqdi
  96. */
  97. *********************************************************************
  98.     private void edit(String taskText, String taskNew) {
  99.         tasks.find(exactText(taskText)).doubleClick();
  100.         tasks.findBy(cssClass("editing")).$(".edit").setValue(taskNew).pressEnter();
  101.     }
  102.  
  103.     private void cancelEdit(String taskText, String taskNew) {
  104.         tasks.find(exactText(taskText)).doubleClick();
  105.         tasks.findBy(cssClass("editing")).$(".edit").setValue(taskNew).pressEscape();
  106.     }
  107. /*
  108.     по именам параметров
  109.         taskText - мы уже применяем для обозначения текста таски
  110.         и тут будем)
  111.  
  112.         а для обозначения было-стало - часто применяется old & new , from & to
  113.         oldTaskText & newTaskText
  114.         fromTaskText & ToTaskText
  115.  
  116.     по реализации методов
  117.     обрати внимание - код методов повторяется
  118.     отличия - только pressEnter() или pressEscape()
  119.  
  120.     разработай метод xxx, возвращающий SelenideElement = элемент, в котором вводили новый текст
  121.     в котором реализуй весь повторяющийся код
  122.  
  123.     и потом сможешь вызывать этот метод xxx(.....).pressEnter()
  124.  
  125.     подумай над названием для него
  126.     это начало, старт редактирования
  127. */
  128. ***************************
  129.  
  130.     private void completeAll() {
  131.         $("#toggle-all").click();
  132.     }
  133. /*
  134.     ситуация, аналогичная с complete vs toggle
  135.  
  136.     примени completeAll() - к закомпличеным таскам
  137.     они переоткроются
  138.  
  139.     поправь имя метода)
  140. */
  141. ****************************
  142.     private void counter(String... tasksCount) {
  143.         $$("#todo-count>strong").shouldHave(exactTexts(tasksCount));
  144.     }
  145. /*
  146.     это метод - проверка
  147.     имена таких методов лучше начинать с assert
  148.     https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.sswzyp7qkm9o
  149.  
  150.     теперь давай определимся - assert чего
  151.         а мы уже определялись - на шаг раньше - когда формулировали main use cases list
  152.         assertItemsLeft - будет в самый раз
  153.         если у тебя есть на User Interface термин - бери его
  154.         это самый наглядный и однозначный вариант
  155.  
  156.     теперь про параметры
  157.         сигнатура метода позволяет сделать вызов assertItemsLeft("a", "b", "c")
  158.         и вот такой вызов assertItemsLeft()
  159.  
  160.         даже вот такой вызов - выглядит странно - assertItemsLeft("0")
  161.  
  162.         т к мы проверяем количество = число
  163.  
  164.         будет ок - если вызов будет выглядеть так assertItemsLeft(0)
  165.  
  166.         а для этого - тебе нужно изменить тип параметра метода
  167.  
  168.     реализация
  169.         мы работаем не с коллекцией элеметов $$("#todo-count>strong")
  170.         а с одним элементом $("#todo-count>strong")
  171.  
  172.         верно - будем проверять его текст
  173.         для элемента - есть кондишен exactText - который проверит текст элемента - на равенство
  174.         тебе именно он и нужен
  175. */
  176. ****************************************
  177.     private void assertTasksAre(String... taskTexts) {
  178.     private void assertTasksVisible(String... taskTexts) {
  179.     private void assertTasksEmpty() {
  180.     private void assertTasksVisibleEmpty() {
  181. /*
  182.     по реализации методов - вопросов нету)
  183.  
  184.     как Яков тебе в слеке говорил, так и на видео эта мысль звучала -
  185.     возможно, что более KISS - реализовать 2 проверки (с фильтрацией по visible)
  186.     а не 4 - т к возникнуть сложности в их применении
  187.  
  188.     но и такой вариант имеет право на жизнь)
  189.  
  190.     про сложности - думаю, потом будут моменты - когда ты их увидишь)
  191.  
  192.     пока давай с именами методов разберемся
  193.  
  194.     правильнее - чтобы в построении имен - мы отталкивались от одних и тех же логических рассуждений
  195.         в одних методах мы проверяем - таски = Tasks
  196.         в других - видимые таски = VisibleTasks (именно такой порядок слов - отталкиваемся правил английского)
  197.         https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.ubyujhyxdfwd
  198.        
  199.         если assertTasksAre
  200.         то assertVisibleTasksAre
  201.  
  202.         а мне кажется - что и пара assertTasks и assertVisibleTasks - ничем не хуже)
  203.  
  204.         если assertTasksEmpty()
  205.         то assertVisibleTasksEmpty()
  206.  
  207.         а мне кажется - что assertNoTasks и assertNoVisibleTasks - однозначнее
  208.  
  209.     на своих вариантах не настаиваю
  210.     но в любом случае - учти моменты про порядок слов и общую логику
  211. */
  212. *****************************************************
  213.     private void filterAll() {
  214.         $("#filters>li:nth-child(1)").click();
  215.     }
  216.  
  217.     private void filterActive() {
  218.         $("#filters>li:nth-child(2)").click();
  219.     }
  220.  
  221.     private void filterCompleted() {
  222.         $("#filters>li:nth-child(3)").click();
  223.     }
  224. /*
  225.     примени в этих 3-х методах $(By.linkText(...))
  226.     получишь код понагляднее
  227. */
Advertisement
Add Comment
Please, Sign In to add comment