julia_v_iluhina

Untitled

Sep 26th, 2016
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 15.71 KB | None | 0 0
  1.     public boolean isTasksVisible(String... taskNames) {
  2.         return tasks.filter(visible).contains(taskNames);
  3.     }
  4. /*
  5.     ох ты и залез в дебри)
  6.  
  7.     давай читать код)
  8.  
  9.     метод isTasksVisible
  10.     что я жду от метода с таким именем и такими параметрами
  11.     я жду - что он определит - таски с переданными именами - видимы или нет
  12.  
  13.     пока оставим за скобками - зачем это нам
  14.  
  15.     раз умеешь такой сложный код писать - значит умеешь такой же сложный код читать)
  16.  
  17.     смотрим на реализацию
  18.  
  19.     tasks.filter(visible) - возвратит ElementsCollection - коллекцию тасок
  20.     зажав ctrl - наведи курсор мыши на filter
  21.     во всплывающей подсказке - будет сигнатура метода
  22.  
  23.     давай посмотрим - что это за тип такой - ElementsCollection
  24.     зажав ctrl - кникни на ElementsCollection
  25.  
  26.     видим
  27.     public class ElementsCollection extends AbstractList<SelenideElement>
  28.     а AbstractList - наследуется от AbstractCollection
  29.     public abstract class AbstractCollection<E> implements Collection<E>
  30.     и тут ты уже сможешь посмотреть на реализацию метода contains
  31.  
  32.     у нас - список с элементами типа SelenideElement
  33.     и вызывая метод contains для списка элементов типа SelenideElement - мы ищем -
  34.     а нет ли в списке элемента типа массив строк String[] taskNames
  35.     как ты думаешь, мы найдем такой элемент?
  36.  
  37.     это равносильно поиску груши в лотке с яйцами
  38.     нету там груши )
  39.  
  40.     этот метод при любых переданных в него параметрах - вернет false
  41.  
  42.     а теперь - подумай - как работают методы - где ты вызываешь isTasksVisible
  43.     совсем не так, как ты планировал.
  44.  
  45.     не спеши поправлять этот метод
  46.     так как - его надо просто удалить)
  47.     не нужен тебе такой метод вообще
  48.  
  49.     далее - когда будем рассматривать реализованные методы, где isTasksVisible вызывается
  50.     ты поймешь - почему
  51. */
  52. ***************************************************
  53.     public void toggle(String... taskNames) {
  54.          for (String name : taskNames) {
  55.              if (isTasksVisible(name)) {
  56.                  tasks.findBy(exactText(name)).find(".toggle").click();
  57.              }
  58.          }
  59.     }
  60. /*
  61.     ты помнишь, почему мы себе позволили реализовать add с параметром String... taskNames ?
  62.         мы это сделали - т к могут быть такие тесты,
  63.         в которых нам сразу на старте надо добавить несколько тасок
  64.  
  65.     а тут - зачем нам такой сложный метод - переключающий стостояния нескольких тасок?
  66.  
  67.     я писала тебе - что каждая операция должна быть проверена сразу
  68.     и лишь в определенных случаях - можно отложить проверку на небольшое количество шагов
  69.  
  70.     добавляя несколько тасок - мы делаем однотипные операции
  71.     и проверив единожды после добавления нескольких тасок -
  72.     мы в общем поймем - все ли ок с операцией добавления
  73.  
  74.     с toggle - история посложнее
  75.         самое главное - нам на старте теста - не надо переключать несколько тасок
  76.         нам не нужна такая функциональность - мы не будем городить такие предварительные действия в тесте
  77.         а для тестируемых шагов - нам достаточно toggle для одной таски
  78.  
  79.         второе - такой toggle(String... taskNames) - не так прост, как кажется на первый взгляд
  80.         в ситуации - когда ты вызываешь toggle("a", "b")
  81.         где a - активная таска, b - закомпличеная таска
  82.         такой метод таску a - закомплитит, таску  b - переоткроет
  83.         ты не находишь - что сложный метод?
  84.         после каждого такого действия - toggle ОДНОЙ таски - нужна проверка состяния всего списка тасок
  85.  
  86.         а то получим
  87.         вызвали toggle("a", "b")
  88.         потом - проверили состояние списка
  89.         и допустим - оно не такое
  90.         как сделать вывод - что к этому привело?
  91.         а точно и быстро сделать такой вывод?
  92.         в общем случае - не получится...
  93.  
  94.     вот и получается - что кроме add
  95.     такие параметры String... taskNames -
  96.     другим методам-действиям - категорически не нужны
  97.  
  98.     заметь - я не говорю сейчас про методы-проверки состояния списка тасок
  99.  
  100.     теперь про реализацию
  101.         предположим - что метод isTasksVisible - работает правильно =
  102.         определяет - видима ли такая-то таска
  103.  
  104.         допустим, мы пишем тест
  105.         в предварительных действиях - добавили таски a, b, c
  106.         и далее - вызываем toggle (a, b, c)
  107.         по идее - когда такое пишем - мы рассчитываем со всеми 3-мя тасками и поработать
  108.         а у нас - ошибочная ситуация - таски b не видно
  109.         и наш очень умный (я бы даже сказала - не в меру умный) метод - вполне без ошибок отработает
  110.         вопрос - а мы заинтересованы в таком методе, который не отлавливает проблемы, который обходит их?
  111.         мы - при написании тест-метода - знаем свои ожидания максимально точно
  112.         и мы  - вызывая toggle (a, b, c)
  113.         рассчитываем - что с (a, b, c) - можно выполнить это действие
  114.         и если хотя бы с какой-то таской такого выполнить нельзя - так тест ДОЛЖЕН упасть
  115.         так что - делать вспомогательные методы настолько умными - вредно
  116.  
  117.         далее будут примеры - когда во вспомогательных методах нам и правда понадобится не простая логика
  118.  
  119.         тут - далеко не такой случай
  120.         мы знаем - что хотим сделать, и какую операцию, и над какой таской
  121.         и вот только это и должен делать метод
  122.  
  123.         мы же еще и отрапортуем - что такое-то действие - мы покрыли...
  124.         а что ж мы покрыли - если мы в if-блок даже не зашли (при данной реализации - вообще не зашли,
  125.         а при правильной реализации - может зашли, а может и нет - читуация ничем не лучше)
  126.         т е - мы еще и про покрытие наврем с три короба...
  127.  
  128.     выводы
  129.        цикла и если - категорически не нужно
  130.        оставь методы максимально простыми
  131.        от этого - будет только лучше
  132.  
  133.     вернись к ранее реализованной функциональности toggle
  134.  
  135.     да и вообще
  136.        add("a","b") - это ДВЕ операции (мы покрыли ДВАЖДЫ добавление таски)
  137.        toggle("a","b") - это тоже ДВЕ операции
  138.        т е - это - не путь для оптимизации покрытия, это его иллюзия
  139.  
  140.     более про другие так реализованные методы - не распространяюсь
  141.     примерно та же логика рассуждений
  142.  
  143.     метод должен делать ровно то - что декларирует
  144.     ровно с теми тасками, имена которых в метод передали
  145.     без взяких исключений
  146.  
  147.     и еще
  148.         не жалей времени - визуально контролируй
  149.         то ли делает твой тест
  150.         то, что он отработал - еще абсолютно ничего не значит
  151.         он еще должен был выполнить ровно то, что ты как автор - запланировал
  152.  
  153.         одинаково ошибся и в методах-действиях, и в методах-проверках
  154.         и как результат - методы-действия работают криво + проверки точно также проверяют
  155.         так что - в процессе разработки теста - визуальный контроль тоже должен быть
  156. */
  157. ******************************************************
  158.     public void assertTasksAre(String... taskNames) {
  159.  
  160.         if (isTasksVisible(taskNames)) {
  161.             tasks.shouldHave(exactTexts(taskNames));
  162.         }
  163.     }
  164.  
  165.     public void assertTasksEmpty() {
  166.         if (isTasksVisible()) {
  167.             tasks.shouldBe(empty);
  168.         }
  169.     }
  170. /*
  171.     про isTasksVisible() - уже не распространяюсь
  172.     см выше
  173.  
  174.     тут - тоже этого не надо - вызова isTasksVisible()
  175.  
  176.     фактически - "благодаря" isTasksVisible() - проверок и не происходило
  177.  
  178.     еще раз посмотри строки 144-150 прошлого ревью
  179.     видео - тоже посмотри
  180.  
  181.     коллекция отфильтрованная по visible = tasks.filter(visible)
  182.     как и любая другая ElementsCollection
  183.     она может быть проверена с помощью метода shouldHave/shouldBe
  184. */
  185. *********************************************************
  186.     public int count() {
  187.  
  188.         return tasks.filter(visible).size();
  189.  
  190.     }
  191. /*
  192.     тебе не нужен такой метод
  193.  
  194.     прошлое ревью
  195.     строки 25-109
  196.     особенно - 53-58 и 63-69
  197.  
  198.     если не согласен
  199.     или не понятно
  200.     пообщайся в слеке на эту тему
  201.  
  202.     либо спрашивай, либо доказывай свою правоту
  203. */
  204. *********************************************
  205. ublic class TodoMVCTest {
  206.  
  207.     private TaskManagerPage page = new TaskManagerPage();
  208.  
  209.     @Test
  210.     public void testTasksCommonFlow() {
  211.  
  212.         open("https://todomvc4tasj.herokuapp.com/");
  213.  
  214.         page.create("a", "b", "c");
  215.         page.edit("a", "a edited");
  216.         /*
  217.             писала тебе про неявные проверки
  218.             прошлое ревью
  219.             строки 247-272
  220.  
  221.             если бы ты добавил лишь таску "a"
  222.             то да edit("a" ... - проверило бы операцию добавления таски "a"
  223.  
  224.             а так - нет
  225.             проверка должна проверять состояние всех тасок
  226.             а их у тебя целых три
  227.             добавь только ту таску - которая нужна
  228.             тебе пока одной достаточно
  229.             позже добавишь еще
  230.                 хоть
  231.                     create("a", "b")
  232.                 или
  233.                     create("a")
  234.                     ...
  235.                     create("b")
  236.                 это все равно - 2 покрытые операции добавления тасок
  237.             потому - не надо стремиться надобавлять таски сразу
  238.             ничего кроме сложностей - тебе это не даст
  239.         */
  240.         page.toggle("a edited", "b");
  241.         /*
  242.             хорошая идея - добавить-отредактировать-закомплитить таску (одну)
  243.         */
  244.         assertEquals(page.count(), 3);
  245.         /*
  246.             тут надо проверить - не количество тасок
  247.             а их тексты
  248.             причем - ждущей проверкой
  249.  
  250.             если тут будет сценарий
  251.             добавить-отредактировать-закомплитить таску "a"
  252.             то и тексты тасок будут "a"
  253.  
  254.             да, ты так не проверишь закомпличенность таски
  255.             так это можно сделать после перехода на Active фильтр
  256.             писала про это в прошлый раз
  257.             строки 313-329
  258.  
  259.         */
  260.  
  261.         page.filterCompleted();
  262.         /*
  263.             переход на другой фильтр - это тоже действие
  264.             и оно тоже должно быть проверено
  265.             проверки нету
  266.         */
  267.         page.toggle("b");
  268.         page.assertTasksAre("a edited");
  269.         /*
  270.             благодаря текущей реализации - этого всего не произошло
  271.  
  272.             да и вообще - маловато для Completed фильтра покрыл
  273.  
  274.             писала про более равномерное покрытие
  275.         */
  276.  
  277.         page.filterActive();
  278.         /*
  279.             нужна проверка
  280.         */
  281.         page.toggleAll();
  282.         page.assertTasksEmpty();
  283.  
  284.         page.filterAll();
  285.         /*
  286.             нужна проверка
  287.         */
  288.         page.delete("a edited", "c");
  289.         /*
  290.             нужна проверка
  291.         */
  292.         page.clearCompleted();
  293.         /*
  294.             нужна проверка
  295.         */
  296. /*
  297.     проследи покрытие самостоятельно - аналогично описанию
  298.     строки 153-196 прошлого ревью
  299.    
  300.     также учти - строки 238-242
  301. */
Advertisement
Add Comment
Please, Sign In to add comment