julia_v_iluhina

Untitled

Oct 25th, 2016
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.51 KB | None | 0 0
  1. public class TodoMVCUseCasesTest {
  2.     /*
  3.         вот это уточнение про UseCases - мало что нам дает
  4.  
  5.         мы и в прошлый раз UseCases тестировали)
  6.         и вообще - что кроме UseCases можно тестировать? )
  7.  
  8.         у нас задача - в одном проекте делать несколько заданий
  9.         в разных тест-классах
  10.         при том - что тестим мы по-прежнему то же приложение
  11.  
  12.         лучше - такие вещи разграничивать на уровне структуры
  13.         например - пекедж hw1
  14.         и в нем - тест-класс по первому заданию
  15.         второй пекедж - hw2 - для второго задания
  16.  
  17.         и так далее
  18.  
  19.         в разных пекеджах одного проекта мы можем держать тест-классы с одинаковым именем
  20.         java это позволяет
  21.  
  22.         и так мы получим - что при нейминге тест-класса
  23.         мы не будем думать про имена, которые уже "заняты" предыдущими заданиями
  24.         а - как и положено - будем думать - какое имя для такого тест-класса будет верным
  25.  
  26.  
  27.         тут тоже подойдет имя тест-класса - как и в прошлой работе
  28.         т к пока для тестирования приложения todoMVC - мы используем один тест-класс (тест-класс текущего задания)
  29.     */
  30.  
  31. *********************************************
  32. /*
  33.     давай теперь пройдемся по коду и оценим покрытие
  34.     каждый шаг теста приведем к терминам нашего списка юз кейсов - для простоты
  35.     повторения - будем показывать коэффициентами возле действия - чтоб список был покороче
  36. */
  37.  
  38.    All
  39.     add * 5
  40.     edit * 2
  41.     delete * 2
  42.     complete * 2
  43.     complete all * 2
  44.     activate
  45.     activate all
  46.     clear completed
  47.  
  48.     items left counter * 6
  49.  
  50.     ->Completed * 2
  51.     ->Active * 2
  52.  
  53.    Completed
  54.     add * 2
  55.     delete
  56.     complete all * 2
  57.     activate
  58.     activate all
  59.     clear completed * 2
  60.  
  61.     items left counter * 2
  62.  
  63.     ->All
  64.     ->Active * 2
  65.  
  66.    Active
  67.      add
  68.      complete
  69.      complete all
  70.  
  71.      items left counter * 2
  72.  
  73.      ->All
  74.      ->Completed * 2
  75. /*
  76.     что мы видим
  77.     что каждое действие - покрыто по нескольку раз
  78.     запросто могла где-то ошибиться в своих оченках - т к код пока не очень-то простой и наглядный
  79.  
  80.     идея понятна - ты пытался покрыть разные комбинации дарзых действий
  81.     но
  82.     мы реализуем е2е сценарий для smoke покрытия
  83.  
  84.     это значит - что достаточно покрыть высокоприоритетный юз кейс лишь единожды, на одном из контекстов
  85.  
  86.     т е - покрыли edit на active фильтре - все, этого достаточно
  87.     конечно, с добавлением таски так не получится )
  88.     но - и того количества тасок, что ты создал - не нужно
  89.  
  90.     но с остальными операциями - это получится вполне
  91.  
  92.     задача smoke покрытия - быстро дать нам фидбек = все высокоприоритетные операции работают
  93.     не : все высокоприоритетные операции работают на всех контекстах
  94.     а именно вот так : что они работоспособны
  95.  
  96.     дальше - если smoke тестирование пройдено - можно глубже тестировать приложение
  97.     а если нет - так нет смысла продолжать тестировать - есть серьезные проблемы и надо их устранять
  98.  
  99.     еще важно - поравномернее распределить тестируемые операции по фильтрам
  100.     это тоже даст нам полезный фидбек
  101.     так мы более вероятно сможем  увидеть проблемы - когда на одном из фильтров операции над тасками не могут выполняться
  102.     (пока - сильный перекос  в сторону all фильтра)
  103.  
  104.       И в самом тексте задания говорилось про efficiency of “smoke approach”
  105.  
  106.             что за efficiency of “smoke approach”
  107.             нам нужен быстрый, точный фидбек о высокоприоритетных операциях
  108.             быстрый = значит не нужно делать ни одного лишнего движения,
  109.             не тратить на второстепенное время
  110.             точный - значит по-прежнему проверять каждое действие сразу
  111.  
  112.             нам нужен быстрый результат.
  113.             мы не можем себе позволить бездумно повторять действия, уже ранее покрытые
  114.  
  115.     дальше читаем задание
  116.     use “implicit checks” when possible, like:
  117.           add(“1”)
  118.           edit(“1”, “xyz”)  // here we implicitly check that “1” task was created. Otherwise we could not edit it.
  119.  
  120.         что имеется в виду
  121.  
  122.         если у тебя в списке видима одна таска
  123.         то ты можешь использовать действие над этой таской
  124.         как неявную проверку
  125.  
  126.         пример - в задании приведен
  127.         после добавления таски 1 мы не делали assertTasks
  128.         мы делали edit(“1”
  129.         если бы возникли проблемы с edit(“1” - то это значит, что предыдущая операция работала не верно
  130.  
  131.         но - такие неявные проверки через действие - можно сделать лишь в случае
  132.         если у тебя в списке лишь одна видимая задача
  133.         потому что действие проверит состояние лишь одной таски - той, над которой действие производится
  134.  
  135.                   вариант 1
  136.                   add("task1"");
  137.                   edit("task1", "task1 edited");
  138.                   delete("task1 edited");
  139.  
  140.                   вариант 2
  141.                   add("task1", "task2");
  142.                   edit("task2", "task2 edited");
  143.                   delete("task2 edited");
  144.  
  145.                Вариант 1 = правильное использование таких проверок через действие
  146.  
  147.                Вариант2 = не правильное использование
  148.                Т к последующие действия не проверяют состояние ВСЕХ тасок в списке
  149.  
  150.                Таким образом - ты сможешь эффективно использовать неявные проверки через действия только в случае,
  151.                если в списке тасок будет видима лишь одна таска
  152.  
  153.                Также не забывай - после каждого действия должна быть выполнена проверка
  154.                Сразу
  155.                Не получается использовать неявную проверку через следующее действие - используй явную
  156.                Но - действие должно быть обязательно проверено сразу
  157.  
  158.         как еще можно повысить эффективность
  159.         отложить удаление тасок на самый конец теста
  160.         а перед этим над добавленными тасками выполнить разные другие действия
  161.         чтоб не приходилось лишний раз создавать таски
  162.         этот тест можно написать, создавая таски дважды, по одной штуке)
  163. */
  164. **********************************************
  165.     public void clickButton(String buttonName){
  166.         filters.find(exactText(buttonName)).click();
  167.     }
  168. /*
  169.     даже для такой организации метода - имя плохо поясняет  - что мы делаем
  170.     пока не заглянешь в метод - не поймешь
  171.  
  172.     вариант switchToFilter(String name) - был бы понагляднее и поточнее
  173.  
  174.     но - и это не лучший вариант)
  175.  
  176.     почитай вот это
  177.     https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.8bflixemdgfw
  178.  
  179.     и вообще про DRY & KISS - в нашем FAQ и при необходимости - во внешних источниках)
  180.  
  181.     и реализуй переходы на фильтры - более KISS
  182. */
  183. *************************************************
  184.     public void counter(String count){
  185.         $("#todo-count").shouldHave(exactText(count));
  186.     }
  187. /*
  188.     что мы делаем
  189.     мы проверяем
  190.     https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.sswzyp7qkm9o
  191.  
  192.     что мы проверяем - количество активых тасок
  193.     количество = число
  194.     используй параметр метода типа число
  195.  
  196.     а вот куски фразы items left или items left - проверять уже не нужно вовсе
  197.     т к это уже больше не к логике, а к оформлению
  198.     а мы концентрируемся на функциональных проверках
  199.     в видео
  200.     https://drive.google.com/file/d/0B8hgIBw8-V-AUDhxWDg1YmYxM3c/view?usp=sharing
  201.     примерно на  58-ой минуте было про это
  202.  
  203.     и в реализации проверки тогда придется уточнить - селектор
  204. */
  205. **********************************
  206.     public void editCompletedTask(String oldName, String newName){
  207.         tasks.find(exactText(oldName)).doubleClick();
  208.         $(".completed").find(".edit").setValue(newName).pressEnter();
  209.     }
  210. /*
  211.     примени этот метод к второй закомпличеной таске в списке
  212.     получилось отредактировать?
  213.     ))
  214.     этот  метод реализован не верно
  215.  
  216.     да и не стоит - реализуя метод для редактирования - делать отдельно метод для закомпличеной и активной таски
  217.  
  218.     так мы раздуем наше решение
  219.  
  220.     чем больше вспомогательных методов, и чем они узкоспециализированнее - тем сложнее ими пользоваться
  221.  
  222.     грамотнее реализовать метод edit
  223.     который сможет откорректировать таску с любым статусом
  224. */
  225.  
  226.     public void editActiveTask(String oldName, String newName){
  227.         tasks.find(exactText(oldName)).doubleClick();
  228.         $(".editing").find(".edit").setValue(newName).pressEnter();
  229.     }
  230. /*
  231.     попробуй применить метод к закомпличеной таске
  232.     он будет работать)
  233.  
  234.     так зачем тогда в имени метода писать про Active?
  235.     да и в прошлый раз мы уже определились - что для имен методов-действий - не нужно использовать Task
  236.     т к тут - все действия выполняются над тасками
  237.     вот у нас уже были имена - add, delete, toggle, ....
  238.  
  239.     так почему тут другие логические построения для нейминга одного из методов-действий?
  240.  
  241.     еще про имя параметров
  242.     для текста таски мы уже применяем taskText
  243.     и тут будем
  244.     вспоминай - для одного понятия используем один термин
  245.  
  246.     было-стало - действительно хорошо обозначать old & new
  247.  
  248.     oldTaskText & newTaskText - будет ок
  249. */
Advertisement
Add Comment
Please, Sign In to add comment