Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class GivenHelpers {
- ...
- public static class Task {
- private String name;
- private TaskStatus status;
- public Task(TaskStatus status, String name) {
- this.name = name;
- this.status = status;
- }
- /*
- вот это - да, верно
- конструктор и поля соответсвующие
- это функциональность класса Task
- ну и хорошо - что расположил его внутри GivenHelpers
- первый вопрос - почему внутри GivenHelpers не расположил класс TaskStatus?
- (аналогично тому, как поступил с классом Task)
- */
- public static List<Task> build(TaskStatus taskStatus, String... taskNames)
- /*
- второй вопрос - что делает метод build внутри класса Task?
- Task - это информация об одной таске, а метод - работает не для одной таски
- реализуй метод build как статический метод класса GivenHelpers
- так будет грамотнее с точки зрения Single Responsibility Principle
- */
- ********************************************************
- public static void given(){
- ensureURL();
- Selenide.executeJavaScript("localStorage.clear()");
- Selenide.refresh();
- }
- public static void given(List<Task> tasks, String navigateToFilter) {
- /*
- а почему ты не послушался моих советов в прошлом ревью?
- строки 43-68 - перечитай еще раз
- я не могу для такой реализации увидеть - как лаконично вызвать гивен-метод,
- создающий первую активную таску, а вторую - закомпличеную
- примеров таких тест-методов в проекте тоже не увидела...
- да и для вариантов вызовов, описанных в строках 65-68 прошлого ревью
- понадобился один гивен-метод и 2 build-метода (1 - возвращающий массив, 2 - возвращающий одну таску)
- а в такой реализации
- нам пришлось реализовывать специальный гивен-метод для варианта given()
- нет возможности написать простой код = добавить несколько тасок в разных статусах
- и это еще мы про параметр String navigateToFilter не говорили )
- */
- if (navigateToFilter.equals("All")) {
- filterAll();
- } else if (navigateToFilter.equals("Active")) {
- filterActive();
- } else if (navigateToFilter.equals("Completed")) {
- filterCompleted();
- }
- /*
- пейдж-объект (PageObject) - это такой объект, который содержит вспомогательные методы для реализации
- шагов и проверок в тест-методе, а также полезные переменные-локаторы для элементов или коллекций элементов
- и тут мы начинаем использовать методы пейджа - не как методы пейджа-объекта -
- а как статические методы класса пейджа...
- тут ты опять немного предвосхитил идеи, которые еще рассмотрим на курсе, что на самом деле круто)
- но тут - у нас получился бардак)
- получается - что класс TaskManagerPage - это уже не только класс для создания пейджа-объекта
- но и контейнер для статических вспомогательных методов...
- опять - нарушаем Single Responsibility Principle )
- а это плохо
- прежде всего потому - что слишком непросто все становится)
- мы структурируем все в проекте - чтобы упростить)
- а у нас в данном случае - наоборот - усложнение произошло
- идея использовать методы класса пейджа - как статические - сама по себе не плохая
- она красивая и простая
- но - эту идею сочетать еще и с тем, чтобы использовать этот же класс - как класс пейджа-объекта -
- вот этого делать не стоит)
- это раз)
- второе - вспомни - почему мы не стали городить метод filter(String filterName)
- а сделали 3 таких метода
- вспомни - вот это
- https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.8bflixemdgfw
- потому и идея с вот таким кодом
- if ...
- else if ...
- else if ...
- тоже далеко не KISS )
- да и использовать параметр navigateToFilter строкового типа - тоже не очень идея)
- т к я могу вызвать этот метод
- не так given(build(ACTIVE, "a"), "Completed");
- а вот так given(build(ACTIVE, "a"), "completed");
- ну или еще как-то строчку переврать
- и получим - ерунду...
- в общем - эта версия имеет серьезные недостатки)
- теперь - дочитай до конца ревью, и потом уже решай что будешь делать)
- если хочется гивен-метод держать только в классе GivenHelpers
- и реализовать при этом лишь один гивен метод
- то тебе нужен
- given(Filter filter, Tasks... tasks)
- где Filter - это enum (тоже в GivenHelpers его расположи)
- про второй параметр - должно быть уже понятно )
- и реализовывать в таком гивен-методе переходы по фильтрам - стоит через открытие нужного тебе урла
- вот это - математически красивый вариант, когда можно все свернуть к одному гивену
- но - у него есть серьезные недостатки тоже)
- в нашем приложении todoMVC есть недостаток
- при открытии урла есть небольшой период времени
- когда элементы приложения уже доступны
- но еще не работают как следует - т к не догрузились джаваскрипты
- и вот если браузер слишком шустрый (как например хром),
- или гивен-методы написаны слишком оптимально
- (работают быстрее, чем вот этот небольшой период времени - до загрузки джаваскриптов)
- то мы начинаем выполнять тестовые действия на фоне еще нормально не работающих джаваскриптов
- и тогда - придется еще и эту задачку решать) - как сделать тесты надежными )
- описала все это - больше для общего развития
- пробовать так реализовать или нет - решать тебе )
- в прошлом ревью - описан годный стабильный KISS вариант )
- если хочется экспериментов - дерзай, почему нет)
- заодно обсудим - какие костыли для решения новой проблемы применить)
- еще можно написать и вот так
- given().build() - ни одной таски
- given().activeTasks("a","b","c").completedTasks("d", "e").atAllFilter().build() - разные таски на таком-то фильтре
- ну и такие цепочки given()......build() - можно разные делать - в зависимости от потребностей
- Использовать такой given() - просто - т к достаточно сложно ошибиться
- и мы варьируем только тексты тасок, остальное - задается вызовами нужных методов
- и заканчивается такая цепочка - вызовом build()
- для действительно сложных предварительных действий
- (сложных = когда много разных вариантов и разных параметров)
- это хороший способ
- но - есть и свои НО
- использовать такой гивен - просто )
- а вот реализовать его - уже не так просто)
- в алюр-репорте - надо еще подумать, что сделать, чтобы красиво и полезно такое отражать
- поэтому - в нашем достаточно простом случае - я бы точно не стала делать вот так
- а в сложных случаях - это может быть оправдано
- чтобы добиться такого кода - надо применить pattern builder
- вот тут неплохо расписано
- https://jlordiales.wordpress.com/2012/12/13/the-builder-pattern-in-practice/
- итого - сухой остаток
- фактически - мы выбираем между
- простым(KISS) и надежным решением
- да, мы реализуем несколько методов given
- но все они - будут очень простыми и фактически - будут переиспользовать один и тот же алгоритм
- и вариантами с красивым и более сложным кодом
- да, вроде как методов - меньше
- а кода - больше и он сложнее
- хотя конечно снаружи - все элегантно)))
- вопрос - а стоило оно того - тратить больше времени на более сложный код?
- да, мы "сверкнули ярким опереньем", это да, мы крутые)
- а если время пересчитать на деньги? )
- настаивать ни на каком варианте не буду
- реши сам - какое решение лучше отвечает твоим личным целям)
- в любом случае - помогу довести его до ума)
- с практической точки зрения - для данного приложения вполне достаточно варианта,
- который я описала в прошлый раз
- */
- /*
- смотри прошлое ревью еще
- далеко не все подправил
- */
Advertisement
Add Comment
Please, Sign In to add comment