julia_v_iluhina

Untitled

Sep 24th, 2016
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.47 KB | None | 0 0
  1. http://joxi.ru/xAe1zDPsYj3GYA
  2.  
  3. /*
  4.     наверное, ты видел это и сам)
  5.     у тебя в одном файле - 2 класса
  6.     ToDoMVCTest и TaskStatus
  7.  
  8.     Я бы не стала в рамках одного файла вот так делать)
  9.     пока - расположи  TaskStatus внутри класса ToDoMVCTest
  10.     как ты и делал для класса Task
  11.  
  12.     Причем - советую их объявления - сделать рядом - так будет легче воспринимать информацию
  13.     что до импортов - так вот такая строчка будет
  14.     import static task6.ToDoMVCTest.TaskStatus.*;
  15.     IntelIJ Idea сама тебе подскажет как правило - как импортить -
  16.     если начать писать import static TaskStatus
  17.  
  18.     https://www.quora.com/Coding-Conventions-When-multiple-classes-are-placed-in-the-same-Java-file-why-should-only-one-of-them-the-class-that-contains-the-main-method-be-declared-public
  19.  
  20.     http://stackoverflow.com/questions/13132729/multiple-classes-in-single-file
  21.     http://stackoverflow.com/questions/2336692/java-multiple-class-declarations-in-one-file
  22.     http://stackoverflow.com/questions/968347/can-a-java-file-have-more-than-one-class
  23. */
  24. ***************************************
  25. http://joxi.ru/vAW36KgskWp03A
  26. /*
  27.     не забывай форматировать код
  28.  
  29.     для этого - выдели код
  30.     и в меню - code->reformat code
  31.  
  32.     код форматируется по стандартным правилам - отступы прежде всего
  33.  
  34.     сравни с текущей версией
  35.  
  36.     правило хорошего тона - выкладывать или отдавать в работу - стандартно отформатированный код
  37.     причины просты - так код проще всего воспринимается - т к так нагляднее
  38. */
  39. ****************************
  40. private void given(Task... tasks) {
  41.  
  42. /*
  43.     с реализацией этого метода - согласна полностью
  44.  
  45.     можно написать чуть лаконичнее
  46.  
  47.     вместо
  48.         "{\\\"completed\\\":" + task.taskStatus.toString()
  49.         и
  50.         "localStorage.setItem(\"todos-troopjs\", \"[" + joiner.toString()
  51.  
  52.     использовать
  53.         "{\\\"completed\\\":" + task.taskStatus
  54.         и
  55.         "localStorage.setItem(\"todos-troopjs\", \"[" + joiner
  56.  
  57.     когда к строке мы добавляем объект некого другого типа
  58.     то этот объект приводится к строке через вызов своего метода toString()
  59.     а раз так - то toString() - можно просто не писать в этом случае)
  60.  
  61.  
  62.     заметь - более нам не нужно заново еализовывать тот же (или почти тот же) алгоритм
  63.     все остальные гивен-методы - будут реализованы через вызов этого, самого универсального
  64. */
  65. **********************************************
  66. private void givenAllActive(String... taskTexts) {
  67. private void given(boolean isCompleted, String... taskTexts) {
  68. private void given(TaskStatus taskStatus, String... taskTexts)
  69.  
  70. /*
  71.     давай определимся - какие варианты гивен-метода нам нужны
  72.     given(TaskStatus taskStatus, String... taskTexts) - позволит создать несколько тасок,
  73.     в каком-то одном статусе
  74.     однозначно, полезно, да и вызовы такого метода - лаконичные и точные
  75.  
  76.     вот сравни
  77.     given(ACTIVE, "a", "b") -  и точно, и лаконично, и универсально - можно и закомпличеные таски добавить
  78.     givenAllActive("a", "b") - тут - уже нету такой универсальности - меньше вариантов метод дает
  79.     given(false, "a", "b") - тут  - не понятно - что хотели сказать первым параметром,
  80.     при этом  - метод позволяет не больше, чем умеет given(TaskStatus taskStatus, String... taskTexts)
  81.  
  82.     получается - что варианта given(TaskStatus taskStatus, String... taskTexts) - достаточно
  83.  
  84.     удаляй given(boolean isCompleted, String... taskTexts) и givenAllActive(String... taskTexts)
  85.     их рекомендовалось сделать - как первые попытки к реализации гивен-методов
  86.  
  87.     теперь - когда у нас уже есть универсальный given(Task... tasks)
  88.     мы лишь сформируем набор гивен-методов, который позволит нам делать лаконичные вызовы гивенов
  89.  
  90.     вот - первый из них - это given(TaskStatus taskStatus, String... taskTexts)
  91.     только вот реализацию его - будем править
  92.  
  93.       задача - тебе внутри given(TaskStatus taskStatus, String... taskTexts)
  94.         надо сделать то же, что ты делал в given(Task... tasks)
  95.         просто - не ясно
  96.         как из параметров (TaskStatus taskStatus, String... taskTexts)
  97.         получить (Task... tasks)
  98.          вот решим эту задачу - сможешь внутри
  99.         given....(TaskStatus taskStatus, String... taskTexts)
  100.  
  101.         написать код в одну строчку
  102.         given(xxx(taskStatus, taskTexts))
  103.  
  104.         в given(Task...tasks) в качестве параметра можно передавать массив Task[] tasks
  105.         погугли про varargs in java
  106.  
  107.         реализуй метод xxx (про имя метода - сам подумай)
  108.         возвращающий Task[]
  109.         с параметрами (TaskType taskType, String... taskTexts)
  110.  
  111.         в котором
  112.         объяви переменную типа Task[] и инициализируй ее как массив Task[....такого-то размера....]
  113.         какого - посмотри на параметры нашего метода
  114.  
  115.         в цикле обойди taskTexts
  116.         и каждый элемент массива заполни с помощью метода aTask
  117.  
  118.         верни полученный массив
  119.  
  120.         а далее - используй этот метод
  121.         внутри given...(TaskType taskType, String... taskTexts)
  122.  
  123.             given(xxx(taskType, taskTexts))
  124.  
  125.         Если тяжело сразу  xxx реализовать -
  126.         то для начала просто внутри givenAt....
  127.         реализуй этот код - собери массив Task[] по переданным параметрам
  128.  
  129.         И тогда будет что-то типа такого
  130.               Task[] tasks = ....
  131.               ....
  132.               ....
  133.               ....
  134.               given(tasks)
  135. */
  136. ********************************************
  137. /*
  138.     а дальше - еще добавим гивен-методов
  139.     уже на все случаи жизни
  140.  
  141.     суть - все они используют внутри себя given(Task... tasks)
  142.     и нужны - лишь для лаконичного вызова гивен-метода в тест-методе
  143.  
  144.     какие у нас задачи - реализовать full coverage с помощью фиче-тестов
  145.     т е - фиче-тестов - будет много
  146.  
  147.     и в рамках тестов - часто надо будет нагенерировать таски и перейти на нужный фильтр
  148.     если мы реализуем фиче-тест не на all
  149.  
  150.     набора гивен-методов
  151.      given(Task... tasks)
  152.      givenAtActive(Task... tasks)
  153.      givenAtCompleted(Task... tasks)
  154.  
  155.      given(TaskStatus taskStatus, String... taskTexts)
  156.      givenAtActive(TaskStatus taskStatus, String... taskTexts)
  157.      givenAtCompleted(TaskStatus taskStatus, String... taskTexts)
  158.  
  159.     тебе точно хватит для реализации любого варианта предварительных действий
  160.     плюс к этому - достаточно просто понимаемые наборы параметров и сами названия методов
  161. */
  162. **********************************************
  163. /*
  164.     еще можно чуть упростить наш код
  165.       мы наследуем тест-класс от AtToDoMVCPageWithClearedDataAfterEachTest
  166.  
  167.         перед запуском теста - открываем наше приложение
  168.         после - чистим локалсторидж
  169.  
  170.         гивены можно вызывать и для варианта, когда надо задать пустой список тасок
  171.         (метод given(Task... tasks) - можно вызвать и с пустым набором параметров given())
  172.  
  173.         значит - можно вызывать в каждом тест-методе гивен-метод
  174.         и убрать очистку локал сториджа после теста - вот уже облегчили код
  175.  
  176.         дальше - раз все тесты происхолят после открытия одного и того же урла
  177.  
  178.         можно вначале гивен-метода проверить
  179.         если сейчас урл не такой, то открыть нужный урл
  180.  
  181.         этот кусочек кода можно оформить в виде метода,
  182.         который будет вызываться вначале гивен-метода
  183.         (достаточно этот метод вызвать внутри given(Task... tasks),
  184.         а поскольку остальные методы - вызывают его - то и у них будет такая функциональность)
  185.  
  186.         такого плана методы = если сейчас не так, то сделать так
  187.         часто называют, начиная со слова ensure = обеспечить
  188.  
  189.         вот и не нужен нам код - по открытию урла в бифор-методе
  190.         сразу вопрос - какой предок нужен тест-классу)
  191.  
  192.         вот тебе и еще одна оптимизация)
  193.         кода меньше
  194.         сущностей меньше
  195.         действий лишних меньше
  196. */
  197. *******************************************
  198. /*
  199.     теперь по покрытию
  200.     в принципе - можешь ничего не оптимизировать - и покрыть фиче-тестами все действия на всех контекстах
  201.     в задании - нету требования - оптимизировать покрытие
  202.  
  203.     но - хорошо это уметь)
  204.     я распишу, а ты уже решай - будешь оптимизировать или нет
  205.     в чем оптимизация
  206.         - что покрыто в е2е - не покрываем фиче-тестами
  207.         - низкоприоритетное - покрываем единожды, на каком-то из контекстов (пример - delete by emptying text)
  208.         - низкоприоритетные варианты фичи, у которой есть покрытые варианты - не покрываем (пример - reopen all & add)
  209.  
  210.     лучше - оттолкнись от тест-плана, который у тебя уже есть - мы его раньше делали
  211.     он тебе в любом случае поможет учесть все варианты
  212.  
  213.     как раз и поймешь - зачем столько гивен-методов)
  214.  
  215.  
  216.     также важно реализовывать различные тестовые ситуации для теста одной фичи
  217.     например для действия ... над таской - у тебя реализовано 3 теста - для каждого из фильтров
  218.     на одном фильтре - поработай с единственной таской
  219.     на втором - со второй из списка
  220.     на третьем - с единственной видимой(есть еще и не видимые)
  221.  
  222.     получится - что мы учтем в тестах больше нюансов
  223.     проверим разные ситуации - т е лучшее покрытие реализуем
  224. */
  225. ************************************
  226. given(new Task(ACTIVE, "B"), new Task(ACTIVE, "C"));
  227.  
  228. /*
  229.     такого плана вызовы пожно упростить до
  230. */
  231.  
  232. given(aTask(ACTIVE, "B"), aTask(ACTIVE, "C"));
  233.  
  234. /*
  235.     если у тебя будет метод aTask(...)
  236.     возвращающий new Task(...)
  237. */
Advertisement
Add Comment
Please, Sign In to add comment