julia_v_iluhina

Untitled

Oct 13th, 2016
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 25.45 KB | None | 0 0
  1. http://joxi.ru/DmBNWL6FNR7YLm
  2.  
  3. /*
  4.     в пекедже - уже очень много классов )
  5.     причем - эти классы  - разного назначения
  6.  
  7.     давай немного структурируем
  8.         1 - предки тест-класса
  9.         в этом же пекедже  - сделай пекедж для них - testconfigs
  10.  
  11.         2 - классы для реализации гивен-методов
  12.         сами эти классы - нам отдельно от гивен-методов - не нужны
  13.         потому вот так держать их отдельно в структуре проекта - смысла большого нету
  14.         да, пока, в этом задании, гивен-методы мы реализуем прямо в тест-классе
  15.         позже - разберем - как вспомогательные методы вынести из тест-класса
  16.         сейчас я тебе предлагаю расположить классы Task & TaskStatus - в самом тест-классе
  17.         потом - в следующих заданиях - эти классы вместе с гивенами - мы отделим от тест-класса
  18.         но - по-прежнему  классы Task & TaskStatus  и гивен-методы - будут реализованы в рамках одного класса
  19.         т к все это служит одной цели и по отдельности нами применяться не будет
  20.         почитай про nested classes in java
  21.             https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
  22.             https://www.tutorialspoint.com/java/java_innerclasses.htm
  23.  
  24.         3 - собственно тест-класс
  25.             вот он и останется в корне этого пекеджа
  26. */
  27. ************************************
  28. script += "{\"completed\":"+ task.status + ", \"title\":\"" + task.name + "\"},";
  29.  
  30. ....
  31.  
  32. public class Task {
  33.     String name;
  34.     boolean status;
  35.  
  36.     public Task(String name, TaskStatus status){
  37.         this.name = name;
  38.         this.status = status.getValue();
  39.     }
  40. }
  41.  
  42. /*
  43.     ну да )
  44.     красиво конечно ты выкрутилась)
  45.  
  46.     преобразовала статус на уровне класса Task в  boolean-значение
  47.     и уже использовала строковое представление boolean-значения в гивен-методе )
  48.  
  49.     красота мне нравится)
  50.     но - не нравится вот что
  51.     на уровне - кога мы смотрим на объект типа Task
  52.     и смотрим на его статус - то нам тяжело понять - что это значение -
  53.     true or false - для нас значит
  54.  
  55.     более просто для понимания общей картины - чтобы и класс Task оперировал статусом типа TaskStatus
  56.  
  57.     но - как же красота?
  58.  
  59.     до нее на самом деле - один шаг)
  60.  
  61.     если на уровне TaskStatus ты реализуешь метод toString(), возвращающий
  62.     "true" or "false" - то значения типа TaskStatus будут преобразовываться к строке именно так - как прописано в
  63.     toString()
  64.  
  65.     все классы - в том числе и enum - это потомки класса Object
  66.     у которого есть такой метод  toString()
  67.     отвечающий за преобразование объекта к строке
  68.  
  69.     и если ты в своем классе  - реализуешь метод  toString()
  70.     то именно так объект этого класса и будет преобразовываться к строке
  71.  
  72.     и тогда в выражении
  73.     script += "{\"completed\":"+ task.status + ", \"title\":\"" + task.name + "\"},";
  74.     где  task.status - будет значением типа TaskStatus - тоже будет все хорошо
  75.  
  76.     то есть  - красота решения осталась,
  77.     но ушел его недостаток - на уровне Task мы оперируем статусом типа TaskStatus
  78.  
  79.     можно пойти еще дальше )
  80.     реализовать toString() в классе Task
  81.  
  82.     чтобы в гивен-методе писать
  83.     script += task + ",";
  84.  
  85.     не настаиваю, но если тебе это кажется красивым решением - попробуй реализовать
  86.  
  87.     также для полей name и status советую уже сейчас использовать модификатор доступа
  88.     сейчас это не важно - т к классы в одном пекедже
  89.     (когда не указан модификатор доступа - получаем package-private вариант)
  90.     https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
  91.     http://stackoverflow.com/questions/16164902/what-is-the-default-access-modifier-in-java
  92.     мы впоследствии перенесем гивен-методы с классами Task & TaskStatus в другой класс
  93.     и этот класс - будет жить в другом пекедже
  94.     вообще - разумнее сразу использовать модификатор доступа (access modifier) явно
  95.     чтобы при реструктуризации проекта не приходилось заботиться о видимости переменных или методов
  96. */
  97. *************************************
  98.     public void given(Task... tasks)
  99.     ...
  100.  
  101.     public void givenAtAll(Task... tasks)
  102.     ...
  103.  
  104.     public void testDeleteAtCompleted(){
  105.         givenAtAll(new Task("task1", COMPLETED));
  106.  
  107.         filterCompleted();
  108.  
  109. /*
  110.     реализовывать ли метод-синоним givenAtAll(Task... tasks) для given(Task... tasks) - еще вопрос...
  111.  
  112.     а вот для тестов на Active & Completed фильтре - хорошо бы иметь свои гивен-методы
  113.     которые и локалсторидж подготовят, и переход на нужный фильтр выполнят - ведь это тоже
  114.     предварительное действие
  115.  
  116.     т е - нам нужен набор
  117.  
  118.     given(Task... tasks) - собственно реализация алгоритма подготовки даных
  119.  
  120.     givenAtAll(Task... tasks) - этот можно и не реализовывать, т к это просто вызов given(Task... tasks)
  121.     givenAtActive(Task... tasks)
  122.     givenAtCompleted(Task... tasks)
  123.  
  124. */
  125. **********************
  126.  givenAtAll(new Task("task1", COMPLETED), new Task("task2", COMPLETED));
  127.  
  128.  /*
  129.     во многих случаях тебе нужны несколько тасок в одном статусе
  130.     и такого рода код
  131.     givenAtAll(new Task("task1", COMPLETED), new Task("task2", COMPLETED));
  132.     можно переписать лаконичнее
  133.     givenAtAll(COMPLETED, "task1", "task2");
  134.  
  135.     согласись, гораздо лаконичнее - что важно для тест-методов
  136.  
  137.     тебя есть
  138.             givenAtAll(Task... tasks)
  139.             givenAtActive(Task... tasks)
  140.             givenAtCompleted(Task... tasks)
  141.  
  142.  
  143.          для удобства работы мы хотим реализовать дополнительно
  144.             givenAtAll(TaskStatus taskStatus, String... taskTexts)
  145.             givenAtActive(TaskStatus taskStatus, String... taskTexts)
  146.             givenAtCompleted(TaskStatus taskStatus, String... taskTexts)
  147.  
  148.  
  149.          чтобы не городить опять почти такой же алгоритм по получению
  150.          команды джаваскрипт
  151.          а мочь вместо этого переиспользовать уже созданные методы
  152.  
  153.          тебе нужно уметь преобразовывать
  154.          (TaskStatus taskStatus, String... taskTexts)
  155.          в
  156.          (Task... tasks)
  157.  
  158.          в методы с параметрами (Task... tasks) можно передавать значения-массивы (Task[] tasks)
  159.  
  160.          вот и напиши метод
  161.          возвращающий Task[]
  162.          по данным (TaskStatus taskStatus, String... taskTexts) - это будут его параметры
  163.  
  164.          таким образом
  165.          внутри
  166.          givenAtAll(TaskStatus taskStatus, String... taskTexts)
  167.  
  168.          ты сможешь вызывать
  169.          givenAtAll(xxx(taskStatus, taskTexts))
  170.  
  171.          про имя такого метода  xxx надо подумать )
  172.  */
  173.  ************************************
  174.  givenAtAll(new Task("task1", ACTIVE), new Task("task2", COMPLETED), new Task("task3", ACTIVE));
  175.  
  176.  /*
  177.     сравни
  178.     givenAtAll(new Task("task1", ACTIVE), new Task("task2", COMPLETED), new Task("task3", ACTIVE));
  179.     и
  180.     givenAtAll(aTask("task1", ACTIVE), aTask("task2", COMPLETED), aTask("task3", ACTIVE));
  181.  
  182.     вот такой метод aTask, создающий новый объект типа Task - тоже может сделать код тест-метода лаконичнее
  183.     не настаиваю на применении, но в общем - прием оправданный
  184.  */
  185. *******************************************
  186.        @Test
  187.        public void testDeleteAtAll(){
  188.            givenAtAll(new Task("task1", ACTIVE), new Task("task2", COMPLETED), new Task("task3", ACTIVE));
  189.            assertItemLeft(2);
  190.            /*
  191.             после вызова гивен-метода - нам не нужны проверки
  192.             гивен-методы - быстрые и надежные
  193.             достаточно проверок после тестируемого действия
  194.  
  195.             касается всех без исключения тест-методов
  196.            */
  197. ***********************************
  198.     @Test
  199.     public void testDeleteAtActive(){
  200.         givenAtAll(new Task("task1", ACTIVE));
  201.         filterActive();
  202.  
  203.         delete("task1");
  204.         assertNoVisibleTasks();
  205.     }
  206.  
  207.     @Test
  208.     public void testDeleteAtCompleted(){
  209.         givenAtAll(new Task("task1", COMPLETED));
  210.  
  211.         filterCompleted();
  212.  
  213.         delete("task1");
  214.         assertNoVisibleTasks();
  215.     }
  216. /*
  217.     в тестах одного и того же действия - используй разные тестовые ситуации
  218.  
  219.      да, в тесте на all удаляется одна из нескольких тасок, это ок
  220.  
  221.      в этих 2-ух тестах - тоже можно было добавить разнообразия
  222.      тут по сути - в обоих тестах мы работаем с единственной таской
  223.  
  224.      а можно и вот так
  225.         удалить единственную таску
  226.         удалить единственную видимую таску(есть еще и не видимые)
  227.  
  228.      просмотри и остальные тест-методы относительно разнообразия тестовых ситуаций
  229. */
  230. **************************
  231.     @Test
  232.     public void testCompleteAllAtAll(){
  233.         givenAtAll(new Task("task1", ACTIVE), new Task("task2", ACTIVE));
  234.         assertItemLeft(2);
  235.  
  236.         toggleAll();
  237.  
  238.         filterCompleted();
  239.         assertTasksAre("task1", "task2");
  240.         assertItemLeft(0);
  241.     }
  242. /*
  243.     судя по всему - ты засчитала переход на Completed - в покрытие
  244.  
  245.     в принципе - могу понять, из каких соображений ты так организовала этот метод
  246.  
  247.     тогда - это у нас такой маленький е2е на 2 тестируемых действия
  248.     после каждого из тестируемых действий - нужна проверка
  249.  
  250.     да и в имени тест-метода тогда надо отразить - что тестировали не только CompleteAll
  251.     но и переход с All на Completed
  252.  
  253.     и уже по реализации
  254.     вспомни
  255.     мы об этом говорили - когда делали е2е для smoke покрытия
  256.     когда мы точно проверили переход на другой фильтр
  257.         состояние списка изменилось = переход на фильтр работает
  258.         состояние списка правильное = переход на фильтр работает правильно
  259.  
  260.     разве у нас так?
  261.  
  262.     возможно, е2е тест   CompleteAll + Clear Completed at All
  263.     был бы лучше - в том плане - каждое из этих тестируемых действий было проверено достаточно точно
  264.  
  265.     а на самом деле
  266.        если у нас есть фиче-тесты для переходов с фильтра на фильтр
  267.        то тест testCompleteAllAtAll,
  268.        в котором мы лишь проверяем состояние списка тасок и счетчика активных тасок -
  269.        уже точный
  270.        ведь есть тест перехода на all - в котором мы проверили -
  271.        что тексты тасок такие-то и счетчик актикных тасок - в таком-то состоянии
  272.  
  273.        т е - благодаря тому - что у нас есть фиче-тесты и для фильтеринга - нам не обязательно тут уточняться -
  274.        проверять что таски действительно закомплитились
  275.  
  276.     настаивать на таком варианте не буду - можешь оставить и е2е
  277.        но сделай его точным - учти моменты, описанные выше
  278.  
  279.     на самом деле, фиче-тесты - будут эффективнее
  280.     т к тестирование каждой из фич - будет независимым
  281.  
  282. */
  283. *****************************
  284.     @Test
  285.     public void testActivateAtAll(){
  286.         givenAtAll(new Task("task1", COMPLETED));
  287.         assertItemLeft(0);
  288.  
  289.         toggle("task1");
  290.         assertItemLeft(1);
  291.  
  292.         filterActive();
  293.         assertVisibleTasks("task1");
  294.     }
  295. /*
  296.     тут - примерно тоже
  297.  
  298.     нам для фиче-теста - достаточно проверить состояние списка тасок и счетчика активных тасок
  299.  
  300.     благодаря тому, что будут и фиче-тесты для переходов с фильтра на фильтр - таких проверок будет достаточно
  301.  
  302.     в этом тест-метода - примерно тот же набор проблем, что и тесте testCompleteAllAtAll()
  303.  
  304. */
  305. ************************************
  306.    @Test
  307.     public void testClearCompletedAtAll(){
  308.         givenAtAll(new Task("task1", COMPLETED), new Task("task2", COMPLETED));
  309.  
  310.         filterCompleted();
  311.         clearCompleted();
  312.         assertNoVisibleTasks();
  313.     }
  314. /*
  315.     странный метод)
  316.  
  317.     в названии указали - тестируем ClearCompleted на All фильтре
  318.  
  319.     а в реализации - мы это делаем на Completed фильтре
  320.  
  321.     если в гивен-методе - создать не только закомпличеные, но и активные таски
  322.     то можно будет проверить и счетчик активных тасок
  323.     та и действие ClearCompleted будет протестировано точнее
  324.     нам же важно не только то, что закомпличеные таски удаляются
  325.     но и то, что активные - остаются
  326. */
  327. *********************************
  328.     @Test
  329.     public void testCancelEditAtActive(){
  330. /*
  331.     для шкалы из 3-ех приоритетов  - у этого действия явно приоритет 1
  332.  
  333.     это действие без workaround
  334.  
  335.     соглашусь, что это не настолько важно как базовые операции
  336.     в шкале с 4-мя приоритетами отдала бы второй такого рода действиям
  337.  
  338.     в любом случае - такое надо покрыть на всех контекстах в рамках full coverage
  339.  
  340.     не призываю менять шкалу приоритетов
  341.     призываю -
  342.         поменять приоритет на высокий (точнее = равный приоритету edit,
  343.         на completed фильтре - как и у edit, приоритет будет ниже)
  344.         и покрыть и на all, и на active  фильтрах
  345. */
  346. ***************************************************
  347. /*
  348.     из раздела Additional edit operations:
  349.     у нас куда-то ушел вариант     confirm edit by press Tab
  350.     причем еще на уровне предыдущих задаий)
  351.  
  352.     тут http://pastebin.com/SJFFt6KZ
  353.     он еще был
  354.  
  355.     соглашусь с 3-им приоритетом
  356.  
  357.     даже при оптимизации полного покрытия - низкоприоритетное надо покрыть на каком-то одном из контекстов
  358.     добавь недостающий пункт в тест-план и реализуй тест-методы
  359.     тоже - распределяй их по разным фильтрам и думай про разнообразие тестовых ситуаций - т к методы тестируют
  360.     похожие операции
  361. */
  362. ************************************
  363.     @Test
  364.     public void testCompleteAllAtActive(){
  365.         givenAtAll(new Task("task1", ACTIVE), new Task("task2", ACTIVE));
  366.         filterActive();
  367.  
  368.         toggleAll();
  369.         assertNoVisibleTasks();
  370.  
  371.         filterCompleted();
  372.         assertVisibleTasks("task1", "task2");
  373.     }
  374. /*
  375.     ну ладно CompleteAll на All фильтре
  376.     там и правда  - можно посчитать - что недостаточно проверить список тасок и счетчик активных тасок
  377.  
  378.     но тут, на Active фильтре - состояние списка тасок отлично отражает - что операция выполнена корректно
  379. */
  380. **************************************
  381.     @Test
  382.     public void testActivateAllAtActive(){
  383.         givenAtAll(new Task("task1", COMPLETED), new Task("task2", COMPLETED));
  384.         assertItemLeft(0);
  385.  
  386.         filterActive();
  387.  
  388.         toggleAll();
  389.         assertItemLeft(2);
  390.         assertVisibleTasks("task1", "task2");
  391.     }
  392. /*
  393.     не согласна, что на Active фильтре - эта операция будет иметь средний приоритет
  394.  
  395.     средний приоритет будет на Completed фильтре
  396.     там же - будут и самые точные проверки
  397.  
  398.     а на Active, также как и на all - приоритет у этой операции будет низкий
  399. */
  400. ***************************************
  401. /*
  402.     советую - как и написано в условии задания - дореализовать к нашему е2е - именно фиче-тестов для полного покрытия
  403.  
  404.     я бы не стала реализовывать маленьких е2е - чтобы поточнее проверить некоторые из действий на all
  405.     как писала выше - за счет того - что есть фиче-тесты на все действия, в том числе и на фильтеринг
  406.     в любом из фиче-тестов - проверок состояния списка тасок и счетчика активных тасок  - достаточно
  407.  
  408.     дореализуй недостающие фиче-тесты (писала выше про такое), ну и недопокрытоя для фильтеринга - тоже не забудь
  409.     обязательно оперируй тасками в разных состояниях - это необходимо для точной  проверки фильтеринга
  410.  
  411.     покрывай проверку счетчика активных тасок как вторую проверку после тестируемого действия
  412.     этого - достаточно
  413.     старайся - чтобы было что проверять - чтобы на конец теста счетчик активных тасок можно было проверить
  414.     не во всех ситуациях это можно сделать
  415.     практически во всех)
  416.     когда отражаешь в тест-плане - что покрыла items left
  417.     то выбирай строку тест-плана, соотвествующую действию, ПОСЛЕ которого выполнила проверку items left
  418.  
  419.     проверки после гивен-методов - не нужны в фиче-тестах
  420.     это мы еще разбирали в задании Smoke e2e+F
  421.  
  422.     приведу и тут этот кусочек
  423. */
  424.  
  425. /*
  426.  
  427.     Optimized full coverage
  428.     Судя по всему, ты уже оптимизировала покрытие
  429.     это было делать не обязательно, но можно
  430.  
  431.     что можно оптимизировать
  432.         - что покрыто в е2е - не покрываем фиче-тестами
  433.         - низкоприоритетное - покрываем единожды, на каком-то из контекстов (пример - delete by emptying text)
  434.         - низкоприоритетные варианты фичи, у которой есть покрытые варианты - не покрываем (пример - reopen all & add)
  435.  
  436. */
  437.  
  438. /*
  439.  
  440.     Это к общему сведению)
  441.  
  442.     Есть разные способы выполнять предварительные действия
  443.     Мы сейчас делаем это через действия на UI (User Interface)
  444.     А есть еще методы - работать непосредственно с данными (далее вы такое тоже попробуете)
  445.     Так вот через действия на UI - предварительные действия не быстрые и часто не достаточно надежные
  446.     А через непосредственную работу с данными - предварительные действия быстрые и надежные
  447.  
  448.     Если предварительные действия медленные или не надежные
  449.     То проверка в конце предварительных действий нужна
  450.  
  451.     А если мы уверены - что после предварительных действий гарантировано все ОК,
  452.     то и проверок не надо после предварительных действий
  453.  
  454.     Но, поскольку наше приложение - простое
  455.     Разумно не делать проверку в конце предварительных действий
  456.     чтобы наши тесты были эффективнее
  457.  
  458.     Тестировали бы что-то типа соцсети и если бы предварительные действия были
  459.     реализованы через UI - да, после предварительных действий было бы разумно
  460.     выполнить проверку (проверка после предварительных действий нам позволяет отличить -
  461.     ошибка возникла на этапе выполнения тестируемого действия, или все же раньше)
  462.  
  463.  
  464. */
  465. ***********************
  466. private void add(String... taskTexts)
  467.  
  468. public class Task {
  469.   ...
  470.  
  471.     public Task(String name, TaskStatus status){
  472. /*
  473.     это уже придирка)
  474.  
  475.     ранее мы использовали термин taskText
  476.     я бы из этих соображений - и в классе Task
  477.     использовала не name, а text
  478.  
  479.     ну или уже title - т к именно так это называется в локалсторидже
  480.  
  481.     цель - оставаться в одних терминах
  482. */
Advertisement
Add Comment
Please, Sign In to add comment