julia_v_iluhina

Untitled

Jan 7th, 2017
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 19.49 KB | None | 0 0
  1.     @After
  2.     public void afterMethod() {
  3.         clearLS();
  4.         getWebDriver().navigate().refresh();
  5.     }
  6. /*
  7.     спорно - стоило ли выносить в отельный метод clearLS() - очистку локалсториджа
  8.     да еще и в имени метода - сокращать слова
  9.  
  10.     ведь эта строка кода - очистка локалсториджа - нужна только тут
  11.     и больше нигде
  12.     нет смысла такую строку далеко прятать
  13.  
  14.     насчет рефреша
  15.     в selenide - есть метод refresh()
  16.     технически - то же самое
  17.     просто лаконичнее
  18.  
  19.     да и не нужно его делать
  20.     в бифор-методе - открытие урла - рефреш выполнится и все ок будет
  21.  
  22.     в более ранних версиях todoMVC приложения - такой рефреш был нужен
  23.     теперь - нет
  24.  
  25.     т е - можно
  26.         - бифор и афтер методы - назвать нагляднее
  27.         - не делать там лишнего
  28.         - не заворачивать код лишний раз в метод - раз он нужен только здесь
  29.  
  30.     получим:
  31. */
  32.     @Before
  33.     public void visit() {
  34.         page.visit();
  35.     }
  36.  
  37.     @After
  38.     public void clearData() {
  39.         executeJavaScript("localStorage.clear();");
  40.     }
  41. ********************************************************
  42.     @Test
  43.     public void editEnterAll() {
  44.  
  45.         //given
  46.         page.add("1")
  47.                 .toggle("1")
  48.                 .goCompleted();
  49.  
  50.         // test
  51.         page.editEnter("1", "edited1")
  52.                 .shouldHave("edited1")
  53.                 .shouldBeItemsLeft(0);
  54.     }
  55. /*
  56.     editEnter - не лучшее описание действия
  57.  
  58.     edit - уже лучше - т к именно это и есть стандартный вариант редактирования
  59.     можно startEditThenPressEnter - но зачем столько текста
  60.  
  61.     проверяем - на Completed фильтре
  62.     стоит перед именем фильра - использовать предлог At/On - чтоб подчеркнуть -
  63.         что речь о фильтре
  64.         о том - где мы это делаем
  65.  
  66.     так что - правим название тест-метода и вспомогательного метода
  67.  
  68.     и до кучи - избавляемся от комментария // test
  69.     т к - где гивен-блок, а где остальное - и так ясно
  70.     благодаря пропущенной строке и комментарию //given
  71.  
  72.     получим:
  73. */
  74.     @Test
  75.     public void editAtCompleted() {
  76.  
  77.         //given
  78.         page.add("1")
  79.                 .toggle("1")
  80.                 .goCompleted();
  81.  
  82.         page.edit("1", "edited1")
  83.                 .shouldHave("edited1")
  84.                 .shouldBeItemsLeft(0);
  85.     }
  86. ************************************************
  87.     editCancel
  88. /*
  89.     термин editCancel - не удачный
  90.  
  91.     обычно - имя метода = глагол(что делаем)+уточнения
  92.     мы - отменяем редактирование = cancelEdit
  93.  
  94.     если хочется подчеркнуть последовательность действий
  95.     то startEditThenCancel
  96. */
  97. ******************************************
  98. /*
  99.     что хорошо - что в фиче-тестах -
  100.     ты использовал разные тестовые ситуации
  101.     это очень полезно в плане покрытия
  102.  
  103.     далее - будем реализовывать полное покрытие
  104.     как раз там - это учтем в полной мере
  105.  
  106.     будут у нас тесты для одной фичи на разных фильтрах
  107.      и там - будем использовать разные ситуации
  108.      поработать с единственной таской
  109.      поработать со второй таской
  110.      поработать с единственной видимой таской(а есть еще и не видимые)
  111.  
  112.     ну то потом будет)
  113.      там мы и гивен-действия - поэффективнее реализуем)
  114. */
  115. ***************************************
  116. /*
  117.     версия - отличная)
  118.     тест-план - шедевр
  119.  
  120.     вот эти мелочи - учтти уже в новом задании
  121.     эти правки - выносить на ревью - несерьезно)
  122.  
  123.     крутой, что сказать)
  124. */
  125. *************************************************************
  126. ===================================================================
  127. 1. "вместо того, чтоб заводить переменную editingTask
  128.   ....
  129.  
  130.            >>>>>>>> гениально!
  131. /*
  132.    ага
  133.    и очень просто)
  134. */
  135. ===================================================================
  136. 2. "сравни $(".editing .edit")
  137.     и tasks.findBy(...).find(...)
  138.     во втором случае - суть длиннее
  139.     но - нагляднее и понятнее - с чем мы работаем"
  140.  
  141.        >>>>>>>> гениально! не додумался...
  142. /*
  143.    обязательно масштабируй этот момент
  144.    выручает и сильно
  145.  
  146.    идем от общего к частному (именно так - даже с точки зрения того - как подбираться к нужным элементам по html структуре)
  147.    и активно используем уже существующие переменные
  148.  
  149.    самые неожиданные выгоды от этого подхода получаю)
  150. */
  151. ===================================================================
  152. 3. "сравни
  153.     shouldBeItemsLeft
  154.     shouldItemsLeft
  155.     мне кажется - второй вариант - попонятнее
  156.     ?"
  157.  
  158.        >>>>>>>> с точки зрения англ shouldBe должен быть, да и как
  159.                по мне понятнее все таки shouldBe, нежели should
  160. /*
  161.    идеально наверное, вообще вот так -
  162.    page.itemsLeft().shouldBe(...)
  163.  
  164.    ну то потом так напишем)
  165.  
  166.    щас - не буду спорить
  167. */
  168. ===================================================================
  169. 4. "по первым строчкам методов
  170.     т к приложение простенькое - можно вполне обойтись вариантом
  171.     $(By.linkText(...))
  172.     для приложения посложнее я бы применяла
  173.     $$("#filters>li").findBy(exactText("..."))
  174.     а т к $$("#filters>li") - повторялся бы трижды
  175.     то вынесла бы $$("#filters>li") - в переменную пейджа"
  176.  
  177.        >>>>>>>> гениально! это сразу столько проблем решает...
  178.                чет я как то туплю маленько :\
  179. /*
  180.    это можно научиться видеть
  181.    ты так точно научишься )
  182. */
  183. ===================================================================
  184. 5. " public TaskPage goCompleted() {
  185.              $("#filters>li:nth-of-type(3)>a").click();
  186.              tasks = $$("#todo-list>li.completed");
  187.              return this;
  188.          }
  189.  
  190.         по второй строчке
  191.         это зло)
  192.         ты добавил магии, и сильно"
  193.  
  194.            >>>>>>>> чет я не подумал об этом...хотел сделать как
  195.                    лучше, а получилось как всегда :/ еще и про
  196.                    многопоточность не подумал, а если несколько
  197.                    тестов пользовалось бы одной пейджой то все
  198.                    пошло бы .... из за не final переменной
  199. /*
  200.    ну, поскольку ты пейдж создаешь как объект - думаю все ок было бы)
  201.    хотя конечно от конкретики многое бы зависело)
  202.  
  203.    как оказалось - очень удобно immutable свойства объекта сразу final объявлять
  204.    потом Idea - сама подсказывает, что тоже снимает часть вопросов)
  205. */
  206. ===================================================================
  207. 6. "чтоб потом вызывать такой метод
  208.         startEdit(fromTaskName, toTaskName).pressEnter();"
  209.  
  210.            >>>>>>>> гениально! опять)
  211. /*
  212.    вот этот подход - мы чуть позже - разовьем и усугубим)
  213.  
  214.    сейчас - мы просто повторяющиеся действия вынесли в отдельный метод
  215.  
  216.    а далее - для чуть более сложных ситуаций - применим подход с виджетами
  217.    там - некие групы элементов страницы - будем описывать как отдельный объект
  218.  
  219.    это так, спойлер пока)
  220.  
  221.    делюсь впечатлениями от виджет-подхода
  222.    сейчас его применяю на живом проекте - достаточно сложный сайт -
  223.    получается удобно и наглядно
  224.  
  225.    конечно, требует квалификации того, кто пишет код
  226.    но в итоге - проект только выигрывает
  227.  
  228. */
  229. ===================================================================
  230. 7. "имена методов
  231.         editEnter - я бы в данном случае - не уточнялась до энтера - т к это стандартная реализация редактирования
  232.         как доберемся до автоматизации additional edit operations - там уже будем уточняться"
  233.  
  234.            >>>>>>>> я уточнил до энтера потому что у нас не
  235.                    один метод edit, уже. а будет больше)
  236. /*
  237.    про энтер - как раз можно и не уточняться
  238.    типа - дефолтное поведение - и так ясно
  239.  
  240.    ну и варианты тут есть для additional edit operations
  241.    confirmEditByPressTab
  242.    confirmEditByClickOutside
  243.    deleteByEmptyingText
  244.  
  245.    ну или как я выше писала
  246.    описывай последовательность действий
  247.    мне вариант с описанием действий нравится меньше
  248.    т к при прочтении такого - придется думать больше)
  249.    самому додумывать - и что в итоге мы делали
  250.  
  251.    думаю - начинать с главного=что делаем и лишь потом уточняться=как делаем
  252.    более выигрышная стратегия для имен методов
  253. */
  254. ===================================================================
  255. 8. " editCancel - тоже с недостатками
  256.             что мы делаем = отменяем редактирование = cancelEdit
  257.             а если хочется подчеркнуть последовательность действий - startEditThenCancel
  258.             что-то такое"
  259.  
  260.                >>>>>>>> назвал начиная с edit чтоб можно было в тесте
  261.                        писать .edit и идея подсказывала бы все
  262.                        варианты, проще было бы) ну и это в принципе
  263.                        суб-функционал edit-а, поэтому и название
  264.                        начинается с edit
  265. /*
  266.    выше описала варианты
  267.  
  268.    мой фаворит - cancelEdit
  269.    от общего к частному)
  270. */
  271. ===================================================================
  272. 8. "по тест-плану
  273.  
  274.     https://docs.google.com/spreadsheets/d/1eAw67UrF58vyCf0Fk7f9hzoFFICgkeYVhhrph4XSb5g/edit#gid=0
  275.  
  276.     /*
  277.         мы - по-прежнему - планируем smoke
  278.         это значит покрываем только высокоприоритетное и ТОЛЬКО на одном контексте
  279.  
  280.         и еще - один фиче-тест - проверяет одну фичу
  281.         лишь одну
  282.  
  283.         фактически - разгрузив наш е2е (что ты успешно сделал)
  284.         надо было допокрыть фиче-тестами
  285.         http://joxi.ru/Rmzqpx8H00kn1r
  286.         3 штуки - для каждого действия
  287.         и в рамках проверок в фиче-тестах - второй проверкой - покрой проверку items left
  288.         просто потому что по пути и это почти ничег не стоит
  289.  
  290.         у тебя реализованы - не фиче-тесты
  291.         а небольшие е2е тесты
  292.         учти по оформлению фиче-тестов"
  293.  
  294.             >>>>>>>> так хотелось покрыть побольше... ну ладно, смоук так смоук)
  295.                     изменил в плане в и коде
  296. /*
  297.     будет тебе и полное покрытие)
  298.     не торопись)
  299. */
  300. ===================================================================
  301. 8. еще такой вопрос по поводу
  302.  
  303.     public TaskPage shouldBeItemsLeft(int itemsCount) {
  304.         $("#todo-count>strong").shouldHave(exactText(String.valueOf(itemsCount)));
  305.         return this;
  306.     }
  307.  
  308.     получается в зависимости от того есть ли таски или нет, проверка
  309.     shouldBeItemsCount(0) должна по разному работать (или в элементе 0,
  310.     или вообще футера нет). это нужно сейчас реализовывать?
  311. /*
  312.     видим футер или нет - такой функционал, не очень-то приоритетный
  313.     даже если футер окажется видим, когда не должен быть видимым - потеря небольшая )
  314.     приложение все еще можно успешно юзать
  315.  
  316.     проверяя - $("#todo-count>strong").shouldHave(exactText(...
  317.     мы косвенно проверяем - что футер видим
  318.  
  319.     а вот стоит ли проверять - что футер не видим....
  320.     я б не стала
  321.     в виду невысокого приоритета такой фичи
  322.  
  323.     а если б стала - то не запихивала в этот метод варианты
  324.     а написала отдельно assertFooterIsInvisible
  325.     и отдельно в тест-методе такую проверку уместно вызывала
  326.  
  327.     цель - не скрывать во вспомогательных методах тестовую логику
  328.     пусть будут "кишки наружу" - из кода тест-метода - чтоб было понятно
  329.     когда такая ситуация ожидается - что футер не видим
  330.  
  331.     в итоге - при таком подходе - только из кода тест-метода
  332.     не детализируясь до реализации кода во вспомогательных методах -
  333.     уже все ясно - что делаем и как делаем
  334.  
  335.     индикатор - что мы не увлеклись -
  336.     это названия вспомогательных методов - точно отражают то, что в них происходит
  337.     что мы не скрываем важного в них
  338.  
  339.     еще вариант
  340.     наверное - ты уже видел в видео
  341.     когда Яков предлагает проверять не видимость кнопки clear Completed
  342.     после нажатия на нее - прямо внутри метода  clearCompleted
  343.     такой вариант допустим, когда
  344.         этот нюанс - не важен
  345.         и нам не нужно его анализировать на уровне тест-методов
  346.  
  347.         в частности, Яков предложил таким образом - улучшить покрытие, просто по пути покрыв этот нюанс
  348.         типа - нам ничего не стоило это покрыть
  349.         но выносить на уровень тест-метода - не надо - т к это слишком мелкая деталь
  350.  
  351.     мы и в этом случае  - могли бы что-то подобное реализовать
  352.         если бы у нас было 4 проверки состояния списка тасок (2 - списка тасок для не фильтрованного по visible, 2 - для фильтрованного)
  353.         так вот в таком случае - в проверке - что список тасок пуст - можно было бы встроить второй проверкой - проверку на не видимость футера
  354.         типа - не так важно, чтоб выносить на уровень тест-метода
  355.  
  356.     я не советую делать выше описанного)
  357.          без каких-то дополнительных отягчающих обстоятельств - я бы невидимость футера не проверяла
  358.          именно из-за невысокого приоритета этой фичи
  359.  
  360.          а были бы отягчающие - использовала бы вариант "кишки наружу" )
  361.    
  362.     вообще - когда в методе-действии есть проверка или в методе-проверке - есть действие
  363.         ну или в одной проверке - другая проверка
  364.         или в действии - еще какое-то незаявленное действие
  365.        
  366.         всегда - должны быть конкретные причины или цели для такого
  367.         в общем случае - это скрывает тестовую логику и это плохо
  368.        
  369.         будут еще примеры - когда мы будем так делать - (например - в методах-действиях делать проверку)
  370.         как раз - разберем - зачем и почему
  371.        
  372.    
  373. */
  374. ===================================================================
Advertisement
Add Comment
Please, Sign In to add comment