julia_v_iluhina

Untitled

Jan 29th, 2017
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.69 KB | None | 0 0
  1. public class ToDoMVCTest {
  2.  
  3.     @Test
  4.     public void tasksLifeCycle() {
  5.  
  6.         open("https://todomvc4tasj.herokuapp.com/");
  7.  
  8.         add("1", "2");
  9.         /*
  10.             если добавляешь 2 таски сразу - то далее некак использовать неявные проверки
  11.             ведь cancelRename("1" - проверит лишь состояние одной таски
  12.             а у нас их 2
  13.             значит - в данном случае - cancelRename("1" не будет неявной проверкой
  14.             она - эта проверка - недостаточна
  15.  
  16.             не торопись добавлять таски раньше времени
  17.             и будет все ок с неявными проверками
  18.         */
  19.         cancelRename("1", "1 edit canceled");
  20.         toggle("1");
  21.         assertTasksAre("1", "2");
  22.  
  23.         switchFilterToActive();
  24.         assertTasksAre("", "2");
  25.         assertVisibleTasksAre("2");
  26.         /*
  27.             достаточно проверки assertVisibleTasksAre
  28.                 даже если хочется точности - потом - возвратившись на all - проверишь не отфильтрованный по visible список тасок
  29.                 а на Active или Completed фильтрах - проверяй отфильтрованный по visible список
  30.                 раз на этих фильтрах - не все таски видимы
  31.                 далее везде - учти это
  32.  
  33.             switchFilterToActive - можно проще - filterActive
  34.             что делать = filter-фильтровать, как фильтровать = Active
  35.         */
  36.  
  37.         applyRename("2", "2 edited");
  38.         /*
  39.             toggleAll() - не является проверкой для операции applyRename("2"
  40.             нужна проверка
  41.         */
  42.         toggleAll();
  43. *****************************************************************
  44.     private void add(String... taskText) {
  45. /*
  46.     мы оперируем не текстОМ таски, а текстАМИ тасок
  47.     значит - параметр метода - назови taskTexts
  48.  
  49.     будет точнее
  50. */
  51. *****************************************************
  52.     private boolean assertItemsLeft(int count) {
  53.         $("#todo-count").equals(count);
  54.         return true;
  55.     }
  56. /*
  57.     мы уже обсуждали это в прошлый раз
  58.     еще перечитай про assertItemsLeft в прошлом ревью
  59.  
  60.     вариант $(...).equals(....); - вернет true или false
  61.     и после этого - код продолжит выполняться ВНЕ зависимости от результата
  62.  
  63.     а далее - еще и true принудительно вернули)
  64.  
  65.     а вариант $(....).shouldHave(....) - будет работать вот так
  66.     если проверка будет выполнена - то ок, тест будет выполняться далее
  67.     если нет - тест упадет, что хорошо и правильно
  68.     именно так и должны себя вести проверки в тестах
  69.     если проверка не выполняется - тест должен упасть
  70.  
  71.     что делает метод equals - для объекта ЛЮБОГО класса
  72.     метод сравнивает 2 объекта - объект, у которого метод вызван, и объект, который передан как параметр
  73.     вряд ли нам это нужно)
  74.     и есть ли смысл сравнивать объект класса SelenideElement ($("#todo-count")) и int count ?
  75.     писала ранее - а также погугли java objects equals )
  76. */
  77. ***********************************************************
  78.  
  79.     private SelenideElement setNewTaskName(String oldTaskText, String newTaskText) {
  80.     private void applyRename(String oldTaskText, String newTaskText) {
  81.     private void cancelRename(String oldTaskText, String newTaskText) {
  82. /*
  83.     с реализацией  - ок
  84.  
  85.     с именами - советую изменить)
  86.     мы уже оперируем понятием текст таски - taskText
  87.     и уже вводим новый термин - TaskName
  88.  
  89.     а речь - о том же - о тексте таски
  90.     правило = для одного понятия используй один термин
  91.     это правило - даст тебе однозначный код, а это важно)
  92.  
  93.     предлагаю остаться с одним термином - taskText
  94.     а методы - startEdit, edit, cancelEdit
  95.  
  96. */
  97. *******************************************
  98.     private void switchFilterToCompleted() {
  99.     private void switchFilterToActive() {
  100.     private void switchFilterToAll() {
  101. /*
  102.     да, так тоже ок  - реализация
  103.  
  104.     про имена - уже писала
  105.     можно лаконичнее
  106.     filterCompleted
  107.     filterActive
  108.     filterAll
  109. */
  110. *******************************
  111.     private void assertTasksAreEmpty() {
  112.     private void assertTasksAre(String... taskTexts) {
  113. /*
  114.     тут - все ок с реализацией
  115. */
  116.     private void assertVisibleTasksAre(String... taskText) {
  117.         for (String text : taskText) {
  118.             tasks.filterBy(visible).shouldHave(exactTexts(taskText));
  119.         }
  120.  
  121.     }
  122. /*
  123.     а вот тут - есть вопросы
  124.  
  125.     имя параметра метода
  126.     мы работаем с текстАМИ тасок)
  127.     taskTexts - будет ок
  128.  
  129.     читаем код
  130.     в цикле, для каждого переданного текста тасок - мы делаем
  131.     фильтруем таски по visible = получаем КОЛЛЕКЦИЮ видимых тасок
  132.     и проверяем коллекцию - текстЫ тасок
  133.  
  134.     т е - по сути - делаем в цикле НЕСКОЛЬКО раз - одно и то же
  135.     сколько тасок передали - столько раз это действие - верное действие и делаем
  136.  
  137.     уже вот этот код - tasks.filterBy(visible).shouldHave(exactTexts(taskText));- делает что нужно
  138.     достаточно одного раза)
  139.  
  140.     а вот такой вызов - assertVisibleTasksAre();
  141.     мы вообще в таком случае - ничего не проверяем - при текущей реализации
  142.  
  143.     теперь про видео Якова
  144.     https://drive.google.com/file/d/0B8hgIBw8-V-AdGxxU1R3enl1RzQ/view?ts=567ab8d7
  145.  
  146.     чуть поясню его
  147.         мы можем быть максимально точными и держать 4 проверки
  148.         2 -
  149.             в списке = такси с такими-то текстами
  150.             в списке = пусто
  151.         и еще 2 -
  152.             в отфильтрованном по visible списке = таски с такими-то текстами
  153.             в отфильтрованном по visible списке = пусто
  154.         И за точность будем платить  тем - что надо думать - когда какую проверку вызвать правильнее
  155.         и если это делать бездумно - то при небольших изменениях сценариев - могут тесты падать на проверках,
  156.         или второй вариант - не будем нормально пользоваться полученной точностью...
  157.  
  158.         мы можем исходить из того, что ошибку, когда невидимые таски копятся в списке - мы тестим на более низком уровне,
  159.         и на UI уровне - нам не нужно до этого уточняться. Поэтому - мы будем держать всего 2 проверки
  160.               в отфильтрованном по visible списке = таски с такими-то текстами
  161.               в отфильтрованном по visible списке = пусто
  162.         В таком случае - каждый раз понятно - какую проверку вызывать - получаем более KISS картину
  163.         правда, платим за это точностью) Но - возможно - если мы уже отдельно это в тестах покрыли -
  164.         что у нас не копятся невидимые таски - так мы и не платим ) И - тогда - все проще в написании тестов,
  165.         и в их сопровождении.
  166.         Тогда - поскольку обе проверки реализованы одинаково и других нету - можно из имен проверок скрыть этот нюанс
  167.         и назвать их assertTasks и assertNoTasks (хотя в них работаем с отфильтрованным по visible списком тасок)
  168.  
  169.     выводы
  170.         или 2 проверки, или 4 проверки
  171.  
  172.         другие варианты - будут путать
  173.         т к не для всех тестовых ситуаций будут предусмотрены проверки
  174.        
  175. */
Advertisement
Add Comment
Please, Sign In to add comment