julia_v_iluhina

Untitled

Jul 24th, 2016
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 20.79 KB | None | 0 0
  1. public class WithReportedScreenshotsPerTest {
  2.    
  3.  ...
  4.    File screenshot = Screenshots.getScreenShotAsFile();
  5. /*
  6.     Наверное, у тебя в проекте какая-то не очень новая версия selenide используется
  7.    
  8.     посмотри раздел в faq http://joxi.ru/BA0p30gsB36jLA
  9.     https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#heading=h.9ginsk3d52i
  10.    
  11.     сейчас вместо getScreenShotAsFile() - другие методы
  12.    
  13.     на изменениях не настаиваю, просто чтоб в курсе ты была)    
  14. */
  15. *************************************************
  16. TodoMcvFullCoverageTest
  17.  
  18. /*
  19.     В имя тест-класса не стоит выносить информацию о покрытии
  20.    
  21.     Это важная информация, но это и меняющаяся со временем информация )
  22.    
  23.     не будем же мы из-за того, что появилась новая функциональность в приложении - менять название ранее разработанных тест-классов
  24.    
  25.     Эту информацию - о покрытии - если и помечают как-то
  26.     то используют категории
  27.     расшарила тебе видео на эту тему, не надо ничего реализовывать по ним
  28.     просто для понимания вопроса)
  29.     https://drive.google.com/file/d/0B8hgIBw8-V-AbE1qV1JCMklwX2c/view?usp=sharing
  30.     https://drive.google.com/file/d/0B8hgIBw8-V-AMXYyeHNIOVhUVGM/view?usp=sharing
  31.    
  32.     В рамках этой работы - просто из имени тест-класса - убери FullCoverage
  33.    
  34.     Если проблема в том, что в проекте уже есть TodoMcvTest
  35.     так можно просто тест-классы расположить в разных пекеджах
  36.     и тогда одноименные классы не будут проблемой
  37. */
  38. ********************************************
  39.  
  40. AtTodoMVCWithClearDataAfterEachTest
  41.  
  42. /*
  43.     Ты знаешь, это не очень хорошая идея - вынести степ-методы в предка тест-класса
  44.    
  45.     Согласна, тогда код самого тест-класса - почище получается)
  46.    
  47.     Но, все же, это не верно
  48.    
  49.     есть такой Single Responsibility Principle
  50.     почитай про него
  51.    
  52.     суть - что у каждого класса - своя отверственность и задача
  53.    
  54.     вот у предка тест-класса AtTodoMVCWithClearDataAfterEachTest - задача
  55.     открывать урл перед тестом и чистить данные после теста
  56.     это все)
  57.     и именно это мы описали в его имени
  58.    
  59.     собственно - в обоих предках тест-класса (за исключением степ-методов)
  60.     мы использовали код, который относится к логике теста в целом
  61.     а не к логике каких-то шагов теста
  62.     именно такой код = который реализует логику теста в целом и который можно переиспользовать
  63.     в других тест-методах - и стоит выносить из тест-класса в предка тест-класса
  64.    
  65.     а степ-методы, и методы-проверки - это уже логика действий тестов
  66.     и это - если уже выносить - то в пейдж (или пейджи)
  67.    
  68.     В рамках этой задачи = такого не требовалось
  69.     Только вот это
  70.     https://docs.google.com/document/d/1tr6pz9tPawGV8bHW_fCXEx2P8bHEaNWvM55H6eQD_dA/edit#heading=h.tg17u4svwj28
  71.    
  72.     Так что - смотри сама)
  73.     Или верни в тест-класс эти методы  (степ-методы, и методы-проверки )
  74.     или реализуй пейджа
  75.     как тебе удобнее
  76.    
  77. */  
  78. *******************************************
  79.  
  80. import static ua.net.ItLabs.separate.pageModules.TodoMvcModules.assertTasks;
  81. /*
  82.     ты в этом решении - используешь метод из другого решения - уже из пейджа
  83. */  
  84.  
  85.     public void assertVisible(String... taskTexts) {
  86.         tasks.filter(visible).shouldHave(exactTexts(taskTexts));
  87.     }
  88.  
  89.     public void assertNoTasks() {
  90.         tasks.shouldBe(empty);
  91.     }  
  92. /*
  93.     А в этом решении - есть 2 вот такиз метода
  94. */  
  95. /*
  96.     что мы в итоге имеем
  97.    
  98.     ну, первое - использовать в этом решении функциональность другого  - не очень хорошо)
  99.     или уже используй пейдж по полной программе
  100.     или не используй)
  101.     если решишь использовать - приведи код его в следующий раз
  102.    
  103.     используем методы
  104.     2 - для не отфильтрованного по visible списка - assertTasks и assertNoTasks()
  105.     1 - для отфильтрованного  по visible списка assertVisible
  106.    
  107.     логика имени assertVisible - не такая, как у предідущих ассертов
  108.     не известно - что работаем именно с тасками
  109.     assertVisibleTasks - корректнее
  110.    
  111.     если ты после просмотра видао про такого рода проверки решила оставить оба варианта проверки -
  112.     и отфильтрованного списка и не отфильрованного - значит решила быть точнее
  113.    
  114.     ок
  115.     одно из возможных решений
  116.    
  117.     но, тогда не ясно, почему нету метода assertNoVisibleTasks()
  118.     для проверки ситуации - когда видимых тасок нет, но вообще они есть
  119.    
  120.     Кстати, в применении - 4 таких метода будут гораздо сложнее, чем 2
  121.     (когда мы всегда проверяем отфильтрованный по visible список)
  122.     Т к важно будет - приенять их обдуманно
  123.    
  124.     Например, мы на Active фильтре работаем
  125.     допустим, у нас нету невидимых тасок и мы сейчас используем более точную проверку assertTasks
  126.     вроде бы - все ок, мы же хотим быть максимально точными
  127.     затем - чуть меняем сценарий - на сколько-то строк выше
  128.     и на момент проверки - у нас уже есть невидимая таска
  129.     и вот - результат - assertTasks нормально не работает....
  130.     и надо анализировать сценарий в целом и искать источник проблем
  131.    
  132.     значит - чтобы избежать таких проблем - применяем правило
  133.     assertTasks и assertNoTasks() - используем на All фильтре
  134.     assertVisibleTasks и assertNoVisibleTasks() - на Active & Completed фильтрах
  135.     да, выше описанных проблем избежим
  136.     но - надо это правило неписанное знать и безошибочно применять
  137.     т е - тоже - вариант не очень, но уже более стабильный
  138.     так что - если все же оставишь 4 проверки - придется это учесть в коде)
  139.    
  140.     Вывод - за все надо платить)
  141.     оставишь 4 проверки - в написании и поддержке тестов сложнее
  142.     оставишь 2 проверки - не так точно...
  143. */  
  144. ************************************
  145.  
  146.     public void add(String text) {
  147.     public void edit(String fromText, String toText) {
  148.     public void delete(String taskText) {
  149.     public void toggle(String taskText) {
  150.     public void assertVisible(String... taskTexts) {
  151.  
  152. /*
  153.     кажется, догадалась, почему в имени assertVisible нет слова Tasks
  154.     т к у всех методов имена подравняла
  155.    
  156.     да, это я не уточнила
  157.     в именах методов-действий - мы вполне можем быть краткими
  158.     т к все эти действия - только с тасками
  159.    
  160.     с именами методов-проверок - не так дела обстоят)
  161.     тут надо быть максимально точным
  162.     т к даже в самых простых приложениях - вариантов проверок столько
  163.     что не до сокращений и умолчаний)
  164.     яркий пример - assertVisible - можно подумать - что надо убедиться что какой-то элемент видим
  165.     в прошлом ревью тоже про это было, строки 177-185
  166.    
  167.     по поводу имен параметров
  168.     обозначить текст таски как taskText - хорошая идея
  169.     надо во всех методах поправить имена параметров
  170.     ведь обозначаем - именно текст таски
  171.     вот и будем применять один термин
  172.     taskText, taskTexts, fromTaskText, toTaskText
  173.    
  174. */
  175. ****************************************
  176.   @Step
  177.     public void add(String text) {
  178.         $("#new-todo").setValue(text).pressEnter();
  179.     }
  180. /*
  181.     вот тут есть пример реализации метода add, с помощью которого можно добавить несколько тасок
  182.     код при вызове такого метода может стать попроще - если надо добавить сразу несколько тасок
  183.  
  184.   https://docs.google.com/document/d/1tr6pz9tPawGV8bHW_fCXEx2P8bHEaNWvM55H6eQD_dA/edit#heading=h.tg17u4svwj28
  185. */
  186.      
  187. *****************************************
  188. @Step
  189.     public void edit(String fromText, String toText) {
  190.         tasks.find(exactText(fromText)).find("label").doubleClick();
  191.         $(".editing>.edit").setValue(toText).pressEnter();
  192.     }
  193. /*
  194.     в более старших версиях Selenide уже не надо именно на label даблкликать
  195.     можно уже просто на таске
  196.     тоже больше к сведению, можешь не париться с версиями
  197.    
  198.     по второй строчке
  199.     избегай использовать независимые локаторы - если тебе надо доступиться к чему-то внутреннему из структур
  200.     для которых уже есть переменые
  201.     к чему нам надо доступиться
  202.     к полю .edit в редактируемой таске из списка тасок
  203.     переменная для списка тасок у нас есть
  204.     из tasks - получим редактирвемую таску, из нее - поле .edit
  205.    
  206.     такой вариант  - лучше - т к
  207.     у нас будет меньше независимых селекторов в коде (меньше исправлять и проще понимать)
  208.     у нас код будет нагляднее - т к сразу яснее - с чем работаем
  209.     при падении теста  на строке $(".editing>.edit") - текст ошибки нам мало поможет
  210.     а на строке - tasks.findBy(cssClass("editing")).find(".edit") - поможет наверняка
  211.     т к сама ошибка - будет точнее
  212.     вот тут приводился код , который нам нужен
  213.     https://docs.google.com/document/d/1tr6pz9tPawGV8bHW_fCXEx2P8bHEaNWvM55H6eQD_dA/edit#heading=h.qp6awiu5k68k
  214.    
  215.    
  216. */    
  217. **************************************************
  218.  
  219.     @Test
  220.     public void testAtAllFilter() {
  221.  
  222.         add("1");
  223.         add("2");
  224.         add("3");
  225.         add("4");
  226.         /*
  227.             вот эти 4 строки получится свернуть в одну - если дореализуешь метод add
  228.            
  229.             следующая операция - добавление тасок не проверит
  230.             т к она работает только с таской 1
  231.             а мы добавили аж 4
  232.         */
  233.  
  234.         // Edit task
  235.         /*
  236.             как считаешь - комментарий хоть что-то пояснил?
  237.             не держи бесполезных комментариев )
  238.             вообще на этот предмет код просмотри
  239.         */
  240.         edit("1", "1.edited");
  241.         assertTasks("1.edited", "2", "3", "4");
  242.        
  243.         // Delete task
  244.         delete("1.edited");
  245.         assertTasks("2", "3", "4");
  246.  
  247.         // toggle and de-toggle
  248.         /*
  249.             toggle = переключить
  250.             de-toggle = рас-переключить? ))
  251.            
  252.             у нас есть более точные термины - complete & reopen
  253.             если тут напишешь - complete & reopen - все равно будет не понятно - где что
  254.            
  255.             используй соответствующий комментарий перед своим вызовом тугла
  256.         */
  257.         toggle("4");
  258.         toggle("2");
  259.         /*
  260.             а зачем 2 таски комплитить?
  261.             для проверки закомпличивания - достаточно одну закомплитить)
  262.         */
  263.         filterAll();
  264.         assertItemsLeft(1);
  265.         /*
  266.             вот это не поняла ...
  267.             мы же вроде на олле и есть
  268.             зачем filterAll();
  269.            
  270.             проверка assertItemsLeft(1); - слабовата, мне кажется
  271.             слишком косвенная
  272.            
  273.             можно было бы тут
  274.                 проверить тексты тасок = на олле таски видны вне зависимости от статуса
  275.                 перейти на active
  276.                 проверить тексты тасок = переход на фильтр проверили + убедились в закомпличености
  277.                 вернулись на all
  278.                 проверили тексты тасок = переход на фильтр проверили
  279.                
  280.              а есть совет - как реализовать эффективнее
  281.              https://docs.google.com/document/d/1tr6pz9tPawGV8bHW_fCXEx2P8bHEaNWvM55H6eQD_dA/edit#heading=h.x1p9b4vm5pun
  282.              
  283.              тогда - если этот совет использовать
  284.                закомплитили 2 таски
  285.                переоткрыли одну таску
  286.                clearCompleted()
  287.                проверили тексты = переоткрытая осталась, закомпличеная ушла
  288.           */
  289.         toggle("4");
  290.         toggle("2");
  291.         assertVisible("2", "3", "4");
  292.  
  293.         // toggle and clear
  294.         /*
  295.             все же complete all & clear
  296.         */
  297.         toggleAll();
  298.         clearCompleted();
  299.         /*
  300.             на момент complete all & clear - разумно приходить с одной, максимум - двумя тасками
  301.             бОльшего количества для проверки complete all & clear - нам не надо)
  302.            
  303.             проверки не хватает)
  304.            
  305.             все действия - надо проверять
  306.             причем лучше - сразу
  307.            
  308.             на all фильтре мы позволяем себе откладывать проверку на 1-2 шага после
  309.             закомпличивания/переоткрытия - т к на олле - все таски отображаются
  310.             и чтобы окончательно проверить факт закомпличивания/переоткрытия  - еще что-то надо сделать
  311.             а общее правило - после действия должна идти проверка
  312.            
  313.             иначе - фидбек от теста будет не точный
  314.             либо - он не упадет при ошибке (т к нет проверки)
  315.             либо - он упадет при ошибке, только мы долго будем думать - что же не работало, что привело к ошибке
  316.             потому - если проверять все сразу - будет проще и точнее
  317.         */
  318.     }
  319.      
  320. *********************************************
  321.  
  322. @Test
  323.     public void testAtActiveFilter(){
  324.  
  325.         ...
  326.  
  327.         // complete
  328.         toggle("3");
  329.         assertItemsLeft(2);
  330.         /*
  331.             Мы же на Active фильтре
  332.             если проверим тессты видимых тасок - проверка получится гораздо точнее
  333.             а потом - можно и счетчик активных тасок проверить
  334.            
  335.             когда идут 2 проверки подряд - первой делай более высокоприоритетную
  336.             тогда - даже если тест упадет на низкоприоритетной
  337.             у тебя останется фидбек по высокоприоритетной проверке
  338.         */
  339.  
  340.         // complete all
  341.         toggleAll();
  342.         assertItemsLeft(0);
  343.         filterCompleted();
  344.         assertTasks("1.editedOnActive", "3", "4");
  345.         /*
  346.             тут - можно никуда не переходить
  347.             было - в списке несколько видимых тасок
  348.             закомплитили все
  349.             стало - в списке нет видимых тасок
  350.             все)
  351.             мы проверили
  352.         */
  353.  
  354.         // reopen all
  355.         toggleAll();
  356.         /*
  357.             сейчас эту операцию мы проверяем на комплитеде
  358.             хотя тест = AtActiveFilter
  359.            
  360.             если ранее не переходить на Completed фильтр
  361.             то reopen all - проверишь  AtActiveFilter
  362.             заодно и допроверишь закомпличивание)
  363.            
  364.             переоткрыли = ранее закомпличеные таски стали видимыми
  365.             все)
  366.             далее - остального вообще не надо)
  367.   ...
  368.      
  369. /*
  370.     вот тут есть вариант - как реализовать тест-методы поэффективнее
  371.     https://docs.google.com/document/d/1tr6pz9tPawGV8bHW_fCXEx2P8bHEaNWvM55H6eQD_dA/edit#heading=h.64cp8bd2pyhg
  372.    
  373.     основная идея - когда мы на каком-то из фильтров - покрываем не все операции -
  374.     менее приоритетное - покрыть в наиболее востребованных вариантах
  375.     и максимально уйти от повторений действий
  376.    
  377.     тоже - и тут проанализируй - сколько тасок надо добавлять изначально,
  378.     чтоб хватило на весь сценарий)
  379.     лишних не надо - это тоже время
  380.    
  381.     к третьему тест-методу - попробуй применить выше описанное)
  382. */
Advertisement
Add Comment
Please, Sign In to add comment