Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private void openTab(String tabText){
- tabs.findBy(exactText(tabText)).click();
- }
- ...
- openTab("Active");
- ...
- openTab("Completed");
- ...
- openTab("All");
- ...
- Я не понимаю что не так с openTab, вроде ж все просто и понятно :) ...
- /*
- Ну, если рассуждать как разработчик) - да
- твой вариант - это просто и понятно
- Единственное,как я бы обезопасила себя - и доработала твой вариант
- принимала бы параметр
- не String tabText
- а Filter filter
- где - Filter - enum (ALL, ACTIVE, COMPLETED)
- чтобы было невозможно в метод передать что-то неверное
- в результате - получила бы еще какое-то количество кода....
- для такой простой задачи - кода многовато)
- в текущей версии - возможно получить ошибку, передав неверное значение
- мы можем вызвать openTab("Al"); или openTab("All ");
- и все )
- хатка поломается)
- мы, конечно, можем завести 3 строковые константы - тексты фильтров
- и вызывать openTab(ALL) / openTab(ACTIVE)/openTab(COMPLETED)
- но - нам в этом случае никто не запретит вызвать openTab("Al")
- и снова - получили ерунду
- можно реализовать как я писала выше
- с использованием enum
- будет математически стройно
- захочешь - попробуй)
- и сравни с вариантом - когда у тебя есть 3 простіх метода без параметров -
- filterAll / filterActive / filterCompleted
- в автоматизации тестирования - особенно важно выполнение KISS принципа
- в данном случае - это важнее DRY принципа
- если есть простое решение - надо выбрать простое)
- 3 однострочных метода без параметров - проще
- чем один метод с параметром и возможностью передать не то
- чем один метод с параметром + кучей дополнительного - для гарантий правильного использования
- почитай в faq - разделы про KISS & DRY
- https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.8bflixemdgfw
- еще про это будет - в следующих видео
- */
- **********************************************************
- add("Task 1");
- edit("Task 1", "Task 1 edited");
- delete("Task 1 edited");
- assertAreNoTasks();
- /*
- хорошо использовал неявные проверки)
- если тексты тасок будут лаконичнее - воспринимать будет легче
- см ниже
- */
- add("a");
- edit("a", "a edited");
- delete("a");
- assertAreNoTasks();
- /*
- еще момент)
- не торопись удалять таску)
- она тебе пригодится
- отложи удаление таски на конец сценария
- так тебе меньшее количество тасок придется создавать
- */
- ************************************************************************
- add("Task 2");
- assertTasksAre("Task 2");
- // Filter "Active"
- openTab("Active");
- $("li a.selected").shouldHave(text("Active"));
- cancelEdit("Task 2", "Task 2 edited");
- toggle("Task 2");
- $$("li .active").shouldHave(size(0));
- /*
- про переход на другой фильтр
- состояние перед переходом на active =
- в списке - "Task 2"
- после перехода - то же самое
- с одной стороны, это верно - все автивные таски видимы на Active фильтре
- и можно решить - что переход на фильтр работает корректно
- с другой стороны - состояние списка не изменилось
- в таком случае - так все и будет - если переход на фильтр работает с ошибками
- т е - чтобы точно проверить фильтеринг - нужно - чтобы
- состояние списка - было-стало - отличалось
- например
- на all
- закомплитили таску
- было = в списке тасок таска отображается
- перешли на active
- стало = в списке тасок таска не отображается
- и закомпличивание допроверили
- и переход на фильтр
- проверка $("li a.selected").shouldHave(text("Active"));
- это проверка не логики, не функциональная проверка
- а проверка user interface
- на этом уровне тестирования неэффективно выполнять такие проверки
- про такого рода вещи было в прошлом видео, примерно с 58-ой минуты
- то же относится к проверке
- $$("li .active").shouldHave(size(0));
- нам нужна точная функциональная проверка -
- нам надо проверить -
- что тексты видимых тасок - такие-то
- или что в списке - нет видимых тасок
- так мы четко проверим логику - на active фильтре отображаются только активные таски
- мы знаем - какие таски должны быть в списке - мы же писали этот сценарий
- потому такая простая проверка - обеспечит проверку логики приложения
- см http://joxi.ru/l2ZNaR0F83gJv2
- на active & completed фильтрах - таски по-прежнему есть в списке
- только - некоторые из них не видимы - если статус таски не соотвествует фильтру
- таким образом, отфильтровав таски по visible - можно проверить тексті видиміх тасок
- не строй других независимых селекторов для списка тасок или таски из списка
- отталкивайся от уже существующей переменной tasks
- и получай то, что тебе нужно
- это будет и нагляднее, и более DRY
- например
- $$("li .active") - хуже, чем
- tasks.filter(cssClass("active"))
- так мы видим - что оперируем списком тасок
- и так у нас меньше независимых селекторов
- еще момент
- я бы добавляла вторую таску уже на active фильтре
- так мы чуть равномернее распределим операции по разным фильтрам
- */
- ***************************************
- // Filter "Completed"
- openTab("Completed");
- $("li a.selected").shouldHave(text("Completed"));
- /*
- см мои замечания выше - не нужна такая проверка
- */
- assertTasksAre("Task 2");
- toggleAll();
- // Добавить проверку для ToggleAll
- /*
- покрывать reopen all в этом тест-методе - не стоит
- reopen all - не высокоприоритетная операция
- ее не стоит покрывать в рамках smoke coverage
- а вот reopen - стоит покрыть
- это и высокоприоритетная операция, и тут это покрыть будет не сложно
- что касается проверки - то же самое, что и для active фильтра
- тут только закомпличеные таски отображаются
- проверив тексты видимых тасок
- или что видимых тасок нет
- можно проверить логику = только закомпличеные таски отображаются на Completed фильтре
- */
- ********************************************************************
- // Filter "All"
- openTab("All");
- $("li a.selected").shouldHave(text("All"));
- /*
- писала про такого рода проверки
- это уже для общего развития
- заметь, $("li a.selected") - повторялся трижды
- в таких случаях $("li a.selected") выносят в переменную
- или в метод ($("li a.selected").shouldHave(text(...));)
- https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#heading=h.pk1xvngaj4rk
- после перехода на all - не хватает проверки списка тасок
- следующая операция add("Task 3"); - не проверяет состояние списка
- */
- add("Task 3");
- $("#todo-count").shouldHave(text("2 items left"));
- /*
- этой проверки - недостаточно для проверки add("Task 3");
- после add("Task 3"); - нужна проверка текстов тасок
- а проверку счетчика активных тасок - вынеси в отдельный метод
- и проверяй лишь число - сколько items left
- для этого - надо уточнить селектор
- также надо уточнить проверку -
- чтобы в случае если отображается - 10 items left
- не проходила проверка - что 1 items left
- */
- toggleAll();
- clearCompleted();
- assertAreNoTasks();
- /*
- да, за исключением reopen vs reopen all - покрыл все высокоприоритетное
- но - обрати внимание - гораздо больше операций покрыто на all
- лучше распределить операции по фильтрам поравномернее
- так мы получим более качественный фидбек - что на всех фильтрах операции над тасками выполняются
- если
- delete отложить на самый финиш
- complete all покрыть еще до перехода на active фильтр
- на completed фильтре покрыть reopen и clear Completed
- то мы лучше проверим переход на active фильтр
- разгрузим all
- и сэкономим на создании тасок - нам хватит 2-ух тасок на весь сценарий
- */
- ******************************************
- ElementsCollection tabs = $$("#filters>li");
- /*
- без переменной можно обойтись
- */
- private void openTab(String tabText){
- tabs.findBy(exactText(tabText)).click();
- }
- /*
- Для более наглядного кода - используй $(By.linkText(...))
- */
- *************************************
- public void edit(String oldTaskText, String newTaskText){
- tasks.findBy(exactText(oldTaskText)).doubleClick();
- $(".editing").$(".edit").setValue(newTaskText).pressEnter();
- }
- public void cancelEdit(String oldTaskText, String newTaskText){
- tasks.findBy(exactText(oldTaskText)).doubleClick();
- $(".editing").$(".edit").setValue(newTaskText).pressEscape();
- }
- /*
- $(".editing").$(".edit") - это таска в режиме редактирования
- как писала выше - грамотнее оттолкнуться от переменной tasks
- tasks.findBy(...) - получили таску в режиме редактирования ( с классом editing)
- tasks.findBy(...).$(".edit") - получили внутренний элемент редактируемой таски .edit
- посмотри на код этих методов
- повторяется все, кроме .pressEnter(); или .pressEscape();
- реализуй метод SelenideElement xxx(String oldTaskText, String newTaskText)
- котррый делает эти повторяющиеся действия
- и возвращает элемент для ввода нового текста таски
- чтобы вызывать этот метод xxx("a", "a edited").pressEnter()
- подумай над именем такого метода
- это старт/начало редактирования
- */
Advertisement
Add Comment
Please, Sign In to add comment