julia_v_iluhina

Untitled

Sep 18th, 2016
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.85 KB | None | 0 0
  1. src/main/java/com/todomvc/page/TaskManagerPage.java
  2.  
  3. /*
  4.     пекедж для пейджей (даже если он пока лишь один) - сразу стоит называть  pages
  5.  
  6.     когда пейдж лишь один для приложения TodoMVC - можно и пейдж назвать TodoMVCPage
  7.     будет понятно и однозначно
  8.  
  9.     когда есть несколько пейджей - тогда, конечно, имя пейджа должно быть точнее
  10.  
  11.     твой вариант имени класса пейджа - тоже ок
  12. */
  13. ************************************
  14. private ElementsCollection tasksSheet = $$(".view");
  15.  
  16. /*
  17.     мы оперируем коллекцией
  18.     что это за элементЫ = это таскИ
  19.     это не одна страница тасок, а именно коллекция тасок
  20.  
  21.     потому - тут уместнее имя tasks
  22.  
  23.     что касается селектора - можно его подобрать нагляднее и точнее
  24.  
  25.     http://joxi.ru/Q2KpJYOs9jW17A
  26.     внутри элемента с id = todo-list
  27.     есть элементы li
  28.     собственно - именно эти элементы li - и есть таски
  29.  
  30.     элементы с классом view - это уже подчиненные элементы тасок
  31.     пока мы реализовываем удаление или закомпличивание таски - все ок -
  32.     нам достаточно коллекции $$(".view")
  33.  
  34.     а как дело дойдет до редактирования таски - нам понадобится именно коллекция элементов li
  35.  
  36.     строй селектор, оттолкнувшись от элемента с id = todo-list
  37.     именно это даст наглядность и бОльшую точность
  38.  
  39.     если просто получать элементы $$("li") или $$(".view") - слишком велика вероятность, что
  40.     в приложении будут еще элементы, помимо тасок, которым такой локатор подойдет
  41.  
  42.  
  43. */
  44. *********************************
  45.     public void create(List<String> taskNames) {
  46.  
  47.         for (String name : taskNames) {
  48.             $("#new-todo").setValue(name).pressEnter();
  49.         }
  50.     }
  51. /*
  52.     будет удобнее работать с методом, у которого параметр  String ... taskNames
  53.  
  54.     это никак не повлияет на реализацию метода
  55.     но - упростит его вызов
  56.  
  57.     http://www.linkex.ru/java/varargs.php
  58. */
  59. *****************************************
  60.     public void switchTask(String taskName) {
  61.  
  62.         tasksSheet.findBy(text(taskName)).find(".toggle").click();
  63.     }
  64. /*
  65.     посмотри перевод слова toggle
  66.     раз у нас на уровне реализации самого приложения - есть подходящее слово toggle
  67.     так его разумнее и использовать в качестве термина
  68.     toggle = переключить
  69.  
  70.     в других методах - в имени метода ты не уточнялся до Task
  71.     и тут тоже стоит не уточняться - чтоб единообразно было
  72.     toggle(String taskName)
  73.  
  74.     по реализации - практически все ок
  75.  
  76.     единственный момент
  77.     есть кондишен text - тут проверяется условие - в текст элемента входит  такой-то текст
  78.     а есть кондишен exactText - тут уже проверяется - текст элемента равен такому-то тексту
  79.  
  80.     использовав exactText - получишь более точный результат
  81. */
  82. ******************************
  83.     public void switchAll() {
  84.  
  85.         for (SelenideElement label : tasksSheet) {
  86.             label.$(".toggle").click();
  87.         }
  88.     }
  89. /*
  90.     по имени метода - то же самое - термин toggleAll - будет уместнее
  91.  
  92.     по реализации - речь шла об использовании вот єтого чекбокса http://joxi.ru/12MDGYXu4jLN3m
  93.  
  94.     в прошлом ревью писала про это) - строки 212-213
  95. */
  96. ************************************
  97. public class TodoMVCTest {
  98.  
  99.     private TaskManagerPage page = new TaskManagerPage();
  100.  
  101.     private List<String> listOfTasks = Arrays.asList("task1", "task2", "task3", "task4");
  102.     /*
  103.         какие тестовые данные стоит выносить в переменные, а какие - не стоит - важный вопрос)
  104.         и тут надо быть осторожным - лишних усложнений без причин не стоит делать)
  105.         В данном случае - нам точно переменные для тестовых данных - ни к чему
  106.         далее на курсе - будут примеры, когда мы будем для тестовых данных использовать переменные.
  107.         Но - это скорее исключения из общего правила )
  108.  
  109.         Приведу коммент Якова для другого студента - на эту же тему -
  110.         почему не нужно тестовые данные выносить в переменную
  111.  
  112.         логика твоего решения должна быть такой:
  113.           поcкольку селениум тесты тяжелые и не быстрые в выполнении -
  114.           то в большом количестве они не эффективны (даже если их параллелить)
  115.  
  116.               поэтому в селениум тестах не выгодно проверять разные детали -
  117.               такие, как "разность поддерживаемых текстов для ввода в какое-то поле"
  118.  
  119.               поэтому в селениум тестах стоит проверять только высокоприоритетные функциональные вещи
  120.               (а остальное - выгодней проверять в юнит тестах, вспомни пирамиду тестирования)
  121.               http://martinfowler.com/bliki/TestPyramid.html
  122.  
  123.           а значит - нам не важно, какой будет текст
  124.           а значит - мы можем с чистой совестью следовать правилу:
  125.           "тесты должны быть читабельны и наглядны в первую очередь"
  126.  
  127.           а значит - мы можем упростить тексты даже до чего-то типа "1", "2", "3", ... или "a", "b", "c"
  128.  
  129.           и также  - мы не должны скрывать эти тестовые данные, которые являются частью тестовой логики
  130.           а значит - помещать их в переменные - не стоит
  131.           это два :)
  132.  
  133.         и даже если эти тексты поменяются, например мы решили поменять "1", "2", "3" на "a", "b", "c"
  134.         по какой то причине
  135.         то find&replace никто не отменял ).
  136.         В этом случае, когда у нас тестовые данные подвязаны к тестовой логике тестов в одном классе -
  137.         это совсем не проблема.
  138.         это три.
  139.  
  140.         да, DRY это хорошо. но тебя ему учили скорее всего автоматизаторы,
  141.         которые всю жизнь мечтали стать разработчиками, но так и не осилили :)
  142.         DRY - это один из самых важных принципов в разработке, но не в автоматизации.
  143.         По причинам, которые я уже описывал ранее, DRY - не катит, ибо ухудшает обычно наглядность и очевидность,
  144.         которая в тестах - самая важная.
  145.         Поэтому в тестах, обычно, принцип KISS более важный чем DRY.
  146.  
  147.         Посмотри доклады Андрея Солнцева. Зацени, как он вообще динамит этот DRY в тестах.
  148.         А они в своем codeborne, выпускают банковские продукты совсем без тестировщиков ;)
  149.  
  150.         Это что-то да значит. Да и много других докладов есть на эту тему.
  151.         Кажется вот в этом докладе еще об этом идет речь: https://www.youtube.com/watch?v=uU2bJPK6Irw
  152.  
  153.         Так что рекомендую выкинуть переменные нафиг :)
  154.  
  155.     */
  156.  
  157.     @Test
  158.     public void testTodoMvc() {
  159.     /*
  160.         имя тест-метода - ничего не уточнило)
  161.  
  162.         про TodoMvc - в имени тест-класса уже написали
  163.         тут - повторяться не нужно
  164.  
  165.         посмотри вот эти советы
  166.         https://docs.google.com/document/d/10qSwWTQ6pGfVZSwOes-1QSmdflMiGD2U_y53VHq2m20/edit#bookmark=id.txqig9rkgybo
  167.  
  168.     */
  169.         open("https://todomvc4tasj.herokuapp.com/");
  170.         /*
  171.             используй пропуски строк - как средство форматирования кода
  172.             отделяй блоки кода друг от друга
  173.             вот тут бы я пропустила строку
  174.         */
  175.         page.create(listOfTasks);
  176.         /*
  177.             с учетом выше написанного про тестовые данные
  178.             и про изменение типа параметра метода create - тут будет код попроще
  179.  
  180.             page.create("task1", "task2", "task3", "task4");
  181.  
  182.             писала про проверки - строки 352-356
  183.  
  184.             каждое действие в тест-методе - должно быть проверено
  185.             как правило - сразу
  186.             в некоторых случаях - можно отложить проверку
  187.  
  188.             как тут, например
  189.             можно проверить состояние списка тасок - после добавления всех 4 тасок
  190.             рассуждения простые - действия мы выполняли однотипные
  191.             потому - даже если проверка списка тасок после добавления нескольких тасок упадет
  192.             мы все равно поймем - с какой операцией у нас проблемы
  193.  
  194.             тут - нужна проверка
  195.  
  196.             и далее по коду - все действия должны быть проверены
  197.             еще посмотри на текст в строках 397-407 прошлого ревью - учти эти моменты
  198.         */
  199.         page.delete("task2");
  200.         page.switchTask("task4");
  201.         page.clearCompleted();
  202.         page.switchAll();
  203.         page.clearCompleted();
  204.     }
  205. }
Advertisement
Add Comment
Please, Sign In to add comment