julia_v_iluhina

Untitled

Dec 28th, 2016
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.20 KB | None | 0 0
  1. public static ExpectedCondition<Boolean> ajaxCompleted = new ExpectedCondition<Boolean>() {
  2. /*
  3.     т е - реализовывать не метод, а статическую переменную
  4.     вроде бы - лаконичнее, что хорошо
  5.  
  6.     но - не так уж и хорошо)
  7.  
  8.     Тут есть такая тонкость)
  9.  
  10.     мы создали статические переменные = объект-кондишен
  11.  
  12.     и используем их в проекте, который поддерживает параллелизацию
  13.  
  14.     если мы в параллельных тестах будем использовать ОДИН объект-кондишен ОДНОВРЕМЕННО
  15.     могут возникать странные ошибки
  16.  
  17.     чтобы избежать этого
  18.     вместо переменных стоит использовать методы
  19.     тогда для каждого вызова кондишена мы будем использовать свой объект
  20.     и таких проблем не будет
  21.  
  22.     вариант с методом - грамотнее)
  23. */
  24. ******************
  25.     for (String taskName : taskNames)
  26.             add(taskName);
  27.  
  28. /*
  29.     сама на автопилоте так пишу)
  30.     но по конвеншенсам - нужны фигурные скобки все равно
  31.  
  32.     https://google.github.io/styleguide/javaguide.html#s4.1.1-braces-always-used
  33.  
  34.     все логично - потом начнем дописывать код
  35.     про скобки не подумаем
  36.     вот и ошибка
  37.  
  38.     в долгосрочном периоде - это такая защита от глупых случайных ошибок
  39. */
  40. *****************************************
  41. private By tasks = By.cssSelector("#todo-list li");
  42. //можно проще
  43. private ElementsCollection tasks = $$("#todo-list li");
  44. //а еще лучше - вот так
  45. private ElementsCollection tasks = $$("#todo-list>li");
  46. /*
  47.     Вся перелесть селенидовских коллекций и элементов в том - что когда ты их объявляешь и инициализируешь
  48.     еще ничего не происходит
  49.     это можно делать заранее
  50.     фактически - мы просто описываем - как нам найти элемент или коллекцию
  51.  
  52.     а реальный поиск элементов/списков элементов
  53.     будет происходить уже когда будут вызываться методы-проверки или методы-действия
  54.  
  55.     что касается селектора "#todo-list>li"
  56.     то он - точнее
  57.     для нашего примитивного прилодения - и твой вариант ок
  58.     но иногда эта разница бывает существенной
  59.     http://www.w3schools.com/cssref/css_selectors.asp
  60.  
  61.     если tasks объявили как
  62.         ElementsCollection tasks = $$(...);
  63.     то используем его
  64.         не  $$(tasks).findBy(...
  65.         а      tasks.findBy(....
  66.     Ведь tasks - уже коллекция
  67.  
  68. */
  69. ************************
  70. public TaskPage destroy(String... taskNames) {
  71. /*
  72.     так - нам точно не нужно
  73.  
  74.     почему мы реализовали  add(String... taskNames)
  75.     потому что - иногда на начало теста - нам сразу нужно добавит несколько тасок
  76.  
  77.     и там как раз - такие обстоятельства - что мы вполне можем не делать проверки после каждого действия
  78.     а с другими операциями - совершенно другая история
  79.     у нас не будет ситуаций, когда
  80.         во-первых - нужно сделать их массово для нескольких тасок
  81.         во-вторых - можно пропустить проверки после каждого шага, и сделать их после последнего шага
  82.  
  83.     включить проверки нормальные - в такой метод тоже не получится, просто технически
  84.     т к такие проверки - если они точные и проверяют состояние всего списка тасок
  85.     будут зависеть от контекста
  86.     да и вообще это не очень хорошая практика - прятать в шаге - проверку
  87.     или наоборот - в проверке - шаг
  88.     так логика теста - будет замыливаться, по коду теста  - будет не понятно - что и когда мы делали и/или проверяли
  89.  
  90.     на курсе мы еще разберем - как это делать правильно
  91.     (включать в шаг проверку или в проверку - шаг)
  92.     но это все - исключения из правил
  93.     а правило такое - не надо прятать проверки в шаге и в шагах - проверки
  94.  
  95.     что до реализации метода
  96.     его конечно реализовывать - не нужно было
  97.     но уже если делать - то чтоб он был надежнее и проще - лучше сделать вот так
  98.     for (String taskName : taskNames) {
  99.         destroy(taskName);
  100.     }
  101.     и все)
  102.  
  103.     вариант обхода - for (SelenideElement e : $$(tasks))
  104.     плох тем, что на момент старта обхода - на странице  могут  еще недогрузиться элементы в списке
  105.     получается - ненадежно и код раздутый
  106.  
  107.     а в мной предложенном варианте - каждый раз делая  destroy(taskName)
  108.     мы, фактически, дожидаемся - что таска с таким именем в списке есть
  109.     и начинаем с ней работать
  110.  
  111. */
  112. *******************************
  113. public TaskPage completedShouldHaveTexts(String... texts) {
  114. public TaskPage completedListShouldBeEmpty() {
  115. /*
  116.     Методы реализованы пристойно
  117.  
  118.     но - они все равно не нужны)
  119.     про это Яков говорил в видео
  120.     https://drive.google.com/file/d/0B8hgIBw8-V-AUDhxWDg1YmYxM3c/view?usp=sharing
  121.     примерно с 58-ой минуты, минут 5-7 посмотри
  122.  
  123.     тут, в этом задании
  124.     мы ограничены условием - нам нужно именно такой сценарий покрыть
  125.  
  126.     далее - мы просто будем проверять закомпличивание или переоткрытие таски(тасок)
  127.     в более интересных и полезных для себя обстоятельствах
  128.  
  129.     пример
  130.  
  131.     мы на All фильтре
  132.     закомплитили таску
  133.     проверили тексты всех тасок = проверили часть логики = на all фильтре все таски отображаются в списке вне зависимости от статуса
  134.  
  135.     перешли на Active
  136.     проверили тексты всех видимых тасок =
  137.         точно провелили фильтеринг
  138.             фильтеринг работает, т к состояние списка тасок изменилось
  139.             фильтеринг работает правильно, т к новое состояние списка тасок верное
  140.         и допроверили закомпличивание = таска закомпличена
  141.             причем - мы это првоеряли именно с точни зрения функциональности
  142.             а не проверок UI (User Interface)
  143.  
  144.      тут, в этом задании, мы можем себе позволить
  145.         вариант 1 - пропустить проверки после закомпличивания
  146.         вариант 2 - проверить тексты всех тасок (= проверить = на all фильтре все таски отображаются в списке вне зависимости от статуса)
  147. */
  148. *********************************
  149. public TaskPage shouldHaveTexts(String... texts) {
  150. public TaskPage listShouldBeEmpty() {
  151. /*
  152.     при нейминге - старайся придерживаться одной логики для похожих случаев
  153.  
  154.     shouldHaveTexts - мы не уточняли, что работаем со списком тасок (подразумевали это)
  155.     listShouldBeEmpty() - а тут уже уточнили, причем ДО слова should
  156.  
  157.     т е - теперь - мы то начинаем названия методов-проверок со слова should, то нет
  158.     и то уточняемся до list, то нет
  159.  
  160.     варианты
  161.         shouldHaveTexts(String... texts)
  162.         shouldBeEmpty()
  163.         с учетом имени пейджа - проде как достаточно
  164.  
  165.         или вот так
  166.         assertTasks(String... taskNames)
  167.         assertNoTasks()
  168.         тут мы уже ничего не скрываем
  169.         и строим фразы - по одним и тем же правилам
  170.         https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.sswzyp7qkm9o
  171.  
  172. */
  173. **************************
  174. String... texts
  175. //или
  176. String... taskNames
  177. /*
  178.     Определись с термином
  179.  
  180.     придерживайся правила -
  181.     для одного понятия = используем один термин
  182.  
  183.     никаких разных терминов/синонимов/сокращений
  184.  
  185.     тогда код будет проще понимать, он будет однозначнее
  186.  
  187.     звучит как придирка)
  188.     но ты удивишься, насколько эти мелочи в итоге влияют на восприятие кода, особенно чужого
  189.     или своего, хорошо забытого )
  190.  
  191.     если выберешь taskNames, к примеру
  192.     то для одной таски - получишь - соответственно - taskName
  193. */
  194. ***************************************
  195. public class TodoMVCTest extends BaseTest {
  196. /*
  197.     не понимаю ценности BaseTest
  198.     поясни, что из реализованного в BaseTest - ценно
  199. */
  200. *****************************
  201.   page.destroy("2", "3")
  202. /*
  203.     не фантазируй)
  204.     это будешь в следующей задаче делать)
  205.     тут - нужно удалить лишь таску 2
  206.  
  207.     да и если бы требовалось удалить 2 таски - были бы нужны проверки - после каждого шага
  208.  
  209.     общее правило такое - каждый шаг должен быть проверен
  210.  
  211.     у правила есть исключения
  212.     можно пропустить проверку - если мы при этом не потеряем в точности
  213.     например - когда мы проверили тексты тасок аж после добавления четвертой таски
  214.     даже если на этой проверке - тест упадет
  215.     все равно - мы будем знать - что у нас проблема с добавлением таски
  216.     т е - точности мы не потеряли
  217.  
  218.     а вот с destroy("2", "3") - другая история уже
  219.     тут пропуск проверки повлияет на точность проверок
  220.  
  221.     почему точность проверок - это так важно
  222.     если мы сэкономили на проверках - вроде как хорошо - тест быстрее бегает
  223.     но - во-первых - мы можем банально пропустить ошибку
  224.     во-вторых - по возникшей ошибке - не сможем БЫСТРО сказать - что не работает - то-то
  225.     будем какое-то время - разбираться
  226.     так что - экономия на проверках - плохая экономия)
  227. */
  228. *************************
  229. page.clearCompleted();
  230. page.completedListShouldBeEmpty();
  231. /*
  232.     после clearCompleted() - точно стоит проверить тексты всех тасок, а не только закомпличеных
  233.     про проверки после закомпличивания - писала выше
  234. */
Advertisement
Add Comment
Please, Sign In to add comment