julia_v_iluhina

Untitled

Oct 4th, 2016
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 20.04 KB | None | 0 0
  1.         <dependency>
  2.             <groupId>org.seleniumhq.selenium</groupId>
  3.             <artifactId>selenium-java</artifactId>
  4.             <version>2.53.1</version>
  5.         </dependency>
  6. /*
  7.     Вот эта часть в pom - лишняя
  8.  
  9.     достаточно подключить Selenide - это враппер над селениумом
  10.     потому и к функциональности селениумской получишь доступ,
  11.     просто подключив Selenide
  12. */
  13. ****************************
  14.  
  15. public class MVCTest
  16. /*
  17.     приложение называется todoMVC
  18.     потому правильнее тест-класс назвать - todoMVCTest
  19.  
  20.     лучше не использовать никаких сокращений, кроме общепринятых
  21.     сокращать имя приложения в данном случае - не стоило)
  22.  
  23.     в faq - есть раздел по неймингу
  24.     там много полезного описано)
  25.     https://docs.google.com/document/d/10qSwWTQ6pGfVZSwOes-1QSmdflMiGD2U_y53VHq2m20/edit#heading=h.2zj10n877t2p
  26. */
  27. {
  28. /*
  29.     форматирование кода в твоей версии - отличается от стандартного
  30.  
  31.     IntelIJ Idea позволяет это легко подправить
  32.     выдели код и в меню code->reformat code
  33.     обрати внимание на то, как изменит свое положение эта фигурная скобочка)
  34.  
  35.     стандартно отформатированный код - легче поспринимается
  36.     не пренебрегай этим)
  37.  
  38. */
  39.     @Test
  40.     public void createTask() throws Exception {
  41.     /*
  42.         Метод - не только создание тасок тестирует
  43.         он и другие операции тестирует - это у нас небольшой е2е сценарий
  44.  
  45.         обрати внимание на вот это
  46.         https://docs.google.com/document/d/10qSwWTQ6pGfVZSwOes-1QSmdflMiGD2U_y53VHq2m20/edit#bookmark=id.txqig9rkgybo
  47.  
  48.         имя метода - поправь согласно рекомендациям
  49.  
  50.         насчет throws Exception
  51.         вопрос - для чего это?
  52.     */
  53.  
  54.         open("https://todomvc4tasj.herokuapp.com/");
  55.         CommonActions todosOperations = new CommonActions();
  56.  
  57. //- Tasks #1-4
  58.         todosOperations.FillTextBox("#new-todo", "Create Task 1");
  59.         todosOperations.FillTextBox("#new-todo", "Create Task 2");
  60.         todosOperations.FillTextBox("#new-todo", "Create Task 3");
  61.         todosOperations.FillTextBox("#new-todo", "Create Task 4");
  62.         /*
  63.             сравни
  64.             todosOperations.FillTextBox("#new-todo", "Create Task 1");
  65.             $("#new-todo").setValue("Create Task 1").pressEnter();
  66.  
  67.             стало лаконичнее?
  68.             стало нагляднее?
  69.             стало понятнее?
  70.  
  71.             нет)
  72.  
  73.             так стоило ли прятать таким образом код?
  74.             буквально в следующем видео - об этом будет подробнее)
  75.  
  76.             но в принципе, уже с твоими навыками можно по-другому реализовать это)
  77.             код
  78.             $("#new-todo").setValue("Create Task 1").pressEnter();
  79.             реализовать как
  80.             tasks.add("Create Task 1");
  81.             или даже еще лаконичнее - если сделать более лаконичными тексты тасок
  82.             tasks.add("t1");
  83.  
  84.             думаю, тебе уже понятно - как этого достичь
  85.                 объект класса CommonActions() - назвать tasks -
  86.                 мы же именно над тасками будем совершать действия
  87.                 и метод FillTextBox - упростить до add
  88.  
  89.                 нам нужен метод, который добавит таску в список
  90.  
  91.                 на уровне тест-метода -
  92.                     нужен либо простой и наглядный метод
  93.                     либо вообще не стоит ничего надстраивать сверху кода
  94.                         $(...).setValue(...).pressEnter()
  95.                         т к этот код сам по себе - достаточно прост
  96.  
  97.             кстати - имена методов - должны начинаться с маленькой буквы
  98.                 https://google.github.io/styleguide/javaguide.html#s5.2.3-method-names
  99.         */
  100.  
  101. //-Additional task        //Just checking that all values are added to the TODO
  102.         $$("#todo-list li").shouldHave(exactTexts("Create Task 1", "Create Task 2", "Create Task 3", "Create Task 4"));
  103.         /*
  104.             проверка правильная и к месту
  105.  
  106.             а вот комментарии излишни)
  107.             и так все понятно
  108.         */
  109.  
  110. //- Task #5
  111.         todosOperations.ClickToDosButtons("Create Task 2", ".destroy");
  112.         /*
  113.             тоже - сравни - что ты выиграл, пряча реализацию
  114.             todosOperations.ClickToDosButtons("Create Task 2", ".destroy");
  115.             $$("#todo-list li").find(exactText(elementPath)).hover().find(".destroy").click();
  116.  
  117.             тут - да, немного выиграл)
  118.  
  119.             а могло бы быть
  120.             tasks.delete("Create Task 2")
  121.             или вообще вот так
  122.             tasks.delete("t2")
  123.  
  124.             заметь - я чуть переписала
  125.              find(".destroy")
  126.              вместо
  127.              find(By.cssSelector(".destroy"))
  128.             технически - это одно и то же
  129.             у SelenideElement -
  130.             есть методы find и с параметром типа By, и со строковым параметром - чтобы сразу оперировать css селектором
  131.  
  132.             а вот после этой операции - проверки не достает)
  133.             каждая операция - должна быть проверена сразу
  134.             иначе - если возникнут ошибки - мы можем не разобраться в их причинах
  135.  
  136.             нам нужно убедиться что
  137.                 операции выполняются
  138.                 операции выполняются с ожидаемым нами результатом
  139.  
  140.             вопрос - что поясняет комментарий   //- Task #5?
  141.             мне не становится понятнее, например
  142.             а значит - насколько он нужен?
  143.         */
  144.  
  145. //- Task #6
  146.         todosOperations.ClickToDosButtons("Create Task 4", ".toggle");
  147.         /*
  148.             для закомпличивания таски - нам не нужно выполнять hover
  149.             чекбокс toggle - и так видим
  150.             достаточно его просто найти внутри таски
  151.  
  152.             лишние действия - не стоит выполнять
  153.             все же стоит делать ровно то, что необходимо для выполнения операции
  154.  
  155.             возможно, как какие-то дополнительные тесты, имеют право на жизнь
  156.             когда мы одно и то же действие делаем разными способами
  157.             мы подобное далее на курсе рассмотрим
  158.  
  159.             но - в первом приближении - всегда автоматизируем базовый функционал
  160.             самый стандартный из способов выполнения операции
  161.  
  162.             сравниваем
  163.             todosOperations.ClickToDosButtons("Create Task 4", ".toggle");
  164.             $$("#todo-list li").find(exactText("Create Task 4")).find(".toggle").click();
  165.  
  166.             выигрыш в лаконичности - есть, но не большой)
  167.  
  168.             а могло бы быть
  169.             tasks.xxxx("Create Task 4")
  170.             tasks.xxxx("t4")
  171.  
  172.             xxxx - подумай над именем метода
  173.             попробуй вот это учесть
  174.             https://docs.google.com/document/d/10qSwWTQ6pGfVZSwOes-1QSmdflMiGD2U_y53VHq2m20/edit#bookmark=kix.x92tktmmfsz2
  175.  
  176.             насчет проверки после этой операции...
  177.             тут ситуация поинтереснее
  178.             в принципе - проверку можно отложить на 1 шаг
  179.             и проверить состояние списка тасок после clear completed
  180.                 так можно поступить - т к проверка текстов тасок после закомпличивания таски
  181.                 даст нам проверку логики = все таски на all фильтре отображаются независимо от своего статуса,
  182.                 но не даст проверку факта закомпличивания
  183.                 это мы как раз допроверим после clear completed
  184.                 проверка текстов после clear completed как раз этот факт и допроверит
  185.         */
  186.  
  187. //- Task #7
  188.         $("#clear-completed").hover().click();
  189.         /*
  190.             тут тоже hover() ни к чему
  191.  
  192.             в случае с удалением таски - благодаря hover() на таске - мы делали видимой кнопку для удаления
  193.             тут - все видно изначально)
  194.             мы можем просто кликать на нужном элементе
  195.  
  196.             нужна проверка после действия
  197.         */
  198.  
  199. //- Task #8
  200.         todosOperations.ClickToDosButtons("Create Task 3", ".toggle");
  201.         todosOperations.ClickToDosButtons("Create Task 1", ".toggle");
  202.         todosOperations.ClickOperationButtons("All");
  203.         /*
  204.             тут имелось в виду - другое действие
  205.             с использованием вот этого переключателя
  206.             http://joxi.ru/p275M9zs0eBkVr
  207.  
  208.             перепиши этот кусок кода
  209.  
  210.             по аналогии с complete task 4 & clear completed -
  211.             тут тоже можно проверку отложить на после clear completed
  212.         */
  213.  
  214. //- Task #9
  215.         $("#clear-completed").hover().click();
  216.         /*
  217.             проверка?
  218.         */
  219.     }
  220. }
  221. /*
  222.     резюме насчет реализации тест-класса
  223.  
  224.     согласна, упрощать не хочется)
  225.     избавляться от вспомогательного класса CommonActions - странный поступок)
  226.  
  227.     но - сделать код нужно - не только DRY,но и KISS
  228.     в написании тестов зачастую KISS важнее DRY
  229.     погугли про эти принципы
  230.     мы дальше про это будем еще разговаривать не раз)
  231.  
  232.     если полученный код - едва ли не такой же, какой ты в этом коде спрятал
  233.     то есть ли выигрыш?
  234.     при таких раскладах KISS выполняется хуже DRY
  235.     тебе, когда ты подзабудешь код, или кому-то другому
  236.     глядя на такой код - придется не только разобраться с селенидовским синтаксисом
  237.     но - и с твоим привнесенным
  238.     вывод - если привносить - то только простой и наглядный синтаксис)
  239.  
  240.     в случае, если мои комментарии - про то, как переделать работу с объектом CommonActions
  241.     сложны - пока предлагаю упростить версию максимально - просто в тест-методе выполняй нужные шаги
  242.     без использования вспомогательных методов
  243.     буквально на следующем шаге - упростим
  244.     а если все ок - так и не упрощай)
  245.  
  246.  
  247. */
  248. ***************************
  249. /*
  250.    ты спрашивал
  251.         у меня была идея сделать список, положить туда значения тудушек,
  252.         и из него в форИче заполнить, но наверное смысла для 4х штук нет
  253.  
  254.    на самом деле, тут 2 вопроса)
  255.         использовать ли для тестовых данных переменные
  256.         как можно реализовать добавление нескольких тасок, вызвав один метод
  257.  
  258.    начнем со второго вопроса)
  259.         почитай про varargs parameters http://www.linkex.ru/java/varargs.php
  260.         намекну - что можно реализовать добавление тасок - используя varargs parameters
  261.         в результате чего - будешь вызывать метод - tasks.add("t1", "t2", "t3", "t4")
  262.         если пока с этим сложно - отложи
  263.             это будет разобрано в следующем видео
  264.             пока - просто знай, что так реализовать  добавление тасок - можно)
  265.             технически можно, и это усложнение метода add оправдано - т к иногда в начале тест-метода
  266.             действительно - будет требоваться создать несколько тасок сразу - в рамках подготовки тестовой ситуации
  267.  
  268.    теперь первый вопрос)
  269.         он - не так прост, как кажется)
  270.         вообще - надо с осторожностью подходить к решению,
  271.         какие тестовые данные стоит выносить в переменные, а какие - нет
  272.  
  273.                 С вынесением тестовых данных в переменные надо быть осторожным - далеко не всегда это полезно.
  274.                 Часто тестовые данные разумно оставлять в логике самих тестов -
  275.                 таким образом код тестов более очевидный = KISS.
  276.                 Тут - как раз тот случай)
  277.  
  278.                 Используй в качестве текстов тасок что-то лаконичное
  279.                 (task1, task2 .../ t1,t2,..../ a,b,..../ 1,2,....)
  280.                 Тогда код будет по-прежнему наглядный и не загроможденный и при этом - простой для восприятия
  281.                 Важно - чтобы код теста был как можно более очевидным и простым - с первого взгляда на него.
  282.  
  283.                 И потому тестовые данные - как правило - не стоит выносить в переменные -
  284.                 чтобы не приходилось при анализе кода отвлекаться на то, что это за переменные,
  285.                 где объявлены или чем инициализированы.
  286.                 Почитай про KISS principle
  287.  
  288.                 Какие тестовые данные стоит выносить в переменные.
  289.                 То, что применяется в нескольких методах и является строго определенным (не произвольные данные,
  290.                 а какие-то конкретные). Пример - логин-пароль для аккаунта, или какие-то предопределенные данные -
  291.                 которые всегда есть на начало работы с приложением.
  292.  
  293.                 У нас - другой случай. Просто тестовые данные, которые нужны в единственном тест-методе.
  294.                 Эти данные не какие-то строго определенные - они такие, какими мы их решили сделать = произвольные
  295.                 И у нас нет цели использовать значение - длинные строки, которые будут загромождать код.
  296.                 В таких случаях - лучшим решением будет просто указывать в коде значения текстов тасок,
  297.                 без использования дополнительных переменных.
  298.                 Ну и, конечно, разумно остановиться на лаконичном варианте - для текстов тасок -
  299.                 чтобы код не загромождать.
  300.  
  301.                 Понимаю твое стремление разгрузить код тест-метода)
  302.                 Мы его разгрузим, но благодаря другому)
  303.                 Уже кое-что тебе в этом ревью показала,
  304.                 далее над этим будем работать
  305.  
  306. */
  307.  
  308.  
  309. public class CommonActions
  310. /*
  311.     если ты таки решил оставить класс - давай назовем его правильно)
  312.  
  313.     по сути - если ты учтешь мои пожелания выше - у тебя получится пейдж-объект
  314.  
  315.     таким объектам дают имена, заканчивающиеся на Page
  316.     (TodoMVCPage - будет ОК)
  317.  
  318.     и размешают в пекедже pages
  319.  
  320.     это мы сильно забежали вперед)
  321.  
  322.     но - с твоей подачи)))
  323.  
  324.     те элементы или коллекции - которые будут использоваться в нескольких методах - выноси в переменные
  325.     например
  326.         public ElementsCollection tasks = $$("#todo-list li");
  327.     цель - не повторять в коде - один и тот же селектор
  328.     в долгосрочной перспективе - это даст выигрыш - меньше придется подправлять код тестов при изменении
  329.     тестируемого приложения
  330.  
  331.     теперь можно используватьпеременную tasks как в коде этого класса
  332.     так и в коде тест-класса - уже нигде повторно не оперируем $$("#todo-list li")
  333.     используем переменную
  334. */
  335.  
  336.     public void ClickOperationButtons(String buttonName)
  337. /*
  338.     такой метод тебе пока не нужен вообще
  339.    
  340.     как переделать остальные - выше писала
  341. */
Advertisement
Add Comment
Please, Sign In to add comment