julia_v_iluhina

Untitled

Aug 25th, 2016
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 23.52 KB | None | 0 0
  1. /*
  2.      Заострю твое внимание на нескольких моментах, потом в коде их более подробно рассмотрим
  3.  
  4.         According to the Draft Test Plan choose main use cases to be covered
  5.  
  6.             У тебя есть Use Case List
  7.             Там есть названия - лаконичные
  8.             (про add, кстати, меня не послушался, ну ОК - определись с используемыми терминами)
  9.             Почему тут применяешь другие варианты? remove вместо delete?
  10.  
  11.  
  12.         for efficiency of “smoke approach”, don’t cover all use cases per filter -
  13.         cover some actions at all filter, others - at active, etc.
  14.         But definitely - cover all CRUD actions
  15.  
  16.             Имеется в виду - не нужно одно действие покрывать в сценарии более одного раза
  17.  
  18.  
  19.      Дальше важный момент
  20.          Мы реализуем е2е сценарий для smoke покрытия
  21.          это значит - что достаточно покрыть высокоприоритетный юз кейс лишь единожды, на одном из контекстов
  22.  
  23.          т е - покрыли edit на active - все, этого достаточно
  24.          конечно, с добавлением таски так не получится )
  25.          но - и того количества тасок, что ты создал - не нужно
  26.  
  27.          но с остальными операциями - это получится вполне
  28.  
  29.          задача smoke покрытия - быстро дать нам фидбек = все высокоприоритетные операции работают
  30.          не - все высокоприоритетные операции работают на всех контекстах
  31.          а  - именно вот так - что они работоспособны
  32.  
  33.          дальше - если smoke тестирование пройдено - можно глубже тестировать приложение
  34.          а если нет - так нет смысла продолжать тестировать - есть серьезные проблемы и надо их устранять
  35.  
  36.  
  37.      Приоритет действия высокий если
  38.                 - нерабочее действие не позволяет использовать приложение
  39.                  - у действия нет альтернативы
  40.                  - действие - часто используемое
  41.                  - действие - стандартное для многих приложений
  42.  
  43.                      Примеры высокоприоритетного
  44.                             - добавление задачи - высокоприоритетная штука, потому что если отвалится - приложение не работает
  45.                             - отмена редактирования с помощью esc - во-первых, стандартное поведение, во-вторых - нет альтернативы
  46.                             - закомпличивание/раскомпличивание одной задачи - часто используемое и критично чтоб работало - важный функционал
  47.  
  48.                      Так вот - низкоприоритетные вещи - в smoke-тесте не нужно покрывать.
  49.                      Чтобы оставить smoke тест эффективным
  50.  
  51.                      А вот Reopen All - уже имеет приоритет пониже - т к реже будет использоваться, чем тот же reopen
  52.                      потому - reopen - стоит покрыть, а Reopen All - уже не стоит
  53.  
  54.                      Проверку счетчика Items left - стоит покрыть лишь единожды.
  55.                      В общем-то - это не высокоприоритетная штука.
  56.                      Т к даже если это не будет работать - приложение будет все равно функционально.
  57.                      С другой стороны, на состояние этого счетчика влияет любая выполненная операция.
  58.                      Ввиду этого - в рамках е2е покроем его лишь единожды.
  59.  
  60.      про использование неявных проверок через действие
  61.                вариант 1
  62.                add("task1"");
  63.                edit("task1", "task1 edited");
  64.                delete("task1 edited");
  65.  
  66.                вариант 2
  67.                add("task1", "task2");
  68.                edit("task2", "task2 edited");
  69.                delete("task2 edited");
  70.  
  71.             Вариант 1 = правильное использование таких проверок через действие
  72.  
  73.             Вариант2 = не правильное использование
  74.             Т к последующие действия не проверяют состояние ВСЕХ тасок в списке
  75.  
  76.             Таким образом - ты сможешь эффективно использовать неявные проверки через действия только в случае,
  77.             если в списке тасок будет видима лишь одна таска
  78.  
  79.             Также не забывай - после каждого действия должна быть выполнена проверка
  80.             Сразу (!!!)
  81.             Не получается использовать неявную проверку через следующее действие - используй явную
  82.             Но - действие должно быть обязательно проверено сразу
  83.             исключения - бывают )
  84.             но - это исключения
  85.             в норме - каждое действие должно быть проверено
  86.  
  87.     давай уже и про исключения тут поговорим, чтоб картина была полнее
  88.     на самом деле - тут важнее помнить - что проверять надо сразу)
  89.  
  90.     когда стоит или можно откладывать проверку, не делать ее сразу после действия
  91.  
  92.         в целом = правило такое = каждое действие должно быть проверено сразу
  93.  
  94.             это нужно для того, чтобы знать не только, что действие выполнено
  95.             но и то, что действие (каждое) выполнено с ожидаемым нами результатом
  96.  
  97.             и если тест упал - нам важно знать
  98.             какая конкретно операция этому была виной
  99.  
  100.         суть проверки - не только проверить сущность, над которой выполнялось действие
  101.         но и общую картину
  102.             в нашем случае могло быть так
  103.             добавляем таску - а добавляется 2 одинаковые
  104.             проверка - что перава таска имеет такой-то текст - пройдет
  105.             и об ошибке мы не узнаем
  106.  
  107.             а это плохо)
  108.             потому правильнее - проверять общую картину
  109.             а не состояние сущности, над которой было совершено действие
  110.             если это возможно, конечно)
  111.             и если мы оперируем именно списком однотипных сущностей
  112.  
  113.         почему и когда мы можем отложить проверку
  114.             первый пример - проверить первый раз список тасок уже после добавления   всех 4-ех тасок
  115.             т к операции однотипные в общем-то
  116.  
  117.               можно быть чуть точнее
  118.               проверить список тасок после добавления первой таски и после добавления последней таски
  119.               если посчитать - что это 2 разные ситуации = добавление первой и добавление последующих тасок
  120.  
  121.             второй пример - для цепочки операций на all фильтре (complete + clear completed)
  122.             не делать проверки списка тасок после закомпличивания
  123.             а уже делать проверку после следующей операции - clear completed
  124.  
  125.               тут логика следующая
  126.                 после закомпличивания таска все равно отображается в списке
  127.                 и то, что она закомпличена - мы поймем уже после выполнения clear completed
  128.  
  129.                 но, с другой стороны,
  130.                 то, что закомпличивания таска все равно отображается в списке - это
  131.                 как раз часть логики....
  132.                 и из этих соображений - стоило бы тут добавить проверку
  133.  
  134.                   пример - при закомпличивании таска удаляется
  135.                   если проверим аж после clear completed -
  136.                   такую ошибку не поймаем
  137.  
  138.               так что по поводу проверки после закомпличивания -
  139.               ее нужно использовать, если операция закомпличивания нестабильна
  140.               или ее можно отложить - если мы не ждем сюрпризов от этой операции
  141.  
  142.               такой баланс - эффективность vs точность
  143. */
  144.  
  145. public class TodoMVCTest {
  146.  
  147.     @Test
  148.     public void testTasksOperations(){
  149.  
  150.         open("https://todomvc4tasj.herokuapp.com/");
  151.  
  152.         add("1", "2", "3", "4");
  153.         /*
  154.             не торопись добавлять сразу несколько тасок
  155.             так ты забираешь у себя возможность использовать неявные проверки
  156.         */
  157.         assertTasksAre("1", "2", "3", "4");
  158.  
  159.         edit("1", "1_new");
  160.         /*
  161.             лучше edit("1", "1 edited");
  162.             точнее отразит происходящее
  163.             да и далее по кодо легче будет понимать - что за таска
  164.  
  165.             следующая операция delete("2") - не проверяет операцию edit("1", "1_new");
  166.             во-первых - работаешь с другой таской - это не проверит состояние отредактированной
  167.             во-вторых - проверка должна нам рассказывать о состоянии всех тасок
  168.  
  169.             была бы у тебя всего одна таска в списке - мог бы использовать
  170.             delete для проверки edit
  171.         */
  172.  
  173.         delete("2");
  174.         assertTasksAre("1_new", "3", "4");
  175.         /*
  176.             не торопись удалять таску
  177.             чем позже ты это сделаешь, тем меньше тасок придется добавить
  178.  
  179.             мы же стараемся не делать ни одного лишнего движения
  180.         */
  181.  
  182.         toggle("4");
  183.         clearCompleted();
  184.         assertTasksAre("1_new", "3");
  185.         /*
  186.             ну, можно и так, конечно
  187.             только мы опять - раньше времени удаляем таску (при вызове clearCompleted())
  188.  
  189.             ну и выгоднее эти операции разбросать по сценарию -
  190.             можно воспользоваться тем, что у тебя есть закомпличеная таска
  191.             не только для работы с clearCompleted()
  192.  
  193.             например - хорошая идея
  194.             перед переходом на Active - закомплитить таску
  195.             проверить тексты в списке тасок (=все таски вне зависимости от статуса видны на олле
  196.             - это тоже часть логики)
  197.             перейти на Active и снова проверить  список тасок
  198.  
  199.             так ты проверишь точно - и переход на другой фильтр, и закомпличивание допроверишь
  200.  
  201.             такой способ проверки перехода на фильтр - наиболее точный -
  202.             т к было-стало разное у списка
  203.             + стало=отвечает требованиям фильтра
  204.             т е - состояние списка изменилось и изменилось правильно
  205.  
  206.         */
  207.  
  208.         toggleAll();
  209.         toggleAll();
  210.         toggleAll();
  211.         clearCompleted();
  212.         /*
  213.             проверка только после 4-ой операции - перебор)
  214.             слишком надолго отложил проверку
  215.  
  216.             глядя на трижды повторяющийся вызов toggleAll() -
  217.             я, признаться, на какое-то время задусываюсь - что есть что
  218.  
  219.             лучше перед вызовами toggleAll или toggle - используй поясняющий комментарий -
  220.             complete / complete all / reopen / reopen all
  221.         */
  222.         assertAreNoTasks();
  223.         /*
  224.              подводим промежуточные итоги
  225.              4 добавленные таски благополучно уничтожены
  226.  
  227.              покрыто *сколько раз покрыто
  228.              add *4
  229.              edit *1
  230.              delete *1
  231.              complete *1
  232.              complete all *2
  233.              reopen all *1
  234.              clear completed *2
  235.  
  236.              осталось совсем немного не покрытых действий
  237.              да и повторений многовато
  238.              reopen all - вообще не стоило покрыватт
  239.              реально написать такой сценарий, в котором только add будет повторяться
  240.         */
  241.         add("1");
  242.         /*
  243.             снова добавили таску с текстом 1
  244.             не очень удачная идея - добавлять таски с такими же именами
  245.             которые использовались для других тасок в рамках этого же сценария
  246.             причина проста - далее по сценарию ты смотришь на таску 1 и не сразу понимаешь -
  247.             что это за таска 1 - которая добавлена в самом начале или попозже
  248.  
  249.             зачем тебе сложности лишние?
  250.  
  251.             результат добавления - не проверен
  252.             следующая операция openTab("Active");
  253.             не проверит операцию add("1")
  254.         */
  255.  
  256.         openTab("Active");
  257.         /*
  258.             и тут не хватает проверки
  259.  
  260.             более того - тут не выгодная тествая ситуация
  261.             писала выше - было-стало при переходе на другой фильтр должно отличаться
  262.             так ты проверишь - что переход на фильтр работает + работает правильно
  263.  
  264.             про реализацию метода перехода по фильтрам - ниже напишу
  265.         */
  266.  
  267.         add("2", "3", "4");
  268.         assertTasksAre("1", "2", "3", "4");
  269.         /*
  270.             эххх)
  271.             и снова надобавлял тасок раньше времени
  272.             не торопись)
  273.         */
  274.  
  275. ...
  276.         toggle("4");
  277.         /*
  278.             мы complete  уже покрывали All фильтре
  279.             далее уже не пишу про повторения
  280.  
  281.             почитай тексты вначале ревью - если мы реализуем smoke покрытие
  282.             нам достаточно один раз на одном из контекстов покрыть операцию
  283.  
  284.             повторять - не нужно
  285.         */
  286.         assertTasksAre("1", "2_new", ""); // Или отобрать только с классом .сompleted? А то смахлювал получается... :)
  287.         /*
  288.             вариант с отбором только .сompleted - тоже не очень-то хорош
  289.             в прошлой лекции примерно на 59-ой минуте было про это
  290.  
  291.             тут - посмотри повнимательнее
  292.             http://joxi.ru/l2ZNaR0F83gJv2
  293.  
  294.             если отфильтруешь таски по кондишену visible и уже у этой коллекции проверишь тексты -
  295.             придешь к нормальному набору параметров
  296.             вместо ("1", "2_new", "")
  297.             получишь ("1", "2_new")
  298.             (текст не видимого элемента коллекции считается пустым - юзер же его не видит)
  299.  
  300.             мало того - проверки отфильтрованного по visible списка тасок тебе подойдут
  301.             и на completed фильтре
  302.  
  303.             чтобы по этому поводу картинка сложилась полностью - посмотри
  304.             https://drive.google.com/file/d/0B8hgIBw8-V-AdGxxU1R3enl1RzQ/view?ts=567ab8d7
  305.             и прими окончательное решение по набору проверок
  306.  
  307.         */
  308.  
  309.         toggleAll();
  310.         /*
  311.             ну допустим, на all-е - действительно, были причины отложить проверку
  312.             тут - таких причин нету)
  313.         */
  314.         clearCompleted();
  315.         assertAreNoTasks();
  316.  
  317.         add("1", "2", "3", "4");
  318.         toggleAll();
  319.         /*
  320.             снова повторяемся)
  321.  
  322.             и снова - не проверяем результаты выполненного действия
  323.         */
  324.  
  325.  
  326.         openTab("Completed");
  327.         /*
  328.             проверки  - нет
  329.             было-стало  - да, разное
  330.             но ни было, ни стало - не проверены)
  331.  
  332.             проверка могла быть точной, но ее нет совсем
  333.         */
  334. ...
  335.  
  336.     /*
  337.         еще из того, чего не хватает
  338.             - переход на all фильтр - лучше в конце сценария проверить и это
  339.             вернуться на all и удалить последнюю таску (вот что я имела в виду -
  340.             когда говорила отложить удаление на потом))
  341.  
  342.             - cancel edit - тоже вісокоприоритетная операция, и ее надо бы покрыть
  343.  
  344.             - items left - писала в самом начале - почему стоит покрыть (единожды)
  345.         в остальном - многое покрыто по нескольку раз - это надо оптимизировать
  346.         низкоприоритетное можно не покрывать вовсе - reopen all, например
  347.  
  348.         распредели покрытие действия поравномернее по фильтрам - так тест лучше
  349.         будет отлавливать проблемы - когда на каком-то из фильтров операции над
  350.         тасками корректно не выполняются
  351.     */
  352.  
  353. *****************************************
  354.     ElementsCollection tabs = $$("#filters>li");
  355.     private void openTab(String tabText) {
  356.         tabs.findBy(exactText(tabText)).click();
  357.     }
  358. /*
  359.     почитай про KISS principle
  360.     https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#heading=h.w4krdzi2dr1j
  361.  
  362.     и про вот это в особенности
  363.     https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.8bflixemdgfw
  364.  
  365.     переделай)
  366. */
  367. **********************************************************
  368.  
  369.     public void edit(String taskText, String newTaskText){
  370.     /*
  371.         для состояний было-стало - часто применяют old & new from & to
  372.         oldTaskText & newTaskText
  373.         fromTaskText & toTaskText
  374.     */
  375.         $(".editing")
  376.      /*
  377.         вот этот кусочек улучшим
  378.  
  379.         в сущности, что мы ищем - таску из списка тасок с классом editing
  380.         из кода - это не ясно
  381.         было бы нагляднее
  382.         если вместо $(".editing")
  383.         использовать tasks.findBy(...)
  384.         будет понятно - что ищем некую таску по такому-то признаку
  385.  
  386.         вообще - єто более общее правило
  387.         если у тебя есть переменная для некого элемента/коллекции
  388.         и тебе надо доступиться до чего-то внутри этого элемента/коллекции
  389.         то - не используй новый независимый селектор
  390.         а - оттолкнись от уже используемой переменной
  391.  
  392.         получишь более наглядный и более DRY код
  393.      */
  394. *****************************************
Advertisement
Add Comment
Please, Sign In to add comment