julia_v_iluhina

Untitled

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