julia_v_iluhina

Untitled

Oct 16th, 2016
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 15.27 KB | None | 0 0
  1. public class Helpers {
  2. /*
  3.     я бы назвала такой класс GivenHelpers
  4.     и разместила его в пекедже helpers - чтобы отделить его от тест-классов и его предков
  5. */
  6.  
  7.     public static void given(String... taskTexts) {
  8.         if (!url().equals("https://todomvc4tasj.herokuapp.com/")) {
  9.             open("https://todomvc4tasj.herokuapp.com/");
  10.         }
  11.         /*
  12.             полезно )
  13.             пока - просто фиксируем факты
  14.             уже в given - открываем нужный нам урл
  15.             да еще и только тогда - когда это нужно)
  16.         */
  17.         Selenide.executeJavaScript("localStorage.clear()");
  18.         /*
  19.             ниже - мы прописываем в localStorage.setItem('todos-troopjs','[...]');
  20.             и это диктует - какие таски у нас будут
  21.  
  22.             а раз так - раз мы устанавливаем в локал сторидже нужное значение
  23.             нам перед этим - не нужно очищать локалсторидж
  24.  
  25.             в faq есть пара полезных линок по локалсториджу
  26.             https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#heading=h.nr48ri12nk2l
  27.         */
  28.  
  29.         String queryToExecute = "localStorage.setItem('todos-troopjs','[";
  30.         String taskItem = "";
  31.  
  32.         for (String text : taskTexts) {
  33.             taskItem = taskItem + "{\"completed\":false"
  34.                     + ",\"title\":\""
  35.                     + text
  36.                     + "\"},";
  37.  
  38.         }
  39.         queryToExecute = queryToExecute + taskItem.substring(0, taskItem.length() - 1) + "]')";
  40.         /*
  41.             этот метод можно вызвать вот так
  42.             given()
  43.             для случая - когда нужна ситуация = ни одной таски
  44.             собственно при выполнении вот такой команды
  45.             localStorage.setItem('todos-troopjs','[]');
  46.             мы это и получим
  47.  
  48.             но - вот этот код
  49.             taskItem.substring(0, taskItem.length() - 1)
  50.             он рассчитан на варианты - когда хотя бы одна таска передана
  51.             тут надо немного додумать)
  52.         */
  53.         Selenide.executeJavaScript(queryToExecute);
  54.         Selenide.refresh();
  55.     }
  56.  
  57. }
  58. *********************************
  59. AtTodoMVCPageWithClearedDataAfterEachTest
  60. /*
  61.     наследуем тест-класс от AtTodoMVCPageWithClearedDataAfterEachTest
  62.  
  63.     перед запуском теста - открываем наше приложение
  64.     после - чистим локалсторидж
  65.  
  66.     а given(String... taskTexts) - уже заботится и об открытии урла,
  67.     и о содержимом локалсториджа
  68.  
  69.     гивены можно вызывать и для варианта, когда надо задать пустой список тасок
  70.     значит - можно вызывать в каждом тест-методе гивен-метод
  71.  
  72.     вот и не нужен нам код - по открытию урла в бифор-методе
  73.     и очистке локалсториджа в афтер-методе
  74.     сразу вопрос - какой предок нужен тест-классу)
  75.  
  76.     кода меньше
  77.     сущностей меньше
  78.     действий лишних меньше )
  79. */
  80. *****************************
  81. /*
  82.     следующий шаг - дореализовать этот метод)
  83.     и добавить первый параметр - в каком статусе добавить таски
  84.  
  85.     можно - для начала добавить boolean-параметр
  86.     чтобы так задавать статус добавляемых тасок
  87.     получим - given(boolean isCompleted, String... taskTexts)
  88.     вот тут уже - не надо в имени метода уточнять AllActive
  89.     т к набор параметров - вполне поясняет
  90.  
  91.     посмотрим на вызов такого метода
  92.     given(true, "a", "b")
  93.     не очень понятно - что за первый параметр)
  94.     теоретически - можно добавить константы ACTIVE=false & COMPLETED=true
  95.     тогда бы вызовы могли выглядеть так
  96.     given(COMPLETED, "a", "b")
  97.     уже лучше)
  98.     но - все равно - можно вызвать и вот так
  99.     given(true, "a", "b")
  100.     т е - сделать некрасиво - все еще можно
  101.  
  102.     лучше - использовать для такого первого параметра enum
  103.     пусть у нас будет enum TaskStatus
  104.     со значениями ACTIVE & COMPLETED
  105.     тогда - вариант given(TaskStatus taskStatus, String... taskTexts)
  106.     и тогда - в качестве первого параметра - можно будет указать только значения из этого enum
  107.     given(COMPLETED, "a", "b")
  108.     или
  109.     given(ACTIVE, "a", "b")
  110.     третьего - не дано)
  111.     т е - некрасиво - некак вызвать
  112.     и это уже очень неплохо )
  113.     ниже приведу текст про enum
  114.  
  115.     следующий этап развития - это получить такой метод
  116.     который позволит добавить несколько тасок, причем  - указывая статус для каждой таски
  117.     поскольку у таски - 2 свойства - статус и ее текст - тут мы без класса дополнительного - не обойдемся )
  118.     если у нас будет класс Task с 2-мя параметрами - статус и текст таски
  119.     то - мы сможем реализовать given(Task... tasks)
  120.     и вызывать его вот так, например
  121.     given(new Task(ACTIVE, "a"), new Task(COMPLETED, "b"))
  122.     про классы - ниже немного распишу
  123.  
  124.     если добрались до этого
  125.     то разбираемся )
  126.     вариант given(Task... tasks) - самый универсальный
  127.     значит - в методе будет жить наш алгоритм
  128.  
  129.     а в методе given(TaskStatus taskStatus, String... taskTexts)
  130.     который во многих случаях нам даст более лаконичный вызов -
  131.     а значит, такой метод нам тоже нужен )
  132.     вот в нем - уже не будем алгоритм реализовывать
  133.     а лишь вызовем универсальный метод given(Task... tasks)
  134.     тоже - ниже чуть больше подсказок будет
  135.  
  136.     в результате - получишь
  137.         given(Task... tasks) - универсальный вариант,
  138.         который будем переиспользовать во всех других дополнительных вариантах
  139.  
  140.         и первый дополнительный вариант - given(TaskStatus taskStatus, String... taskTexts)
  141.  
  142.     чтобы смочь в given(TaskStatus taskStatus, String... taskTexts)
  143.     переиспользовать given(Task... tasks)
  144.  
  145.               тебе нужно уметь преобразовывать
  146.               (TaskStatus taskStatus, String... taskTexts)
  147.               в
  148.               (Task... tasks)
  149.  
  150.               в методы с параметрами (Task... tasks) можно передавать значения-массивы (Task[] tasks)
  151.  
  152.               вот и напиши метод
  153.               возвращающий Task[]
  154.               по данным (TaskStatus taskStatus, String... taskTexts) - это будут его параметры
  155.  
  156.               таким образом
  157.               внутри
  158.               givenAtAll(TaskStatus taskStatus, String... taskTexts)
  159.  
  160.               ты сможешь вызывать
  161.               givenAtAll(xxx(taskStatus, taskTexts))
  162.  
  163.               про имя такого метода  xxx надо подумать )
  164.  
  165.     реализуй это, идя последовательно
  166.     будут сложности - спрашивай)
  167.     можно - пока это реализуется - тоже делать остановки с ревью
  168.  
  169.     дальше - подробности и подсказки
  170. */
  171.  
  172. **********************************************************
  173. /*
  174.     про enum попроще - объявили класс и его значения
  175. */
  176. public enum Day {
  177.         MONDAY,
  178.         TUESDAY,
  179.         WEDNESDAY,
  180.         THURSDAY,
  181.         FRIDAY,
  182.         SATURDAY,
  183.         SUNDAY;
  184. }
  185. /*
  186.     про enum посложнее - объявили класс и его значения
  187.     каждому значению - через вызов конструктора - задали свойство - описание
  188. */
  189. public enum Day {
  190.         MONDAY("понедельник"),
  191.         TUESDAY("вторник"),
  192.         WEDNESDAY("среда"),
  193.         THURSDAY("четверг"),//<<----------------------для каждого значения enum - вызов конструктора, фактически значение = объект класса
  194.         FRIDAY("пятница"),
  195.         SATURDAY("суббота"),
  196.         SUNDAY("воскресенье");
  197.  
  198.         String description;//<<---------------------------поле для хранения описания дня недели
  199.  
  200.         public Day(String description) {
  201.                 this.description = description;//<<---------------------------логика конструктора - запомнить для объекта его описание
  202.         }
  203.  
  204.         @Override
  205.         public String toString() {
  206.             return description;//<<---------------------------логика - вывести для объекта - то что для него заполнили
  207.         }
  208. }
  209.  
  210. /*
  211.  
  212.     все классы - потомки класса Object (enum - это тоже класс)
  213.     у Object есть метод toString()
  214.     который выполняет преобразование объекта к строке
  215.     реализовав такой метод в рамках класса SomeClass -
  216.     используя выражения типа "day is "+ Day.MONDAY
  217.     получишь строку "day is понедельник"
  218.  
  219.     toString() - можно грамотно использовать в рамках всех вспомогательных классов и enum-ов
  220.     это позволит упростить код
  221.  
  222.     конструкторы в enum-ах как раз и могут помочь решению задачи
  223.     для каждого значения enum вернуть свою строку
  224.  
  225.     попробуй применить эти подходы
  226.  
  227.     вот хороший пример
  228.     http://javarevisited.blogspot.com/2011/08/enum-in-java-example-tutorial.html
  229. */
  230. ***************************************************
  231.  
  232. /*
  233.     полезные линки про классы
  234.              http://www.tutorialspoint.com/java/java_object_classes.htm
  235.              http://www.helloworld.ru/texts/comp/lang/java/java/07.htm
  236.  
  237.              внутренние классы (нас интересуют member inner classes)
  238.              http://www.tutorialspoint.com/java/java_innerclasses.htm
  239.              http://www.quizful.net/post/inner-classes-java
  240.              http://www.javatpoint.com/java-inner-class
  241. */
  242. *******************************************
  243.  @Test
  244.     public void testCancelEditAtActive() {
  245.         //given
  246.         Helpers.given("1","2");
  247.         /*
  248.             советую использовать import static
  249.             и вызывать метод - given("1","2");
  250.         */
  251.  
  252.         filterActive();
  253.         /*
  254.             переход на нужный фильтр - это еще предварительное действие
  255.             чтобы сделать тест-методы лаконичнее - лучше реализовать
  256.             набор гивен-методов для каждого из фильтров
  257.  
  258.             ниже - будет чуть подробнее
  259.         */
  260.         cancelEdit("2", "2 edited");
  261.         assertTasksAre("1","2");
  262.         assertItemsLeft(2);
  263.     }
  264.  
  265. /*
  266.     про покрытие - делаем полное покрытие
  267.     это значит - покрываем каждую фичу на каждом контексте
  268.     и у нас будет много фиче-тестов - для каждого из фильтров
  269.     про покрытие - будет чуть ниже)
  270.  
  271.     потому - будет полезно разработать гивен-методы
  272.     в которых мы не только обеспечим набор тасок
  273.     но и еще - и переход на нужный фильтр
  274.  
  275.     например, вот такой набор был бы достаточным
  276.  
  277.              givenAtAll(Task... tasks)
  278.              givenAtActive(Task... tasks)
  279.              givenAtCompleted(Task... tasks)
  280.  
  281.              givenAtAll(TaskStatus taskStatus, String... taskTexts)
  282.              givenAtActive(TaskStatus taskStatus, String... taskTexts)
  283.              givenAtCompleted(TaskStatus taskStatus, String... taskTexts)
  284.  
  285. */
  286. *******************************
  287. /*
  288.     в этом задании - можно покрытие не оптимизировать
  289.     а можно - и оптимизировать)
  290.     в любом случае - используй тест-план - чтоб не пропустить что-то
  291.  
  292.     в чем оптимизация
  293.         - что покрыто в е2е - не покрываем фиче-тестами
  294.         - низкоприоритетное - покрываем единожды, на каком-то из контекстов (пример - delete by emptying text)
  295.         - низкоприоритетные варианты фичи, у которой есть покрытые варианты - не покрываем (пример - reopen all & add)
  296.  
  297.     еще - для тестов одной фичи (или родственных фич)
  298.         применяй разные тестовые варианты
  299.         например - работаем с единственной таской
  300.         работаем со второй таской
  301.         работаем с единственной видимой таской
  302.  
  303.     цель - максимально тщательно проверить наше приложение
  304.     учесть разные моменты и нюансы        
  305. */
Advertisement
Add Comment
Please, Sign In to add comment