Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package ua.net.itlabs.hometask;
- import com.codeborne.selenide.Condition;
- import org.junit.Test;
- import static com.codeborne.selenide.CollectionCondition.*;
- import static com.codeborne.selenide.Selenide.*;
- /**
- * Created by Lia on 9/30/16.
- */
- public class TodosMVCTest {
- @Test
- public void tasksLifecycle(){
- open("https://todomvc4tasj.herokuapp.com/");
- createTasks(4);
- /*
- не скрывай внутри вспомогательного метода - тестовые данные
- правильно -
- createTasks("task1", "task2", "task3", "task4");
- дальше мы рассмотрим - как такой метод реализовать
- можно пока не торопиться
- или
- createTasks("task1");
- createTasks("task2");
- createTasks("task3");
- createTasks("task4");
- а так - ты уже и сейчас сможешь переписать
- преимущество такого подхода
- глядя на код тест-метода - сразу ясно все - с какими данными работаем
- ничего не надо ходить внутрь вспомогательных методов смотреть
- из кода тест-метода - в общем и так все понятно
- и второе - что вспомогательные методы более универсальные
- допустим - надо создать таску не task1, а task2, причем единственную?
- */
- $$("#todo-list li").shouldHave(exactTexts("task1", "task2", "task3", "task4"));
- deleteTask(2);
- /*
- пока - такой вариант = ок
- мы тут - не зашили внутрь метода работу с тестовыми даными
- мы просто выбираем таску по порядковому номеру
- это ок
- потом - после следующего видео - сможешь этот метод переписать
- deleteTask("task2");
- но это потом будет
- пока твой вариант ок
- */
- $$("#todo-list li").shouldHave(exactTexts("task1", "task3", "task4"));
- makeTaskComleted(3);
- /*
- можно назвать это действие попроще - complete
- но - на самом деле - тут задачка немного глубже...
- ниже напишу про это
- */
- $$("#todo-list .completed").shouldHave(size(1));
- /*
- если тут контролировать - у каких тасок в списке есть класс completed
- то лучше проверять у этих тасок тексты - так будет точнее
- ну и селектор "#todo-list .completed"
- лучше уточнить "#todo-list li.completed"
- потом - будет понятнее - почему
- а пока - идем от общего к частному
- причем - однородные селекторы используем
- #todo-list li - список тасок
- #todo-list li.completed - закомпличеные таски
- */
- clearComletedTask();
- /*
- слово Com--p--lete
- букву пропустила
- обрати внимание - ошибки в спеллинге в IntelIJ Idea
- подчеркиваются зеленой волнистой линией
- */
- $$("#todo-list li").shouldHave(exactTexts("task1", "task3"));
- makeTaskComleted(1);
- makeTaskComleted(2);
- /*
- это надо выполнить по-другому
- тут имелось в виду - другое действие
- с использованием вот этого переключателя
- http://joxi.ru/p275M9zs0eBkVr
- перепиши этот кусок кода
- */
- $$("#todo-list .completed").shouldHave(size(2));
- /*
- тут - аналогично - как и после закомпличивания таски2
- откорректируй проверку
- на самом деле - еще поговорим про такого рода проверки
- только позже))
- пока - вот так поправь
- */
- clearComletedTask();
- $("#todo-list").shouldBe(Condition.empty);
- /*
- а тут интересно )
- $("#todo-list") - это элемент, а не коллекция
- и проверка $("#todo-list").shouldBe(Condition.empty); =
- проверить что в элементе значение равно пусто и текст равен пусто
- а тут нажо бы - проверить - что в списке "#todo-list li" - нету элементов
- надо работать с коллекцией
- $$("#todo-list li").shouldHave(size(0))
- или
- $$("#todo-list li").shouldBe(empty)
- это empty - CollectionCondition.empty
- а не Condition.empty
- и CollectionCondition.empty - это синоним проверки на size(0)
- а shouldBe - синоним shouldHave
- просто вариант $$("#todo-list li").shouldBe(empty) - наглядный и лаконичный результат
- а вообще - оба варианта технически верны
- */
- }
- private void createTasks(int num){
- /*
- про реализацию - выше писала
- */
- for (int i = 0; i < num; i++) {
- $("#new-todo").setValue("task" + (i+1)).pressEnter();
- $$("#todo-list li").contains(texts("task" + (i+1)));\
- /*
- вот это - $$("#todo-list li").contains -
- определяет - есть ли в коллекции $$("#todo-list li")
- элемент texts("task" + (i+1))
- как ты понимаешь - нету)
- и этот contains - просто возвращает true or false = да или нет
- т е - не является проверкой
- ты после createTasks - делаешь проверку
- $$("#todo-list li").shouldHave(exactTexts("task1", "task3", "task4"));
- ее достаточно и та проверка - правильная
- и правильно - что она не в этом методе (который служит для реализации действия)
- а в самом тест-методе(мы видим и действия, и проверки)
- как работает exactTexts
- проверяется количество, порядок и тексты
- количество переданных текстов - должно соотвествовать количеству элементов коллекции
- и далее - попарно проверяются тексты элементов на соотвестствие переданному тексту
- нулевой - с нулевым
- первый - с первым
- а эта операция $$("#todo-list li").contains(texts("task" + (i+1)))
- - не верно реализованная и не нужная проверка
- */
- }
- $$("#todo-list li").shouldHave(size(num));
- /*
- и эта проверка - не нужна
- мы после createTasks проверку делаем, и она ОК, ее достаточно
- вообще - без нужды не нужно в методы-действия внедрять проверки
- так мы скрываем тестовую логику
- а этого делать не надо)
- более того - эта проверка вредна
- например, если до вызова createTasks
- уже были таски в списке )
- */
- }
- private void deleteTask(int i){
- /*
- лучше называть параметры методов - более точно
- https://google.github.io/styleguide/javaguide.html#s5.2.6-parameter-names
- тут подошел бы вариант
- index, nth
- */
- $("#todo-list li:nth-of-type(" + i + ")").click();
- /*
- нам не нужно кликать
- достаочно навести мышку на таску - это метод hover
- */
- $("#todo-list li:nth-of-type(" + i + ") .destroy").click();
- }
- private void makeTaskComleted(int i){
- /*
- попробуй метод вызвать для закомпличеной таски
- он ее не закомплилит, а переоткроет
- попробуй учесть вот это
- https://docs.google.com/document/d/10qSwWTQ6pGfVZSwOes-1QSmdflMiGD2U_y53VHq2m20/edit#bookmark=kix.x92tktmmfsz2
- */
- $("#todo-list li:nth-of-type(" + i + ") .toggle").click();
- }
- private void clearComletedTask(){
- $("#clear-completed").click();
- }
- *********************************
- сравни со своим кодом )
- open("https://todomvc4tasj.herokuapp.com/");
- create("task1");
- create("task2");
- create("task3");
- create("task4");
- $$("#todo-list li").shouldHave(exactTexts("task1", "task2", "task3", "task4"));
- delete(2);
- $$("#todo-list li").shouldHave(exactTexts("task1", "task3", "task4"));
- xxx(3); ///подумай над именем метода)
- $$(...).shouldHave(...);
- clearCompleted();
- $$("#todo-list li").shouldHave(exactTexts("task1", "task3"));
- xxxAll();//тут - тоже придется над именем метода подумать) та же ситуация что и с xxx
- $$(...).shouldHave(...);
- clearCompleted();
- $$(...).shouldHave(...);
- /*
- я про имена методов и про использование пропусков строк)
- пропуски строк - делят код на блоки логические
- и код легче воспринимается
- а из имен методов-действий - я предлагаю убрать Task
- т к работаем - только с тасками
- */
Advertisement
Add Comment
Please, Sign In to add comment