Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class TodoMVCTest {
- TodoMVCPage tasks = new TodoMVCPage();
- @Test
- public void testTasksLifeCycle() {
- open("https://todomvc4tasj.herokuapp.com/");
- //All filter
- tasks.add("t1");
- tasks.editPressEnter("t1", "t1_renamed");
- /*
- имени метода edit - будет достаточно
- как мы делаем действие - будем уточнять в additional edit operations
- (когда будем покрывать их, не в этом задании)
- а про способы реализации базовых операций - мы не писали в именах методов
- это - тоже базовая операция, в ее стандартном варианте
- потому уточнений и не надо
- */
- tasks.assertItemsLeft(1);
- //complete
- tasks.toggle("t1_renamed");
- /*
- проверка?
- см строки 99, 156-170 прошлого ревью
- следующая операция - не проверяет эту
- значит - нужна явная проверка
- */
- //Active filter
- tasks.filterActive();
- /*
- все равно мне кажется - что тут комментарий лишний)
- буквально в следующей строке кода это же написано)
- */
- tasks.assertTasksAre("");
- /*
- а вот тут - не очень-то ок реализована проверка
- можно решить - что в списке тасок - должна быть одна таска с пустым текстом
- но ведь это не так)
- http://joxi.ru/l2ZNaR0F83gJv2
- надеюсь, ты это увидел)
- по-прежнему - все таски - есть в списке
- только - некоторые из них - не видимы - согласно статуса
- таким образом - если проверять тексты видимых тасок - то проверка будет корректнее
- нас ведь интересуют именно видимое - что такие-то таски видимы в списке
- Посмотри видео Якова про это -
- https://drive.google.com/file/d/0B8hgIBw8-V-AdGxxU1R3enl1RzQ/view?ts=567ab8d7
- мы можем быть максимально точными и держать 4 проверки
- 2 -
- в списке = такси с такими-то текстами
- в списке = пусто
- и еще 2 -
- в отфильтрованном по visible списке = таски с такими-то текстами
- в отфильтрованном по visible списке = пусто
- И за точность будем платить тем - что надо думать - когда какую проверку вызвать правильнее
- и если это делать бездумно - то при небольших изменениях сценариев - могут тесты падать на проверках,
- или второй вариант - не будем нормально пользоваться полученной точностью...
- мы можем исходить из того, что ошибку, когда невидимые таски копятся в списке - мы тестим на более низком уровне,
- и на UI уровне - нам не нужно до этого уточняться. Поэтому - мы будем держать всего 2 проверки
- в отфильтрованном по visible списке = таски с такими-то текстами
- в отфильтрованном по visible списке = пусто
- В таком случае - каждый раз понятно - какую проверку вызывать - получаем более KISS картину
- правда, платим за это точностью) Но - возможно - если мы уже отдельно это в тестах покрыли -
- что у нас не копятся невидимые таски - так мы и не платим ) И - тогда - все проще в написании тестов,
- и в их сопровождении.
- Тогда - поскольку обе проверки реализованы одинаково и других нету - можно из имен проверок скрыть этот нюанс
- и назвать их assertTasks и assertNoTasks (хотя в них работаем с отфильтрованным по visible списком тасок)
- подправь все проверки в тесте
- */
- tasks.add("t2");
- tasks.editPressEscape("t2", "t2_renamed");
- /*
- ну, на самом деле, это не edit
- а cancel edit
- и это существенно
- и поскольку cancel edit невозможно выполнить по-другому - можно в имени метода не уточняться до PressEscape
- также вызов будет чуть нагляднее - если тестовые данные для этого тоже использовать
- tasks.cancelEdit("t2", "t2 edit canceled");
- */
- tasks.assertTasksAre("", "t2");
- //complete all
- tasks.toggleAll();
- tasks.assertTasksAre("", "");
- //Completed filter
- tasks.filterCompleted();
- tasks.assertTasksAre("t1_renamed", "t2");
- //activate
- tasks.toggle("t1_renamed");
- /*
- следующая операция не проверяет предыдущую -
- нет точности в проверке - так мы не проверим, что таска "t1_renamed" стала не видимой
- нужна проверка списка тасок
- да и edit - уже покрыта, уже не нужно ее проверять
- стоит тут проверить состояние списка тасок и выполнить clear completed -
- чтоб разгрузить немного All фильтр
- */
- tasks.editPressEnter("t2", "t2_renamed");
- tasks.assertTasksAre("", "t2_renamed");
- //switch to All filter
- tasks.filterAll();
- /*
- комментарии перед работой на других фильтрах - были в другом формате
- еще раз советую задуматься - так ли они нужны
- ведь первая операция блока - как раз переход на фильтр
- мне кажется - это излишним
- да, я помню, ты спрашивал про это в слеке
- ну, требовать убрать эти комментарии не буду
- но я бы не стала их делать)
- после перехода на этот фильтр - у тебя 2 таски
- delete("t1_renamed") - не проверяет состояние всего списка
- значит - в таком случае нужна явная проверка
- */
- tasks.delete("t1_renamed");
- tasks.assertTasksAre("t2_renamed");
- //clear completed
- tasks.clearCompleted();
- /*
- писала выше
- советую покрыть это на Completed фильтре - так равномернее распределишь операции по фильтрам
- */
- tasks.assertTasksEmpty();
- /*
- сценарий - почти оптимальный
- всего несколько замечаний, которые не повлияют принципиально на логику е2е -
- это уже достаточно легко подправить
- */
- *************************************
- public ElementsCollection tasks = $$("#todo-list li");
- /*
- тут и такой селектор ок
- вариант точнее "#todo-list>li"
- в данном несложном приложении оба варианта ок
- часто бывает эта разница существенной
- */
- *********************************
- public ElementsCollection filters = $$("#filters li");
- public void filterAll(){
- filters.find(exactText("All")).click();
- }
- public void filterActive(){
- filters.find(exactText("Active")).click();
- }
- public void filterCompleted(){
- filters.find(exactText("Completed")).click();
- }
- /*
- еще одно следствие простоты нашего приложения
- можно в данном случае - обойтись - без filters
- просто - обращаться к линкам напрямую
- $(By.linkText(...))
- т к элементов a - вообще не много и они с разным текстом - то можно так поступить
- а в более сложных случаях - да, твой вариант верен
- на изменениях не настаиваю
- */
- ***********************
- http://joxi.ru/n2YkKaGUjLn0yr
- /*
- мне кажется это уже обсуждали )
- а может это я путаю
- зачам тут аж по 2 скобочки?
- */
- *************************
- public void assertItemsLeft(Integer count){
- String counter = count.toString();
- $("#todo-count").find("strong").shouldHave(exactText(counter));
- }
- /*
- технически верно
- можно то же, но лаконичнее реализовать
- $("#todo-count>strong").shouldHave(exactText(count.toString()));
- советую именно такой вариант
- заодно - избежим создания переменной counter
- заодно и придираться к имени переменной не буду (таки ее имя мне не нравится)
- */
- ************************************************
- public void editPressEnter(String oldTaskName, String newTaskName){
- tasks.find(exactText(oldTaskName)).doubleClick();
- $(".editing").find(".edit").setValue(newTaskName).pressEnter();
- }
- public void editPressEscape(String oldTaskName, String newTaskName){
- tasks.find(exactText(oldTaskName)).doubleClick();
- $(".editing").find(".edit").setValue(newTaskName).pressEscape();
- }
- /*
- выше - для текста таски ты использовал термин taskText
- почему для этих методов - TaskName?
- раз в остальных методах - taskText
- то и тут придерживайся той же линии
- oldTaskText и newTaskText - в твоем случае будет корректнее
- в твоем случае - т к ты ранее остановил свой выбор именно на термине taskText
- кстати, и мне он кажется более точным по сравнению с TaskName)
- про это - уже было пару ревью назад - http://pastebin.com/KXb41iNm
- еще такой момент
- что такое $(".editing").find(".edit")
- это элемент ".edit" внутри редактируемой таски внутри списка тасок
- да, твой способ получить элемент - технически верный
- но - не самый наглядный
- лучше придерживаться такого правила
- если у тебя для некой коллекции/элемента
- уже используется переменая
- и тебе нужно что-то изнутри этой коллекции/элемента
- то лучше оттолкнись от переменной = внешней коллекции/элемента
- сравни
- $(".editing").find(".edit")
- и
- tasks.findBy(....).find(".edit")
- да, чуть длиннее
- зато - четко видно - что по-прежнему работаем со списком тасок
- */
Advertisement
Add Comment
Please, Sign In to add comment