Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class Helpers {
- /*
- я бы назвала такой класс GivenHelpers
- и разместила его в пекедже helpers - чтобы отделить его от тест-классов и его предков
- */
- public static void given(String... taskTexts) {
- if (!url().equals("https://todomvc4tasj.herokuapp.com/")) {
- open("https://todomvc4tasj.herokuapp.com/");
- }
- /*
- полезно )
- пока - просто фиксируем факты
- уже в given - открываем нужный нам урл
- да еще и только тогда - когда это нужно)
- */
- Selenide.executeJavaScript("localStorage.clear()");
- /*
- ниже - мы прописываем в localStorage.setItem('todos-troopjs','[...]');
- и это диктует - какие таски у нас будут
- а раз так - раз мы устанавливаем в локал сторидже нужное значение
- нам перед этим - не нужно очищать локалсторидж
- в faq есть пара полезных линок по локалсториджу
- https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#heading=h.nr48ri12nk2l
- */
- String queryToExecute = "localStorage.setItem('todos-troopjs','[";
- String taskItem = "";
- for (String text : taskTexts) {
- taskItem = taskItem + "{\"completed\":false"
- + ",\"title\":\""
- + text
- + "\"},";
- }
- queryToExecute = queryToExecute + taskItem.substring(0, taskItem.length() - 1) + "]')";
- /*
- этот метод можно вызвать вот так
- given()
- для случая - когда нужна ситуация = ни одной таски
- собственно при выполнении вот такой команды
- localStorage.setItem('todos-troopjs','[]');
- мы это и получим
- но - вот этот код
- taskItem.substring(0, taskItem.length() - 1)
- он рассчитан на варианты - когда хотя бы одна таска передана
- тут надо немного додумать)
- */
- Selenide.executeJavaScript(queryToExecute);
- Selenide.refresh();
- }
- }
- *********************************
- AtTodoMVCPageWithClearedDataAfterEachTest
- /*
- наследуем тест-класс от AtTodoMVCPageWithClearedDataAfterEachTest
- перед запуском теста - открываем наше приложение
- после - чистим локалсторидж
- а given(String... taskTexts) - уже заботится и об открытии урла,
- и о содержимом локалсториджа
- гивены можно вызывать и для варианта, когда надо задать пустой список тасок
- значит - можно вызывать в каждом тест-методе гивен-метод
- вот и не нужен нам код - по открытию урла в бифор-методе
- и очистке локалсториджа в афтер-методе
- сразу вопрос - какой предок нужен тест-классу)
- кода меньше
- сущностей меньше
- действий лишних меньше )
- */
- *****************************
- /*
- следующий шаг - дореализовать этот метод)
- и добавить первый параметр - в каком статусе добавить таски
- можно - для начала добавить boolean-параметр
- чтобы так задавать статус добавляемых тасок
- получим - given(boolean isCompleted, String... taskTexts)
- вот тут уже - не надо в имени метода уточнять AllActive
- т к набор параметров - вполне поясняет
- посмотрим на вызов такого метода
- given(true, "a", "b")
- не очень понятно - что за первый параметр)
- теоретически - можно добавить константы ACTIVE=false & COMPLETED=true
- тогда бы вызовы могли выглядеть так
- given(COMPLETED, "a", "b")
- уже лучше)
- но - все равно - можно вызвать и вот так
- given(true, "a", "b")
- т е - сделать некрасиво - все еще можно
- лучше - использовать для такого первого параметра enum
- пусть у нас будет enum TaskStatus
- со значениями ACTIVE & COMPLETED
- тогда - вариант given(TaskStatus taskStatus, String... taskTexts)
- и тогда - в качестве первого параметра - можно будет указать только значения из этого enum
- given(COMPLETED, "a", "b")
- или
- given(ACTIVE, "a", "b")
- третьего - не дано)
- т е - некрасиво - некак вызвать
- и это уже очень неплохо )
- ниже приведу текст про enum
- следующий этап развития - это получить такой метод
- который позволит добавить несколько тасок, причем - указывая статус для каждой таски
- поскольку у таски - 2 свойства - статус и ее текст - тут мы без класса дополнительного - не обойдемся )
- если у нас будет класс Task с 2-мя параметрами - статус и текст таски
- то - мы сможем реализовать given(Task... tasks)
- и вызывать его вот так, например
- given(new Task(ACTIVE, "a"), new Task(COMPLETED, "b"))
- про классы - ниже немного распишу
- если добрались до этого
- то разбираемся )
- вариант given(Task... tasks) - самый универсальный
- значит - в методе будет жить наш алгоритм
- а в методе given(TaskStatus taskStatus, String... taskTexts)
- который во многих случаях нам даст более лаконичный вызов -
- а значит, такой метод нам тоже нужен )
- вот в нем - уже не будем алгоритм реализовывать
- а лишь вызовем универсальный метод given(Task... tasks)
- тоже - ниже чуть больше подсказок будет
- в результате - получишь
- given(Task... tasks) - универсальный вариант,
- который будем переиспользовать во всех других дополнительных вариантах
- и первый дополнительный вариант - given(TaskStatus taskStatus, String... taskTexts)
- чтобы смочь в given(TaskStatus taskStatus, String... taskTexts)
- переиспользовать given(Task... tasks)
- тебе нужно уметь преобразовывать
- (TaskStatus taskStatus, String... taskTexts)
- в
- (Task... tasks)
- в методы с параметрами (Task... tasks) можно передавать значения-массивы (Task[] tasks)
- вот и напиши метод
- возвращающий Task[]
- по данным (TaskStatus taskStatus, String... taskTexts) - это будут его параметры
- таким образом
- внутри
- givenAtAll(TaskStatus taskStatus, String... taskTexts)
- ты сможешь вызывать
- givenAtAll(xxx(taskStatus, taskTexts))
- про имя такого метода xxx надо подумать )
- реализуй это, идя последовательно
- будут сложности - спрашивай)
- можно - пока это реализуется - тоже делать остановки с ревью
- дальше - подробности и подсказки
- */
- **********************************************************
- /*
- про enum попроще - объявили класс и его значения
- */
- public enum Day {
- MONDAY,
- TUESDAY,
- WEDNESDAY,
- THURSDAY,
- FRIDAY,
- SATURDAY,
- SUNDAY;
- }
- /*
- про enum посложнее - объявили класс и его значения
- каждому значению - через вызов конструктора - задали свойство - описание
- */
- public enum Day {
- MONDAY("понедельник"),
- TUESDAY("вторник"),
- WEDNESDAY("среда"),
- THURSDAY("четверг"),//<<----------------------для каждого значения enum - вызов конструктора, фактически значение = объект класса
- FRIDAY("пятница"),
- SATURDAY("суббота"),
- SUNDAY("воскресенье");
- String description;//<<---------------------------поле для хранения описания дня недели
- public Day(String description) {
- this.description = description;//<<---------------------------логика конструктора - запомнить для объекта его описание
- }
- @Override
- public String toString() {
- return description;//<<---------------------------логика - вывести для объекта - то что для него заполнили
- }
- }
- /*
- все классы - потомки класса Object (enum - это тоже класс)
- у Object есть метод toString()
- который выполняет преобразование объекта к строке
- реализовав такой метод в рамках класса SomeClass -
- используя выражения типа "day is "+ Day.MONDAY
- получишь строку "day is понедельник"
- toString() - можно грамотно использовать в рамках всех вспомогательных классов и enum-ов
- это позволит упростить код
- конструкторы в enum-ах как раз и могут помочь решению задачи
- для каждого значения enum вернуть свою строку
- попробуй применить эти подходы
- вот хороший пример
- http://javarevisited.blogspot.com/2011/08/enum-in-java-example-tutorial.html
- */
- ***************************************************
- /*
- полезные линки про классы
- http://www.tutorialspoint.com/java/java_object_classes.htm
- http://www.helloworld.ru/texts/comp/lang/java/java/07.htm
- внутренние классы (нас интересуют member inner classes)
- http://www.tutorialspoint.com/java/java_innerclasses.htm
- http://www.quizful.net/post/inner-classes-java
- http://www.javatpoint.com/java-inner-class
- */
- *******************************************
- @Test
- public void testCancelEditAtActive() {
- //given
- Helpers.given("1","2");
- /*
- советую использовать import static
- и вызывать метод - given("1","2");
- */
- filterActive();
- /*
- переход на нужный фильтр - это еще предварительное действие
- чтобы сделать тест-методы лаконичнее - лучше реализовать
- набор гивен-методов для каждого из фильтров
- ниже - будет чуть подробнее
- */
- cancelEdit("2", "2 edited");
- assertTasksAre("1","2");
- assertItemsLeft(2);
- }
- /*
- про покрытие - делаем полное покрытие
- это значит - покрываем каждую фичу на каждом контексте
- и у нас будет много фиче-тестов - для каждого из фильтров
- про покрытие - будет чуть ниже)
- потому - будет полезно разработать гивен-методы
- в которых мы не только обеспечим набор тасок
- но и еще - и переход на нужный фильтр
- например, вот такой набор был бы достаточным
- givenAtAll(Task... tasks)
- givenAtActive(Task... tasks)
- givenAtCompleted(Task... tasks)
- givenAtAll(TaskStatus taskStatus, String... taskTexts)
- givenAtActive(TaskStatus taskStatus, String... taskTexts)
- givenAtCompleted(TaskStatus taskStatus, String... taskTexts)
- */
- *******************************
- /*
- в этом задании - можно покрытие не оптимизировать
- а можно - и оптимизировать)
- в любом случае - используй тест-план - чтоб не пропустить что-то
- в чем оптимизация
- - что покрыто в е2е - не покрываем фиче-тестами
- - низкоприоритетное - покрываем единожды, на каком-то из контекстов (пример - delete by emptying text)
- - низкоприоритетные варианты фичи, у которой есть покрытые варианты - не покрываем (пример - reopen all & add)
- еще - для тестов одной фичи (или родственных фич)
- применяй разные тестовые варианты
- например - работаем с единственной таской
- работаем со второй таской
- работаем с единственной видимой таской
- цель - максимально тщательно проверить наше приложение
- учесть разные моменты и нюансы
- */
Advertisement
Add Comment
Please, Sign In to add comment