julia_v_iluhina

Untitled

Oct 5th, 2016
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.39 KB | None | 0 0
  1. package ua.net.itlabs.hometask;
  2.  
  3.  
  4.  
  5. import com.codeborne.selenide.Condition;
  6. import org.junit.Test;
  7.  
  8. import static com.codeborne.selenide.CollectionCondition.*;
  9. import static com.codeborne.selenide.Selenide.*;
  10.  
  11.  
  12.  
  13.  
  14. /**
  15.  * Created by Lia on 9/30/16.
  16.  */
  17. public class TodosMVCTest {
  18.  
  19.     @Test
  20.     public void tasksLifecycle(){
  21.  
  22.         open("https://todomvc4tasj.herokuapp.com/");
  23.  
  24.         createTasks(4);
  25.         /*
  26.             не скрывай внутри вспомогательного метода - тестовые данные
  27.             правильно -
  28.             createTasks("task1", "task2", "task3", "task4");
  29.                 дальше мы рассмотрим - как такой метод реализовать
  30.                 можно пока не торопиться
  31.             или
  32.  
  33.             createTasks("task1");
  34.             createTasks("task2");
  35.             createTasks("task3");
  36.             createTasks("task4");
  37.                 а так - ты уже и сейчас сможешь переписать
  38.  
  39.             преимущество такого подхода
  40.             глядя на код тест-метода - сразу ясно все - с какими данными работаем
  41.             ничего не надо ходить внутрь вспомогательных методов смотреть
  42.             из кода тест-метода - в общем и так все понятно
  43.  
  44.             и второе - что вспомогательные методы более универсальные
  45.             допустим - надо создать таску не task1, а task2, причем единственную?
  46.  
  47.         */
  48.  
  49.         $$("#todo-list li").shouldHave(exactTexts("task1", "task2", "task3", "task4"));
  50.  
  51.         deleteTask(2);
  52.         /*
  53.             пока - такой вариант = ок
  54.             мы тут - не зашили внутрь метода работу с тестовыми даными
  55.  
  56.             мы просто выбираем таску по порядковому номеру
  57.             это ок
  58.  
  59.             потом - после следующего видео - сможешь этот метод переписать
  60.             deleteTask("task2");
  61.             но это потом будет
  62.  
  63.             пока твой вариант ок
  64.         */
  65.  
  66.         $$("#todo-list li").shouldHave(exactTexts("task1", "task3", "task4"));
  67.  
  68.         makeTaskComleted(3);
  69.         /*
  70.             можно назвать это действие попроще - complete
  71.             но - на самом деле - тут задачка немного глубже...
  72.             ниже напишу про это
  73.         */
  74.  
  75.         $$("#todo-list .completed").shouldHave(size(1));
  76.         /*
  77.             если тут контролировать - у каких тасок в списке есть класс completed
  78.             то лучше проверять у этих тасок тексты - так будет точнее
  79.  
  80.             ну и селектор "#todo-list .completed"
  81.             лучше уточнить "#todo-list li.completed"
  82.             потом - будет понятнее - почему
  83.             а пока - идем от общего к частному
  84.             причем - однородные селекторы используем
  85.             #todo-list li - список тасок
  86.             #todo-list li.completed - закомпличеные таски
  87.         */
  88.  
  89.         clearComletedTask();
  90.         /*
  91.             слово Com--p--lete
  92.             букву пропустила
  93.  
  94.             обрати внимание - ошибки в спеллинге в IntelIJ Idea
  95.             подчеркиваются зеленой волнистой линией
  96.         */
  97.  
  98.         $$("#todo-list li").shouldHave(exactTexts("task1", "task3"));
  99.  
  100.         makeTaskComleted(1);
  101.         makeTaskComleted(2);
  102.         /*
  103.             это надо выполнить по-другому
  104.  
  105.             тут имелось в виду - другое действие
  106.                         с использованием вот этого переключателя
  107.                         http://joxi.ru/p275M9zs0eBkVr
  108.  
  109.                         перепиши этот кусок кода
  110.         */
  111.  
  112.         $$("#todo-list .completed").shouldHave(size(2));
  113.         /*
  114.             тут - аналогично - как и после закомпличивания таски2
  115.             откорректируй проверку
  116.  
  117.             на самом деле - еще поговорим про такого рода проверки
  118.             только позже))
  119.             пока - вот так поправь
  120.         */
  121.  
  122.         clearComletedTask();
  123.  
  124.         $("#todo-list").shouldBe(Condition.empty);
  125.         /*
  126.             а тут интересно )
  127.  
  128.             $("#todo-list") - это элемент, а не коллекция
  129.             и проверка $("#todo-list").shouldBe(Condition.empty); =
  130.             проверить что в элементе значение равно пусто и текст равен пусто
  131.  
  132.             а тут нажо бы  - проверить - что в списке "#todo-list li" - нету элементов
  133.  
  134.             надо работать с коллекцией
  135.             $$("#todo-list li").shouldHave(size(0))
  136.             или
  137.             $$("#todo-list li").shouldBe(empty)
  138.  
  139.             это empty - CollectionCondition.empty
  140.             а не Condition.empty
  141.             и CollectionCondition.empty - это синоним проверки на size(0)
  142.  
  143.             а shouldBe - синоним shouldHave
  144.  
  145.             просто вариант $$("#todo-list li").shouldBe(empty) - наглядный и лаконичный результат
  146.             а вообще - оба варианта технически верны
  147.         */
  148.  
  149.     }
  150.  
  151.     private void createTasks(int num){
  152.     /*
  153.         про реализацию - выше писала
  154.     */
  155.  
  156.         for (int i = 0; i < num; i++) {
  157.  
  158.             $("#new-todo").setValue("task" + (i+1)).pressEnter();
  159.             $$("#todo-list li").contains(texts("task" + (i+1)));\
  160.             /*
  161.                 вот это - $$("#todo-list li").contains -
  162.                 определяет - есть ли в коллекции $$("#todo-list li")
  163.                 элемент texts("task" + (i+1))
  164.                 как ты понимаешь - нету)
  165.  
  166.                 и этот contains - просто возвращает true or false = да или нет
  167.                 т е - не является проверкой
  168.  
  169.                 ты после createTasks - делаешь проверку
  170.                 $$("#todo-list li").shouldHave(exactTexts("task1", "task3", "task4"));
  171.                 ее достаточно и та проверка - правильная
  172.                 и правильно - что она не в этом методе (который служит для реализации действия)
  173.                 а в самом тест-методе(мы видим и действия, и проверки)
  174.                 как работает exactTexts
  175.                     проверяется количество, порядок и тексты
  176.                     количество переданных текстов - должно соотвествовать количеству элементов коллекции
  177.                     и далее - попарно проверяются тексты элементов на соотвестствие переданному тексту
  178.                     нулевой - с нулевым
  179.                     первый - с первым
  180.  
  181.                 а эта операция $$("#todo-list li").contains(texts("task" + (i+1)))
  182.                 - не верно реализованная и не нужная проверка
  183.             */
  184.  
  185.         }
  186.  
  187.         $$("#todo-list li").shouldHave(size(num));
  188.         /*
  189.             и эта проверка - не нужна
  190.             мы после createTasks проверку делаем, и она ОК, ее достаточно
  191.  
  192.             вообще - без нужды не нужно в методы-действия внедрять проверки
  193.             так мы скрываем тестовую логику
  194.             а этого делать не надо)
  195.  
  196.             более того - эта проверка вредна
  197.             например, если до вызова createTasks
  198.             уже были таски в списке )
  199.         */
  200.  
  201.     }
  202.  
  203.     private void deleteTask(int i){
  204.     /*
  205.         лучше называть параметры методов - более точно
  206.         https://google.github.io/styleguide/javaguide.html#s5.2.6-parameter-names
  207.  
  208.         тут подошел бы вариант
  209.         index, nth
  210.     */
  211.  
  212.         $("#todo-list li:nth-of-type(" + i + ")").click();
  213.         /*
  214.             нам не нужно кликать
  215.             достаочно навести мышку на таску - это метод hover
  216.         */
  217.         $("#todo-list li:nth-of-type(" + i + ") .destroy").click();
  218.  
  219.     }
  220.  
  221.  
  222.     private void makeTaskComleted(int i){
  223.     /*
  224.         попробуй метод вызвать для закомпличеной таски
  225.         он ее не закомплилит, а переоткроет
  226.  
  227.         попробуй учесть вот это
  228.         https://docs.google.com/document/d/10qSwWTQ6pGfVZSwOes-1QSmdflMiGD2U_y53VHq2m20/edit#bookmark=kix.x92tktmmfsz2
  229.     */
  230.         $("#todo-list li:nth-of-type(" + i + ") .toggle").click();
  231.  
  232.     }
  233.  
  234.     private void clearComletedTask(){
  235.  
  236.         $("#clear-completed").click();
  237.  
  238.     }
  239.   *********************************
  240.  
  241.   сравни со своим кодом )
  242.  
  243.           open("https://todomvc4tasj.herokuapp.com/");
  244.  
  245.           create("task1");
  246.           create("task2");
  247.           create("task3");
  248.           create("task4");
  249.           $$("#todo-list li").shouldHave(exactTexts("task1", "task2", "task3", "task4"));
  250.  
  251.           delete(2);
  252.           $$("#todo-list li").shouldHave(exactTexts("task1", "task3", "task4"));
  253.  
  254.           xxx(3); ///подумай над именем метода)
  255.           $$(...).shouldHave(...);
  256.  
  257.           clearCompleted();
  258.           $$("#todo-list li").shouldHave(exactTexts("task1", "task3"));
  259.  
  260.           xxxAll();//тут - тоже придется над именем метода подумать) та же ситуация что и с xxx
  261.           $$(...).shouldHave(...);
  262.  
  263.           clearCompleted();
  264.           $$(...).shouldHave(...);
  265.  
  266.  
  267. /*
  268.     я про имена методов и про использование пропусков строк)
  269.  
  270.     пропуски строк - делят код на блоки логические
  271.     и код легче воспринимается
  272.  
  273.     а из имен методов-действий - я предлагаю убрать Task
  274.     т к работаем - только с тасками
  275. */
Advertisement
Add Comment
Please, Sign In to add comment