julia_v_iluhina

Untitled

Oct 12th, 2016
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.04 KB | None | 0 0
  1. public class GivenHelpers {
  2. ...
  3.     public static class Task {
  4.  
  5.         private String name;
  6.         private TaskStatus status;
  7.  
  8.         public Task(TaskStatus status, String name) {
  9.  
  10.             this.name = name;
  11.             this.status = status;
  12.         }
  13.     /*
  14.         вот это - да, верно
  15.         конструктор и поля соответсвующие
  16.         это функциональность класса Task
  17.  
  18.         ну и хорошо - что расположил его внутри GivenHelpers
  19.  
  20.         первый вопрос - почему внутри GivenHelpers не расположил класс TaskStatus?
  21.         (аналогично тому, как поступил с классом Task)
  22.     */
  23.  
  24.         public static List<Task> build(TaskStatus taskStatus, String... taskNames)
  25.     /*
  26.         второй вопрос - что делает метод build внутри класса Task?
  27.         Task - это информация об одной таске, а метод - работает не для одной таски
  28.  
  29.         реализуй метод build как статический метод класса  GivenHelpers
  30.         так будет грамотнее с точки зрения Single Responsibility Principle
  31.     */
  32. ********************************************************
  33.     public static void given(){
  34.  
  35.         ensureURL();
  36.         Selenide.executeJavaScript("localStorage.clear()");
  37.         Selenide.refresh();
  38.     }
  39.  
  40.     public static void given(List<Task> tasks, String navigateToFilter) {
  41. /*
  42.     а почему ты не послушался моих советов в прошлом ревью?
  43.     строки 43-68 - перечитай еще раз
  44.  
  45.     я не могу для такой реализации увидеть - как лаконично вызвать гивен-метод,
  46.     создающий первую активную таску, а вторую - закомпличеную
  47.  
  48.     примеров таких тест-методов в проекте тоже не увидела...
  49.  
  50.     да и для вариантов вызовов, описанных в строках 65-68 прошлого ревью
  51.     понадобился один гивен-метод и 2 build-метода (1 - возвращающий массив, 2 - возвращающий одну таску)
  52.  
  53.     а в такой реализации
  54.         нам пришлось реализовывать специальный гивен-метод для варианта given()
  55.         нет возможности написать простой код = добавить несколько тасок в разных статусах
  56.         и это еще мы про параметр String navigateToFilter не говорили )
  57. */
  58.         if (navigateToFilter.equals("All")) {
  59.             filterAll();
  60.  
  61.         } else if (navigateToFilter.equals("Active")) {
  62.             filterActive();
  63.  
  64.         } else if (navigateToFilter.equals("Completed")) {
  65.             filterCompleted();
  66.         }
  67. /*
  68.     пейдж-объект (PageObject) - это такой объект, который содержит вспомогательные методы для реализации
  69.     шагов и проверок в тест-методе, а также полезные переменные-локаторы для элементов или коллекций элементов
  70.  
  71.     и тут мы начинаем использовать методы пейджа - не как методы пейджа-объекта -
  72.     а как статические методы класса пейджа...
  73.  
  74.     тут ты опять немного предвосхитил идеи, которые еще рассмотрим на курсе, что на самом деле круто)
  75.     но тут - у нас получился бардак)
  76.  
  77.     получается - что класс TaskManagerPage - это уже не только класс для создания пейджа-объекта
  78.     но и контейнер для статических вспомогательных методов...
  79.     опять - нарушаем Single Responsibility Principle )
  80.     а это плохо
  81.     прежде всего потому - что слишком непросто все становится)
  82.     мы структурируем все в проекте - чтобы упростить)
  83.     а у нас в данном случае - наоборот - усложнение произошло
  84.  
  85.     идея использовать методы класса пейджа - как статические - сама по себе не плохая
  86.     она красивая и простая
  87.     но - эту идею сочетать еще и с тем, чтобы использовать этот же класс - как класс пейджа-объекта -
  88.     вот этого делать не стоит)
  89.  
  90.     это раз)
  91.  
  92.     второе - вспомни - почему мы не стали городить метод filter(String filterName)
  93.     а сделали 3 таких метода
  94.     вспомни - вот это
  95.     https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.8bflixemdgfw
  96.  
  97.     потому и идея с вот таким кодом
  98.      if ...
  99.      else if ...
  100.      else if ...
  101.  
  102.     тоже далеко не KISS )
  103.  
  104.     да и использовать параметр  navigateToFilter строкового типа - тоже не очень идея)
  105.     т к я могу вызвать этот метод
  106.     не так    given(build(ACTIVE, "a"), "Completed");
  107.     а вот так given(build(ACTIVE, "a"), "completed");
  108.     ну или еще как-то строчку переврать
  109.     и получим - ерунду...
  110.  
  111.     в общем - эта версия имеет серьезные недостатки)
  112.  
  113.     теперь - дочитай до конца ревью, и потом уже решай что будешь делать)
  114.  
  115.     если хочется гивен-метод держать только в классе GivenHelpers
  116.     и реализовать при этом лишь один гивен метод
  117.     то тебе нужен
  118.         given(Filter filter, Tasks... tasks)
  119.     где  Filter - это enum (тоже в GivenHelpers его расположи)
  120.     про второй параметр - должно быть уже понятно )
  121.     и реализовывать в таком гивен-методе переходы по фильтрам - стоит через открытие нужного тебе урла
  122.  
  123.     вот это - математически красивый вариант, когда можно все свернуть к одному гивену
  124.     но - у него есть серьезные недостатки тоже)
  125.  
  126.     в нашем приложении todoMVC есть недостаток
  127.     при открытии урла есть небольшой период времени
  128.     когда элементы приложения уже доступны
  129.     но еще не работают как следует - т к не догрузились джаваскрипты
  130.     и вот если браузер слишком шустрый (как например хром),
  131.     или гивен-методы написаны слишком оптимально
  132.     (работают быстрее, чем вот этот небольшой период времени - до загрузки джаваскриптов)
  133.     то мы начинаем выполнять тестовые действия на фоне еще нормально не работающих джаваскриптов
  134.     и тогда - придется еще и эту задачку решать) - как сделать тесты надежными )
  135.  
  136.     описала все это - больше для общего развития
  137.     пробовать так реализовать или нет - решать тебе )
  138.  
  139.     в прошлом ревью - описан годный стабильный KISS вариант )
  140.  
  141.     если хочется экспериментов - дерзай, почему нет)
  142.     заодно обсудим - какие костыли для решения новой проблемы применить)
  143.  
  144.     еще можно написать и вот так
  145.     given().build() - ни одной таски
  146.     given().activeTasks("a","b","c").completedTasks("d", "e").atAllFilter().build() - разные таски на таком-то фильтре
  147.     ну и такие цепочки given()......build() - можно разные делать - в зависимости от потребностей
  148.     Использовать такой given() - просто - т к достаточно сложно ошибиться
  149.     и мы варьируем только тексты тасок, остальное - задается вызовами нужных методов
  150.     и заканчивается такая цепочка  - вызовом build()
  151.  
  152.     для действительно сложных предварительных действий
  153.     (сложных = когда много разных вариантов и разных параметров)
  154.     это хороший способ
  155.  
  156.     но - есть и свои НО
  157.         использовать такой гивен - просто )
  158.         а вот реализовать его - уже не так просто)
  159.  
  160.         в алюр-репорте - надо еще подумать, что сделать, чтобы красиво и полезно такое отражать
  161.  
  162.         поэтому - в нашем достаточно простом случае - я бы точно не стала делать вот  так
  163.         а в сложных случаях - это может быть оправдано
  164.  
  165.         чтобы добиться такого кода - надо применить pattern builder
  166.         вот тут неплохо расписано
  167.         https://jlordiales.wordpress.com/2012/12/13/the-builder-pattern-in-practice/
  168.  
  169.     итого - сухой остаток
  170.  
  171.         фактически - мы выбираем между
  172.  
  173.         простым(KISS) и надежным решением
  174.         да, мы реализуем несколько методов given
  175.         но все они - будут очень простыми и фактически - будут переиспользовать один и тот же алгоритм
  176.  
  177.         и вариантами с красивым и более сложным кодом
  178.         да, вроде как методов - меньше
  179.         а кода - больше и он сложнее
  180.         хотя конечно снаружи - все элегантно)))
  181.  
  182.         вопрос - а стоило оно того - тратить больше времени на более сложный код?
  183.         да, мы "сверкнули ярким опереньем", это да, мы крутые)
  184.         а если время пересчитать на деньги? )
  185.  
  186.     настаивать ни на каком варианте не буду
  187.     реши сам - какое решение лучше отвечает твоим личным целям)
  188.     в любом случае - помогу довести его до ума)
  189.  
  190.     с практической точки зрения - для данного приложения вполне достаточно варианта,
  191.     который я описала в прошлый раз
  192. */
  193.  
  194. /*
  195.     смотри прошлое ревью еще
  196.     далеко не все подправил
  197. */
Advertisement
Add Comment
Please, Sign In to add comment