julia_v_iluhina

Untitled

Sep 19th, 2016
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.46 KB | None | 0 0
  1.     private void openTab(String tabText){
  2.         tabs.findBy(exactText(tabText)).click();
  3.     }
  4.  
  5.     ...
  6.     openTab("Active");
  7.     ...
  8.     openTab("Completed");
  9.     ...
  10.     openTab("All");
  11.     ...
  12.     Я не понимаю что не так с openTab, вроде ж все просто и понятно :) ...
  13. /*
  14.     Ну, если рассуждать как разработчик) - да
  15.         твой вариант - это просто и понятно
  16.  
  17.         Единственное,как я бы обезопасила себя - и доработала твой вариант
  18.         принимала бы параметр
  19.         не  String tabText
  20.         а Filter filter
  21.         где - Filter - enum (ALL, ACTIVE, COMPLETED)
  22.             чтобы было невозможно в метод передать что-то неверное
  23.  
  24.         в результате - получила бы еще какое-то количество кода....
  25.         для такой простой задачи - кода многовато)
  26.  
  27.     в текущей версии - возможно получить ошибку, передав неверное значение
  28.     мы можем вызвать openTab("Al"); или openTab("All ");
  29.     и все )
  30.     хатка поломается)
  31.  
  32.     мы, конечно, можем завести 3 строковые константы - тексты фильтров
  33.     и вызывать openTab(ALL) / openTab(ACTIVE)/openTab(COMPLETED)
  34.     но - нам в этом случае никто не запретит  вызвать openTab("Al")
  35.     и снова - получили ерунду
  36.  
  37.     можно реализовать как я писала выше
  38.     с использованием enum
  39.     будет математически стройно
  40.     захочешь - попробуй)
  41.  
  42.     и сравни с вариантом - когда у тебя есть 3 простіх метода без параметров -
  43.     filterAll / filterActive / filterCompleted
  44.  
  45.     в автоматизации тестирования - особенно важно выполнение KISS принципа
  46.     в данном случае - это важнее DRY принципа
  47.     если есть простое решение - надо выбрать простое)
  48.  
  49.     3 однострочных метода без параметров - проще
  50.         чем один метод с параметром и возможностью передать не то
  51.         чем один метод с параметром + кучей дополнительного - для гарантий правильного использования
  52.  
  53.     почитай в faq  - разделы про KISS & DRY
  54.     https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.8bflixemdgfw
  55.  
  56.     еще про это будет - в следующих видео
  57. */
  58. **********************************************************
  59.         add("Task 1");
  60.         edit("Task 1", "Task 1 edited");
  61.         delete("Task 1 edited");
  62.         assertAreNoTasks();
  63.         /*
  64.             хорошо использовал неявные проверки)
  65.             если тексты тасок будут лаконичнее - воспринимать будет легче
  66.             см ниже
  67.         */
  68.         add("a");
  69.         edit("a", "a edited");
  70.         delete("a");
  71.         assertAreNoTasks();
  72.         /*
  73.             еще момент)
  74.             не торопись удалять таску)
  75.             она тебе пригодится
  76.  
  77.             отложи удаление таски на конец сценария
  78.             так тебе меньшее количество тасок придется создавать
  79.         */
  80. ************************************************************************
  81.  
  82.         add("Task 2");
  83.         assertTasksAre("Task 2");
  84.  
  85.         // Filter "Active"
  86.         openTab("Active");
  87.         $("li a.selected").shouldHave(text("Active"));
  88.         cancelEdit("Task 2", "Task 2 edited");
  89.         toggle("Task 2");
  90.         $$("li .active").shouldHave(size(0));
  91. /*
  92.     про переход на другой фильтр
  93.  
  94.         состояние перед переходом на active =
  95.         в списке - "Task 2"
  96.  
  97.         после перехода - то же самое
  98.  
  99.         с одной стороны, это верно - все автивные таски видимы на Active фильтре
  100.         и можно решить - что переход на фильтр работает корректно
  101.  
  102.         с другой стороны - состояние списка не изменилось
  103.         в таком случае - так все и будет - если переход на фильтр работает с ошибками
  104.  
  105.         т е - чтобы точно проверить фильтеринг - нужно - чтобы
  106.         состояние списка - было-стало - отличалось
  107.  
  108.         например
  109.         на all
  110.         закомплитили таску
  111.         было = в списке тасок таска отображается
  112.         перешли на active
  113.         стало = в списке тасок таска не отображается
  114.  
  115.         и закомпличивание допроверили
  116.         и переход на фильтр
  117.  
  118.     проверка $("li a.selected").shouldHave(text("Active"));
  119.         это проверка не логики, не функциональная проверка
  120.         а проверка user interface
  121.         на этом уровне тестирования неэффективно выполнять такие проверки
  122.         про такого рода вещи было в прошлом видео, примерно с  58-ой минуты
  123.  
  124.     то же относится к проверке
  125.     $$("li .active").shouldHave(size(0));
  126.         нам нужна точная функциональная проверка -
  127.         нам надо проверить -
  128.             что тексты видимых тасок - такие-то
  129.             или что в списке - нет видимых тасок
  130.         так мы четко проверим логику - на active фильтре отображаются только активные таски
  131.         мы знаем - какие таски должны быть в списке - мы же писали этот сценарий
  132.         потому такая простая проверка - обеспечит проверку логики приложения
  133.  
  134.     см http://joxi.ru/l2ZNaR0F83gJv2
  135.         на active & completed фильтрах - таски по-прежнему есть в списке
  136.         только - некоторые из них не видимы - если статус таски не соотвествует фильтру
  137.         таким образом, отфильтровав таски по visible - можно проверить тексті видиміх тасок
  138.  
  139.     не строй других независимых селекторов для списка тасок или таски из списка
  140.         отталкивайся от уже существующей переменной tasks
  141.         и получай то, что тебе нужно
  142.         это будет и нагляднее, и более DRY
  143.  
  144.         например
  145.         $$("li .active") - хуже, чем
  146.         tasks.filter(cssClass("active"))
  147.         так мы видим - что оперируем списком тасок
  148.         и так у нас меньше независимых селекторов
  149.  
  150.     еще момент
  151.          я бы добавляла вторую таску уже на active фильтре
  152.          так мы чуть равномернее распределим операции по разным фильтрам
  153. */
  154. ***************************************
  155.         // Filter "Completed"
  156.         openTab("Completed");
  157.         $("li a.selected").shouldHave(text("Completed"));
  158.         /*
  159.             см мои замечания выше - не нужна такая проверка
  160.         */
  161.         assertTasksAre("Task 2");
  162.         toggleAll();
  163.         // Добавить проверку для ToggleAll
  164.         /*
  165.             покрывать reopen all в этом тест-методе - не стоит
  166.             reopen all - не высокоприоритетная операция
  167.             ее не стоит покрывать в рамках smoke coverage
  168.  
  169.             а вот reopen - стоит покрыть
  170.             это и высокоприоритетная операция, и тут это покрыть будет не сложно
  171.  
  172.             что касается проверки - то же самое, что и для active фильтра
  173.             тут только закомпличеные таски отображаются
  174.  
  175.             проверив тексты видимых тасок
  176.             или что видимых тасок нет
  177.             можно проверить логику = только закомпличеные таски отображаются на Completed фильтре
  178.         */
  179. ********************************************************************
  180.         // Filter "All"
  181.         openTab("All");
  182.         $("li a.selected").shouldHave(text("All"));
  183.         /*
  184.             писала про такого рода проверки
  185.  
  186.             это уже для общего развития
  187.                 заметь, $("li a.selected") - повторялся трижды
  188.                 в таких случаях $("li a.selected") выносят в переменную
  189.                 или в метод ($("li a.selected").shouldHave(text(...));)
  190.                 https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#heading=h.pk1xvngaj4rk
  191.  
  192.              после перехода на all - не хватает проверки списка тасок
  193.              следующая операция add("Task 3"); - не проверяет состояние списка
  194.         */
  195.         add("Task 3");
  196.         $("#todo-count").shouldHave(text("2 items left"));
  197.         /*
  198.             этой проверки - недостаточно для проверки add("Task 3");
  199.             после add("Task 3"); - нужна проверка текстов тасок
  200.  
  201.             а проверку счетчика активных тасок - вынеси в отдельный метод
  202.             и проверяй лишь число - сколько items left
  203.             для этого - надо уточнить селектор
  204.             также надо уточнить проверку -
  205.                 чтобы в случае если отображается - 10 items left
  206.                 не проходила проверка  - что 1 items left
  207.         */
  208.         toggleAll();
  209.         clearCompleted();
  210.         assertAreNoTasks();
  211.         /*
  212.             да, за исключением reopen vs reopen all - покрыл все высокоприоритетное
  213.  
  214.             но - обрати внимание - гораздо больше операций покрыто на all
  215.             лучше распределить операции по фильтрам поравномернее
  216.             так мы получим более качественный фидбек - что на всех фильтрах операции над тасками выполняются
  217.  
  218.             если
  219.                 delete отложить на самый финиш
  220.                 complete all покрыть еще до перехода на active фильтр
  221.                 на completed фильтре покрыть reopen и clear Completed
  222.  
  223.                     то мы лучше проверим переход на active фильтр
  224.                     разгрузим all
  225.                     и сэкономим на создании тасок - нам хватит 2-ух тасок на весь сценарий
  226.         */
  227.  ******************************************
  228.     ElementsCollection tabs = $$("#filters>li");
  229.     /*
  230.         без переменной можно обойтись
  231.     */
  232.     private void openTab(String tabText){
  233.         tabs.findBy(exactText(tabText)).click();
  234.     }
  235.     /*
  236.         Для более наглядного кода - используй $(By.linkText(...))
  237.     */
  238. *************************************
  239.     public void edit(String oldTaskText, String newTaskText){
  240.         tasks.findBy(exactText(oldTaskText)).doubleClick();
  241.         $(".editing").$(".edit").setValue(newTaskText).pressEnter();
  242.     }
  243.  
  244.     public void cancelEdit(String oldTaskText, String newTaskText){
  245.         tasks.findBy(exactText(oldTaskText)).doubleClick();
  246.         $(".editing").$(".edit").setValue(newTaskText).pressEscape();
  247.     }
  248. /*
  249.     $(".editing").$(".edit") - это таска в режиме редактирования
  250.     как писала выше - грамотнее оттолкнуться от переменной tasks
  251.  
  252.     tasks.findBy(...) - получили таску в режиме редактирования ( с классом  editing)
  253.     tasks.findBy(...).$(".edit") - получили внутренний элемент редактируемой таски .edit
  254.  
  255.     посмотри на код этих методов
  256.     повторяется все, кроме .pressEnter(); или .pressEscape();
  257.    
  258.     реализуй метод SelenideElement xxx(String oldTaskText, String newTaskText)
  259.     котррый делает эти повторяющиеся действия
  260.     и возвращает элемент для ввода нового текста таски
  261.    
  262.     чтобы вызывать этот метод xxx("a", "a edited").pressEnter()
  263.    
  264.     подумай над именем такого метода
  265.     это старт/начало редактирования
  266.    
  267.    
  268. */
Advertisement
Add Comment
Please, Sign In to add comment