julia_v_iluhina

Untitled

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