julia_v_iluhina

Untitled

Sep 20th, 2016
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.97 KB | None | 0 0
  1. public static class Task {
  2.         private String taskText;
  3.         private String taskState;
  4.  
  5.         public Task(String taskText, TaskState taskState){
  6.             this.taskText = taskText;
  7.             this.taskState = taskState.toString();
  8.         }
  9. }
  10.  
  11. /*
  12.      лучше для поля taskState - использовать тип TaskState
  13.  
  14.      когда собираешь строку
  15.      "{\\\"completed\\\":" + task.taskState + ", \\\"title\\\":\\\"" + task.taskText + "\\\"}, "
  16.      и к строке будешь добавлять task.taskState типа TaskState - все ок будет
  17.      обїект класса TaskState будет преобразован к строке - согласно логике в toString()
  18.  
  19.  
  20.      мало того)
  21.      Ты можешь toString() организовать и в Task
  22.      с тем чтобы возвращать
  23.      "{\\\"completed\\\":" + task.taskState + ", \\\"title\\\":\\\"" + task.taskText + "\\\"}, "
  24.  
  25.      а в гивен-методе код упростится до - jsCode.concat(task.toString());
  26.  
  27.      работа с  toString() - на твое успотрение
  28.  
  29.      а вот тип поля   taskState - поправь)
  30.      мотивы - просты
  31.      ты всегда успеешь упростить тип до строки
  32.      не надо это делать раньше времени)
  33.      когда надо будет - тогда все до строки сведем
  34.      а до этого - удобнее оперировать изначально  спроектированными типами
  35. */
  36. ****************************
  37.     public enum TaskState {
  38. /*
  39.     тут - все ок
  40.  
  41.     все стало проще)
  42.     и это хорошо
  43. */
  44. ****************************************
  45. public static Task aTask(String taskText, TaskState taskState){
  46. /*
  47.     это - тоэе ок
  48. */
  49. ******************************************
  50.  
  51.     public static void prepareTasks(Task... tasks) {
  52.         ...
  53.         boolean flag = false;
  54.         for (Task task : tasks) {
  55.             ...
  56.             flag = true;
  57.         }
  58.         if (flag) jsCode = jsCode.substring(0, jsCode.length() - 2);
  59.         ...
  60.     }
  61.     /*
  62.         можно вместо проверки if (flag)
  63.         делать проверку if (tasks.length!=0)
  64.         и тогда не понадобится переменная flag
  65.         http://www.linkex.ru/java/varargs.php
  66.  
  67.         даже если в if-блоке - 1 команда
  68.         используй фигурные скобки
  69.         https://google.github.io/styleguide/javaguide.html#s4.1.1-braces-always-used
  70.  
  71.     */
  72. ***************************************************
  73.     src / test / java / fullCoverageWithFT / GivenHelpers.java
  74. /*
  75.     GivenHelpers - класс с универсальными методами
  76.     которые могут быть использованы в разных тест-классах (конечно, для приложения todoMVC)
  77.  
  78.     обычно универсальные классы равполагают в ветке проекта src / main/ java / ...
  79.  
  80.     поскольку сейчас в проекте - по пекеджам раздожены домашки
  81.     то
  82.         вариант 1
  83.             в src / test / java / fullCoverageWithFT - делаем пекедж helpers
  84.             и туда переносим GivenHelpers
  85.         вариант 2
  86.              в src / main / java / fullCoverageWithFT - делаем пекедж helpers
  87.              и туда переносим GivenHelpers
  88.  
  89.         нас пока устроит вариант попроще - вариант 1
  90.         дальше на курсе еще будет про это - про хорошую структуру проекта
  91.         сейчас будет достаточно - если мы отделим тест-класс с его предком от вспомогательных классов
  92. */
  93. ****************************************************
  94.      //given - add and complete task on All filter
  95.      givenAtAll(COMPLETED, "a");
  96. /*
  97.     уже комментарии ни к чему
  98.     гивен-методы - достаточно наглядны и так
  99. */
  100. **************************************
  101. public static final String baseUrl = "https://todomvc4tasj.herokuapp.com/";
  102. ...
  103.     private void ensureAppOpened() {
  104.         if (!baseUrl.equals(url())) open("https://todomvc4tasj.herokuapp.com/");
  105.     }
  106. /*
  107.     ) переменную baseUrl - использовала не эффективно)
  108.  
  109.     if (!baseUrl.equals(url())) {
  110.         open(baseUrl);
  111.     }
  112.  
  113.     или даже так
  114.     if (!url().equals("https://todomvc4tasj.herokuapp.com/")) {
  115.             open("https://todomvc4tasj.herokuapp.com/");
  116.     }
  117.  
  118.     да, не DRY
  119.     но - урл в соседних строках повторяется
  120.     потому - ок
  121.  
  122.     а если вариант с baseUrl нравится больше
  123.     то - лучше объявить переменную прямо в методе
  124.     она ведь больше и не нужна нигде
  125.  
  126.     в принципе - можно этот метод - перенести в GivenHelpers
  127.     и вызывать в начале prepareTasks
  128.  
  129.     резоны - простые
  130.     открытие урла - тоже можно рассматривать как предварительные действия
  131.     да и такие действия никак не завязаны на другие вспомогательные методы
  132. */
  133. **************************************
  134.     private void givenAtAll(Task... tasks) {
  135.             ensureAppOpened();
  136.             prepareTasks(tasks);
  137.             filterAll();
  138.     }
  139.  
  140.     private void givenAtAll(TaskState tasksState, String... taskTexts) {
  141.         ensureAppOpened();
  142.         prepareTasks(makeTasksArray(tasksState, taskTexts));
  143.         filterAll();
  144.     }
  145. /*
  146.     за счет такой реазилации ensureAppOpened() - нам не нужен переход на all фильтр
  147.     мы уже там)
  148.  
  149.     кстати - уйдет необходимость в методе given()
  150.  
  151.     вместо него - можно будет применить givenAtAll()
  152.     т к varArgs-параметры подразумевают вызов - когда не передано ни одного параметра
  153. */
  154. **********************************************
  155.     private void givenAtActive(TaskState tasksState, String... taskTexts) {
  156.         ensureAppOpened();
  157.         prepareTasks(makeTasksArray(tasksState, taskTexts));
  158.         filterAll();
  159.     }
  160. /*
  161.     гивен-методы с параметрами (TaskState tasksState, String... taskTexts)
  162.     можно переписать в одну строку
  163.     givenAtActive(makeTasksArray(tasksState, taskTexts));
  164. */
  165. ********************************************
  166.  
  167. private Task[] makeTasksArray(TaskState tasksState, String[] taskTexts) {
  168.  
  169. /*
  170.     метод стоит перенести в GivenHelpers
  171.  
  172.     и можно переименовать в aTasks (это по желанию, твой вариант названия тоже ок)
  173. */
  174. ***************************************
  175.  
  176.     @Test
  177.     public void editCompletedOnAll() {
  178.         //given - add and complete task on All filter
  179.         givenAtAll(COMPLETED, "a");
  180.  
  181.         edit("a", "a edited");
  182.  
  183.         assertTasksAre("a edited");
  184.         assertItemsLeft(0);
  185.  
  186.     }
  187.  
  188.     @Test
  189.     public void editOnActive() {
  190.          //given - add task on Active filter
  191.          givenAtActive(aTask("v", ACTIVE));
  192.  
  193.          edit("v", "v edited");
  194.  
  195.          assertTasksAre("v edited");
  196.     }
  197.  
  198. /*
  199.     когда у нас гивен-методы - надежные и быстрые
  200.     мы можем разнообразить тестовые ситуации
  201.  
  202.     в фиче-тестах одного действия на разных фильтрах
  203.         работаем с единственной таской
  204.         работаем со второй таской
  205.         работаем с единственной видимой таской (при условии - что есть и не видимые)
  206.  
  207.         ну и то - что ты учла -
  208.             работаем с активной таской
  209.             работаем с закомпличеной таской
  210.  
  211.         например на all-е
  212.             гивен - одна активная, вторая - закомпличеная таска
  213.             редактируем - вторую закомпличеную
  214.         на activ-е
  215.             гивен - первая активная, вторая закомпличеная
  216.             редактируем первую и единственную видимую таску
  217.  
  218.         а в реализациях родственных действий - стараемся какие-то другие нюансы покрыть
  219.         это нам даст  - лучшее покрытие, учитывающее кучу мелких моментов
  220.         и при этом - мы не увелисили количество тест-методов
  221. */
  222. ***************************
  223.     @Test
  224.     public void completeOnActive() {
  225.         //given - add task on Active filter
  226.         givenAtActive(aTask("v", ACTIVE));
  227.  
  228.         complete("v");
  229.  
  230.         assertNoVisibleTasks();
  231.         filterCompleted();
  232.         assertVisibleTasksAre("v");
  233.         assertItemsLeft(0);
  234.     }
  235. /*
  236.     в данном случае - в рамках проверок не нужно переходить на другой фильтр,
  237.     чтобы допроверить тестовую ситуацию
  238.  
  239.     достаточно проверить список тасок и счетчик активных тасок
  240.  
  241.     этого будет достаточно - т к мы и перееходы но фильтрам - покроем фиче-тестами
  242.     например переход с эктива на комплитед
  243.         дано - активная и закомпличерая таски (или больший набор, но с разным статусом) + мы на эктив фильтре
  244.  
  245.         перешли на комплитед фильтр
  246.  
  247.         проверяем тексты тасок и счетсик активных тасок
  248.  
  249.     и если на все фиче-тесты посмотреть в комплексе
  250.     то станет понятно - что в рамках проверок - не нужно переходить с фильтра на фильтр
  251.     проверки состояния списка тасок и счетчика - достаточно
  252.  
  253.     т к для каждого из фильтров - у нас есть тест перехода на него
  254.     и как отображаются таски с разными статусами + что происходит со счетчиком активных тасок -
  255.     мы там проверяем
  256.  
  257.     так мы получим - независимые фиче-тесты
  258.     маскимально эффективные - т к нету в них дублирования
  259.  
  260.     можно пойти другим путем
  261.     и для тестирования, например, completeAllOnAll()
  262.     в рамках проверок уточняющих - переходить на  другой фильтр...
  263.     для этого теста - лучше бы перейти на active
  264.     но - тогда лучше бы в ранее разработанном е2е-е -
  265.     покрывать другой вариант перехода с вильтра на фильтр
  266.     короче - мы так усложняем себе задачу
  267.     и на этапе разработки тестов
  268.     и на этапе анализа покрытия
  269.     и на этапе сопровождения
  270.     т к тест будет проверять пару действий (закомпличивание и переход на такой-то фильтр)
  271.     то - мы тестируем эти действия зависимо друг от друга
  272.     и если тест упадет на первой операции
  273.     то мы не будем знать вообще - как работает вторая операция
  274.  
  275.     потому - подход, когда у нас есть совсем несного е2е-ов
  276.     и много фиче-тестов - он эффективнее
  277.  
  278.     советую остановиться именно на варианте фиче-тестов)
  279. */
  280. ***********************************
  281.     @Test
  282.     public void deleteOnAll() {
  283.         //given - add task at All filter
  284.         givenAtAll(aTask("a", ACTIVE));
  285.  
  286.         delete("a");
  287.  
  288.         assertNoTasks();
  289.     }
  290. /*
  291.     если в предварительных действиях - добавить пару тасок
  292.     то - будет как проверить и items left
  293. */
  294. ***********************************************
  295. если реализовывать full coverage - практически не оптимизируя- http://joxi.ru/DrlQ5oLh4PzRYm
  296. допокрыть все, что еще не покрыто (вся оптимиация - не покрывать уже покрытое в е2е)
  297.  
  298. если оптимизировать - как я писала ранее - http://joxi.ru/EA4k7zEUDW5Bp2
  299. и надо разобраться с приоритетом activate on all filter
  300. если высокий/средний - то и это покрыть
  301. если низкий - то не покрывать
  302.  
  303. по возможности - во всех фиче-тестах проверяй items left
Advertisement
Add Comment
Please, Sign In to add comment