julia_v_iluhina

Untitled

Oct 23rd, 2016
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 16.07 KB | None | 0 0
  1. https://bitbucket.org/murnatko/todomvctest/src/3973483e2669/src/test/java/ua/net/itlabs/hometask/smoke/?at=master
  2.  
  3. /*
  4.     вот так можно давать линку на конкретный пекедж в репозитории - с нужной версией задания
  5.     бери на вооружение
  6.  
  7.     http://joxi.ru/L210nzMu6PlKvm
  8.     вот тут кликай)
  9. */
  10. ********************************************
  11. /*
  12.     сначала приведу общее полезное - то, что еще не использовано
  13.  
  14.     Использование неявных проверок
  15.     про использование неявных проверок через действие
  16.               вариант 1
  17.               add("task1"");
  18.               edit("task1", "task1 edited");
  19.               delete("task1 edited");
  20.  
  21.               вариант 2
  22.               add("task1", "task2");
  23.               edit("task2", "task2 edited");
  24.               delete("task2 edited");
  25.  
  26.            Вариант 1 = правильное использование таких проверок через действие
  27.  
  28.            Вариант2 = не правильное использование
  29.            Т к последующие действия не проверяют состояние ВСЕХ тасок в списке
  30.  
  31.            Таким образом - ты сможешь эффективно использовать неявные проверки через действия только в случае,
  32.            если в списке тасок будет видима лишь одна таска
  33.  
  34.            Также не забывай - после каждого действия должна быть выполнена проверка
  35.            Сразу
  36.            Не получается использовать неявную проверку через следующее действие - используй явную
  37.            Но - действие должно быть обязательно проверено сразу
  38.  
  39. */
  40. public class TodoMVCTest {
  41.  
  42.     @Test
  43.     public void tasksLifecycle(){
  44.  
  45.         open("https://todomvc4tasj.herokuapp.com/");
  46.  
  47.         add("1", "2", "3");
  48.         /*
  49.             разве тебе прямо на следущем шаге нужны все 3 таски?
  50.  
  51.             таким образом мы забираем у себя возможность использовать неявные проверки через действие
  52.  
  53.             еще учти - что add("1", "2", "3"); - это все равно 3 действия)
  54.             так что - одновременное добавление нескольких тасок - это не экономия )
  55.             потом еще добавишь тасок - это действие единственное, которое невозможно
  56.             покрыть единожды
  57.         */
  58.         assertItemsLeft("3");
  59.         /*
  60.             вот такой вариант вызова
  61.             assertItemsLeft(3);
  62.             когда параметр - это число
  63.             более точный
  64.             мы же проверяем количество тасок
  65.             количество = число
  66.  
  67.             эта проверка - недостаточна для проверки операции add("1", "2", "3")
  68.             тут не хватает проверки текстов списка тасок
  69.  
  70.             а вот если бы мы добавили лишь одну таску
  71.             то и операция editEsc("1", "new");
  72.             будет проверять )
  73.             т к проверит состояние всего списка (у нас же всего 1 таска - ее и проверили)
  74.         */
  75.  
  76.         editEsc("1", "new");
  77.         /*
  78.             лучше бы назвать cancelEdit - т к что делаем = отменяем редактирование
  79.             про Escape  - уточнять не надо
  80.             т к это единственный способ выполнить cancelEdit
  81.  
  82.             cancelEdit("1", "1 edited")
  83.             cancelEdit("1", "1 edit canceled")
  84.             - такие тестовые данные лучше пояснят - что мы делаем
  85.             использовать тестовые данные для пояснений кода -
  86.             хороший способ избежать лишних комментариев)
  87.         */
  88.         assertTasksAre("1", "2", "3");
  89.         /*
  90.             хорошо, что тут есть проверка
  91.             это ок
  92.         */
  93.  
  94.         switchFilter("Active");
  95.         /*
  96.             по поводу реализации переходов по фильтрам
  97.             почитай вот это
  98.             https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.8bflixemdgfw
  99.  
  100.             и попробуй применить
  101.             и вообще посмотри на разделы про DRY & KISS principles )
  102.         */
  103.         assertTasksOfTypeAre("active", "1", "2", "3");
  104.         /*
  105.             заметь - такая проверка пройдет и на all фильтре
  106.             и даже если здесь, на Active фильтре будут отображаться закомпличеные таски
  107.             то проверка assertTasksOfTypeAre("active", "1", "2", "3"); - тоже пройдет
  108.  
  109.             потому - она все же не точная
  110.             нам надо проверить - что видимые таски - такие-то
  111.  
  112.             посмотри на http://joxi.ru/l2ZNaR0F83gJv2
  113.             и вот это видео
  114.             https://drive.google.com/file/d/0B8hgIBw8-V-AdGxxU1R3enl1RzQ/view?usp=sharing
  115.  
  116.             мы можем быть максимально точными и держать 4 проверки
  117.                 2 -
  118.                     в списке = такси с такими-то текстами
  119.                     в списке = пусто
  120.                 и еще 2 -
  121.                     в отфильтрованном по visible списке = таски с такими-то текстами
  122.                     в отфильтрованном по visible списке = пусто
  123.                 И за точность будем платить  тем - что надо думать - когда какую проверку вызвать правильнее
  124.                 и если это делать бездумно - то при небольших изменениях сценариев - могут тесты падать на проверках,
  125.                 или второй вариант - не будем нормально пользоваться полученной точностью...
  126.  
  127.                 мы можем исходить из того, что ошибку, когда невидимые таски копятся в списке - мы тестим на более низком уровне,
  128.                 и на UI уровне - нам не нужно до этого уточняться. Поэтому - мы будем держать всего 2 проверки
  129.                       в отфильтрованном по visible списке = таски с такими-то текстами
  130.                       в отфильтрованном по visible списке = пусто
  131.                 В таком случае - каждый раз понятно - какую проверку вызывать - получаем более KISS картину
  132.                 правда, платим за это точностью) Но - возможно - если мы уже отдельно это в тестах покрыли -
  133.                 что у нас не копятся невидимые таски - так мы и не платим ) И - тогда - все проще в написании тестов,
  134.                 и в их сопровождении.
  135.                 Тогда - поскольку обе проверки реализованы одинаково и других нету - можно из имен проверок скрыть этот нюанс
  136.                 и назвать их assertTasks и assertNoTasks (хотя в них работаем с отфильтрованным по visible списком тасок)
  137.  
  138.                 Это отнеси ко всем проверкам списка тасок
  139.  
  140.             так, теперь вернемся к нашей тестовой ситуации)
  141.             было в списке - "1", "2", "3"
  142.             перешли на нужный фильтр
  143.             стало в списке - "1", "2", "3"
  144.  
  145.             Да, состояние списка верное
  146.             но - оно не изменилось после перехода на фильтр
  147.             и такое могло быть и в обстоятельствах - когда вообще ничего не происходит
  148.             при переходе на ужный фильтр
  149.  
  150.             чтоб уточнить проверку - еще на all
  151.             закомплить таску
  152.             и тогда на Active - состояние списка тасок будет другим
  153.             и таким образом - мы обеспечим точность проверки
  154.         */
  155.  
  156.         toggle("1");
  157.         assertTasksOfTypeAre("active", "2", "3");
  158.  
  159.         toggleAll();
  160.         assertNoTasks("active");
  161.         /*
  162.             во как раз complete - покроешь на одном фильтре
  163.             а complete all - на другом
  164.         */
  165.  
  166.         switchFilter("Completed");
  167.         assertTasksOfTypeAre("completed", "1", "2", "3");
  168.         /*
  169.             а вот тут круто получилось)
  170.             перед переходом на Completed - не было видимых тасок
  171.             перешли на Completed
  172.             и тут - в списке видимы такие-то таски
  173.             тут - проверили переход на другой фильтр - точно
  174.         */
  175.  
  176.         toggle("1");
  177.         assertTasksOfTypeAre("completed", "2", "3");
  178.  
  179.         clearCompleted();
  180.         assertNoTasks("completed");
  181.         /*
  182.             идеально)
  183.             хороший выбор для Completed фильтра
  184.  
  185.             единственное - если на момент clearCompleted()
  186.             будет лишь одна таска - то будет чуть экономнее)
  187.         */
  188.  
  189.         switchFilter("All");
  190.         assertTasksAre("1");
  191.         /*
  192.             и тут ок переход на фильтр проверили)
  193.         */
  194.  
  195.         edit("1", "new");
  196.         /*
  197.             edit("1", "1 edited") - лучше прояснит дальше  - что за таска "1 edited"
  198.  
  199.             советую покрыть эту операцию на Active фильтре
  200.             так будет равномернее
  201.             нам равномерное распределение по фильтрам даст вот что
  202.             даже на уровне smoke теста мы вероятнее увидим проблемы -
  203.             если на каком-то из фильтров не будут работать операции над тасками
  204.  
  205.         */
  206.         delete("new");
  207.         assertNoTasks();
  208.         /*
  209.             это тоже удачное решение - покрыть удаление таски под конец сценария
  210.         */
  211.  
  212.     }
  213. ****************************************
  214.     private static ElementsCollection tasks = $$("#todo-list li");
  215. /*
  216.     "#todo-list>li" - такой селектор точнее
  217.     нам тут и твой вариант подходит
  218.  
  219.     но - бывают ситуации - что вот такое уточнение критично
  220. */
  221.     private static ElementsCollection filters = $$("#filters li");
  222. /*
  223.     не уверена - что нам нужна такая переменная
  224.     по-прежнему считаю - что в нашем случае до нужных элементов
  225.     можно добраться проще - $(By.linkText(...))
  226.     мы это обсуждали в skype)
  227. */
  228. *******************************************
  229.     private void assertTasksOfTypeAre(String taskType, String... taskTexts) {
  230.         tasks.filter(cssClass(taskType)).shouldHave(exactTexts(taskTexts));
  231.     }
  232. /*
  233.     filter - ты уже применять умеешь)
  234.     нам нужен просто другой кондишен)
  235. */
  236. ***********************************
  237.     private void assertNoTasks(String taskType) {
  238.         tasks.filter(cssClass(taskType)).isEmpty();
  239.     }
  240. /*
  241.     isEmpty() - просто вернет boolean-значение - да или нет
  242.     а проверка  - это другое в нашем случае
  243.     если проверка проходит - тест должен дальше выполняться
  244.     а не проходит - так тест должен упасть
  245.     такое поведение - у should-методов
  246. */
  247. ***************************
  248.     private void assertItemsLeft(String itemLeftText) {
  249.         $("#todo-count").shouldHave(text(itemLeftText));
  250.     }
  251. /*
  252.     про тип параметра - писала
  253.  
  254.     text - првоеряет на вхождение текста в текст элемента
  255.  
  256.     например - в элементе - текст 10 elements left
  257.     а мы проверяем - assertItemsLeft(1)
  258.     и такая проверка пройдет)
  259.  
  260.     уточни элемент "#todo-count"
  261.     и уточни проверку
  262. */
  263. *****************************************************
  264.     private void edit(String taskText, String newText) {
  265.         tasks.find(exactText(taskText)).doubleClick();
  266.         tasks.find(cssClass("editing")).$(".edit").setValue(newText).pressEnter();
  267.     }
  268.  
  269.     private void editEsc(String taskText, String newText) {
  270.         tasks.find(exactText(taskText)).doubleClick();
  271.         tasks.find(cssClass("editing")).$(".edit").setValue(newText).pressEscape();
  272.     }
  273. /*
  274.     термин taskText - хороший термин для текста таски
  275.  
  276.     а для обозначения было-стало - хорошо использовать old и new, или from и to
  277.     oldTaskText & newTaskText
  278.  
  279.     подправь имена параметров
  280.  
  281.     про имя editEsc - писала выше
  282.  
  283.     посмотри - как переименовывать
  284.     https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#heading=h.vwuqi54t6fyg
  285.  
  286.     еще чуть код улучшим
  287.     вот этот код
  288.     tasks.find(exactText(taskText)).doubleClick();
  289.     tasks.find(cssClass("editing")).$(".edit").setValue(newText)
  290.    
  291.     повторяется в 2-ух методах
  292.    
  293.     реализуй метод xxx(...)
  294.     который возвращает SelenideElement = элемент, в котором ввели новый текст
  295.     чтобы его вызывать xxx("1", "1 edited").pressEnter()
  296.    
  297.     про имя метода подумай
  298.     это старт/начало редактирования
  299. */
  300. ************************
  301.     private void switchFilter(String filterType) {
  302.         filters.find(exactText(filterType)).click();
  303.     }
  304. /*
  305.     выше писала - что почитать
  306.     и как лучше реализовать
  307.     надеюсь, этого хватило)
  308. */
Advertisement
Add Comment
Please, Sign In to add comment