julia_v_iluhina

Untitled

Jan 23rd, 2017
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 49.10 KB | None | 0 0
  1. вопросы - https://github.com/AleksanderPopov/automician_course/blob/master/questions_and_review/13_questions.txt
  2. ========================================================================================================================
  3. 1. "значит - ресурсов на этом сервере - должно быть столько - что даже если все гигабайты хлама будут нагенерены
  4.    одновремено
  5.    ресурсов должно хватать
  6.    если это не так - это проблема серьезная)
  7.    и просто вот такими поисками ресурсов - ее глупо решать
  8.    время специалиста, который будет вот так гоняться за ресурсами - стоит дороже самих ресурсов)
  9.  
  10.    если знаешь как это можно сделать, чтобы еще можно было включать-выключать, скажи пожалуйста - вот это не поняла
  11.    что включать-ваключать
  12.    если про то как вызывать - то как писала выше
  13.    зависит от того - как тесты запукаются, каким инструментом"
  14.  
  15.             >>>>>>>> по поводу ресурсов - согласен, ситуация когда ресурсов впритык во время эксплуатации - проблема
  16.                     ресурсов, а не приложения.
  17.  
  18.                     я не понимаю, ты считаешь что
  19.  
  20.                     mvn clean test - это окей
  21.  
  22.                     а
  23.  
  24.                     mvn test clean - это лишнее время которое мы тратим на прогон тестов?
  25.  
  26.                     ты никогда не чистила target ПОСЛЕ тестов, но всегда чистила ДО ? как то задом-наперед получается...
  27.                     мы сначало создаем себе проблемы на будущее, а когда возвращаемся к тесту перед тем как ранить его
  28.                     начинаем разгребать старый мусор?
  29. /*
  30.     у меня вопрос - не к вызову clean
  31.     а к очистке(частичной) - во время выполнения  test
  32.     если мы в методах по приаттачиванию скриншотов будем их удалять - это мы будем делать в рамках test
  33.     вот это я считаю пустой тратой времени
  34.  
  35.     к очистке с помощью clean - вопросов нет
  36.  
  37.     что до варианта - mvn test clean
  38.     да, я такой вариант никогда не использовала
  39.  
  40.     спорить с тобой не буду
  41.         все мои доводы уже были указаны ранее
  42.         если тебе кажется - что вариант mvn test clean лучше - ну ок
  43.         попробуй)
  44.         не уверена, что не столкнешься с какими-то сложностями)
  45.  
  46.     пример
  47.         Настраиваем Job Jenkins
  48.         с использованием варианта mvn test clean
  49.         и затем - настраиваем Post Build Action
  50.         которое публикует алюр-репорт
  51.  
  52.         я думаю - будут проблемы)
  53.         потому что clean - уже все почистил)
  54.  
  55.         я не проверяла - хочешь - займись, проверь
  56.         тем более - что работы по Дженкинсу - открыты уже для тебя
  57. */
  58.  
  59.                     когда приложение оставляет за собой мусор - это серьезная проблема самого приложения.
  60.                     если бы современные приложения оставляли после себя файлы необходимые в процессе работы
  61.                     какие нибудь стратегии сжирали бы весь жесткий дист за пару часов, захламляя его информацией
  62.                     о сражениях, которые уже прошли, и больше не повторятся)
  63.  
  64.                     не чистить - зло. потому что файлы копятся, место кончается, memory leak - привет.
  65.  
  66.                     чистить ДО - меньшее зло чем не чистить вообще, но тоже зло, т.к. ненужные файлы просто занимают память,
  67.                                  и ты не убедила меня пока, что это нормально)
  68.  
  69.                     чистить после - добро, т.к. это логично и естественно, пользоватся ресурсами когда они нужны, и удалять
  70.                                     когда они не нужны. к тому же это занимает времени столько же, сколько и чистить ДО.
  71.  
  72.                     я буду чистить после рана, т.к. считаю это самым эффективным и правильным вариантом)
  73.  
  74.                     чет задела меня эта тема, я погуглил, и нашел такое решение, как maven-clean-plugin.
  75.  
  76.                     теперь он автоматически, всегда, делает clean фазу после site фазы (т.е. сначала генерируется репорт,
  77.                     а потом чистятся скрины всякие, pageSource и т.п.)
  78. /*
  79.     вот!
  80.     верно
  81.     clean нужен после site фазы
  82.  
  83.     как будет работать этот плагин в настроенной джобе, с публикацией репорта - я не знаю
  84.     надо смотреть и играться
  85.  
  86.     про задела тема - ну ок
  87.     я - не истина в последней инстанции)
  88.     спорить - не буду.
  89.         Я осталась при своем мнении и буду юзать clean test вариант. Меня в нем все устраивает)
  90.         После выполнения test - папка target - это еще не мусор по моему мнению)
  91.         Пока мы не закончили возню с публикацией отчетов - это не мусор
  92.         После того - ну да, можно потратить силы и удалить вот это все лишнее. Вопрос - нужно ли
  93.         Почему - писала в прошлые разы.
  94.         Сейчас я для сравнительно крупных проектов(не касающихся курса) - юзаю gradle - как более гибкий инструмент
  95.         Там тоже по умолчанию - задача cleanTest - выполняется до запуска тестов )
  96.         Хотя конечно настроить можно что угодно)
  97.  
  98.     сможешь красиво и беспроблемно настроить в дженкинсе все это хозяйство - ну молодец
  99.     делай окончательные выводы о своей схеме - после того как настроишь Job в дженкинсе с публикацией репорта
  100.     причем - смоделируй разные обстоятельства - тесты прошли/тесты не прошли
  101.     захочешь - поделись и со мной потом, мне, конечно, будет интересно )
  102. */
  103.  
  104.                     как по мне норм тема, т.к. теперь запуск тестов выглядит так:
  105.  
  106.                     mvn clean test site -> mvn test site
  107.  
  108.                     и не надо никаких post-build-actions.
  109.  
  110.                     про включать-выключать я имел ввиду иметь флаг, которым можно регулировать нужно нам чистить
  111.                     target после билда, или нет) пока писал то что выше уже понял что в этом флаге нет никакого смысла)
  112. /*
  113.     то, что пишешь - звучит красиво)
  114.     убедись что в дженкинсе будет все ок)
  115.     может быть запросто - куча веселья)
  116.  
  117.     кстати - ты знаешь - что до site  дело не дойдет, если на фазе test тесты упадут
  118.     если у нас была команда - mvn test site
  119.     ?
  120.  
  121.     да и при настройке Job в Jenkins - мы не указываем фазу site
  122.     Просто используем Post-build Action = publish allure report
  123. */
  124. ========================================================================================================================
  125. 2. "    про селенидовский рефреш - первое что делай - когда вопрос возникает - смотри исходники
  126.            вот посмотри например на код open  - https://github.com/codeborne/selenide/blob/master/src/main/java/com/codeborne/selenide/impl/Navigator.java
  127.            там куча вариантов
  128.            в том числе - и странички, открываемые локально
  129.  
  130.            думаю, текущая реализация рефреша - наиболее универсальна в таких обстоятельствах
  131.            это моя гипотеза)"
  132.  
  133.                 >>>>>>>> я как раз смотрел, и там же и увидел что нет такого метода как refresh(),
  134.                         а есть скрытый navigate(url), и спросил, может ты знаешь почему так)
  135.  
  136.                         странное решение, учитывая что как вот показывает практика оно не особо
  137.                         работает в рядовых кейсах
  138.     /*
  139.         это не рядовой кейс)
  140.         т к вот эти странички - по фильтрам которые - ведут себя ... не совсем как разные странички с разными урлами)
  141.         тут мы еще и на особенности реализации этой версии todoMVC наступили)
  142.         так что случай не совсем рядовой)
  143.  
  144.         и ты б всего вот этого не заметил
  145.         если бы в рамках гивен-методов - делал переходы используя линки переходов по фильтрам)
  146.  
  147.         но мы ж сразу наворачиваем)
  148.         за что и заплатили)
  149.     */"
  150.  
  151.            >>>>>>>> не вижу ничего "не-рядового" в текущем кейсе... у меня проект - single-page-application,
  152.                    и там всякие обернутые driver.navigateTo() не прокатят вообще, а нужен именно нормальный
  153.                    человеческий рефреш)
  154.  
  155.                    может быть в приложении где странички все сами по себе, и никакой связи между ними нет
  156.                    текущая реализация в selenide может и прокатила бы, но это не оправдывает то, что метод
  157.                    refresh() не вызывает реальный рефреш страницы в браузере.
  158.  
  159.                    зачем называть методы именами, которые не отражают то, что они делают?
  160. /*
  161.    ну, я согласна с тем, что называть метод нужно сообразно его реализации
  162.  
  163.    почему такая реализация у рефреша в Selenide - я высказала гипотезу
  164.    думаю, она верна)
  165.    но на 100% не уверена, конечно
  166.  
  167.    у меня недостаточно оснований, чтоб утварждать - что метод refresh в selenide делает что-то другое)
  168.    в том смысле, что я бы не стала на этом настаивать - в споре с автором Selenide, например)
  169.  
  170.    хочется бОльшей ясности - это не ко мне, это к Солнцеву
  171. */
  172. ========================================================================================================================
  173. 3. "            >>>>>>>> я переделал, можно теперь вот так вызывать
  174.  
  175.                         AllurePublisher.publishNow().screen();
  176.  
  177.                         AllurePublisher.publishNow().pageSource();
  178.  
  179.                         AllurePublisher.publishNow().screenAndSource();
  180.  
  181.                         вроде норм, можно было бы затулить без иннер класса прям в паблишер,
  182.                         но мне почему то показалось красивее так сделать, чем вызывать
  183.                         длинные методы типа
  184.  
  185.                         AllurePublisher.publishScreenAndSource();
  186.  
  187.                         получается мы будем использовать этот класс или в руле, или когда нужно сфоткать
  188.                         в конкретный момент что то, и я сразу хочу отделить визуально интерфейсы для разных
  189.                         задач, мол если оформляешь рул, то onFail, если сейчас то publishNow
  190.  
  191.                         ну вот чет просто мне показалось что так будет красиво и просто вншне)
  192.     /*
  193.         Не)
  194.         я предлагала тебе вариант покрасивее)
  195.  
  196.         в моем варианте - каждый класс отвечал за свое
  197.         Твое решение - нарушает Single Responsibility Principle
  198.  
  199.         получился более сложный вариант
  200.         советую переделать
  201.  
  202.         скажем так, настаивать не стану в категорической форме
  203.         но и не жди от меня - что я соглашусь - что текущее решение - красивое
  204.  
  205.         все может быть стройнее гораздо
  206.         к тому же, мной предложенный вариант - его и нарастить сможешь другими какими-то паблишерами
  207.  
  208.         в общем - делать или нет - на твое усмотрение )
  209.         мое мнение ты понял)
  210.  
  211.         Не факт, что Яков согласился бы со мной или с тобой)
  212.         Он тоже фанат Single Responsibility Principle )"
  213.  
  214.             >>>>>>>>>> SRP это хорошо, но если разделить существующий класс на отдельный класс-рул, который
  215.                     может принимать сколько угодно классов-аттачей и просто когда нужно вызывать их методы
  216.                     attach() грубо говоря, то в случае с selenide не получится делать один вызов screenshot()
  217.                     и брать из его и скрин, и html. потому что это будут разные классы, например ScreenAttacher
  218.                     PageSourceAttacher, или чет такое, и если передать их как параметры рулу, то он будет просто
  219.                     вызывать методы .attach() у всех его объектов-параметров по очереди, а то что два из них
  220.                     связаны из за selenide - это уже как бы не его проблемы.
  221.  
  222.                     в такой ситуации проще было бы попросить Солнцева разделить метод screenshot() на
  223.                     screenshot() и pageSource(), тогда можно было бы сделать через rule-управляющего, и
  224.                     его классы-аттачеры-параметры )
  225.  
  226.                     ну и конечно можно забить на то что будет в 2 раза больше файлов и делать скриншоты дважды,
  227.                     один раз для того чтоб вытащить .png, второй раз для того чтоб вытащить .html =)
  228. /*
  229.     Не соглашусь с тобой - что в случае с selenide не получится делать один вызов screenshot() и брать из его и скрин, и html
  230.     Когда я расписывала предлагаемую схему - я про это писала
  231.  
  232.     Ну то такое уже - не обязательная программа
  233.    
  234.     Текущая версия AllurePublisher - стала лучше предыдущей)
  235. */
  236. ========================================================================================================================
  237. 4. "    public static class Builder {
  238.        ...
  239.            public GivenHelper atAllFilter() {
  240.                this.filter = Filter.ALL;
  241.                return new GivenHelper(this);
  242.            }
  243.  
  244.            public GivenHelper atActiveFilter() {
  245.                this.filter = Filter.ACTIVE;
  246.                return new GivenHelper(this);
  247.            }
  248.  
  249.            public GivenHelper atCompletedFilter() {
  250.                this.filter = Filter.COMPLETED;
  251.                return new GivenHelper(this);
  252.            }
  253.    /*
  254.        ну да, оно собразнительно выкинуть из цепочки вызовов build )
  255.        но тогда - кто не в теме может теоретически - запутаться
  256.  
  257.        ведь согласно этого паттерна
  258.        все методы кроме build()
  259.        просто формируют пул свойств строящегося объекта
  260.        и только  build() - строит сам объект
  261.  
  262.        при таком варианте - мы налагаем ограничения на порядок вызовов методов
  263.        которые формируют пул свойств - мы должны вызвать at....Filter()
  264.        причем последним
  265.  
  266.        для Builder Pattern
  267.        если фильтр = обязательный параметр
  268.            то это должен быть параметр конструктора билдера
  269.            а раз мы не хотим светить вовне классом
  270.            то тогда
  271.                у конструктора билдера = параметр Filter filter
  272.                у класса GivenHelper - 3 метода givenAt....
  273.                которые будут вызывать конструктор с нужным параметром
  274.  
  275.        не настаиваю на изменениях
  276.        твой вариант - не канонический)"
  277.  
  278.             >>>>>>>> да я знаю что не соблюдаю правила builder-pattern, сделал для читабельности,
  279.                     пожертвовав при этом самим паттерном так сказать, и ограничением в виде применения
  280.                     фильтра в конце)
  281.  
  282.                     не думаю что это очень страшно, т.к. по факту отличие от паттерна только в том, что
  283.                     я жестко ограничиваю порядок вызова методов (нельзя вызывать их сколько хочешь, потом
  284.                     оформляя это все методом build() ), но учитывая что настраеваемых параметров всего 2
  285.                     (фильтр и задачки) и фильтры нет смысла вызывать несколько раз, решил обрезать маленько
  286.                     реализацию, для повышения читабельности)
  287.  
  288.                     не факт кстати что прям повысил до небес, по факту убрал одну строку
  289.  
  290.                     given().
  291.                             .activeTask("1")
  292.                             .atCompletedFilter()
  293.                             .prepare();
  294.  
  295.                     given().
  296.                             .activeTask("2")
  297.                             .atCompletedFilter();
  298. /*
  299.     Я за более четкое соблюдение паттернов)
  300.  
  301.     ведь - как правило - работаем в команде
  302.     и вольное обращение с паттернами - может путать
  303.  
  304.     по-прежнему - не буду настаивать на изменениях
  305. */
  306. ========================================================================================================================
  307. 5. "*/
  308.        private String doJsonfromList(List<Task> tasks) {
  309.            List<String> lsTasks = new ArrayList<String> ();
  310.  
  311.            for (Task task:tasks) {
  312.                lsTasks.add("{'completed':" + task.type.lsValue + ",'title':'" + task.name + "'}");
  313.            }
  314.  
  315.            return String.join(", ", lsTasks);
  316.        }
  317.    /*
  318.        ну да, можно при конкатенации строк еще concat применить для скорости
  319.        ну то уже детали
  320.        http://stackoverflow.com/questions/47605/string-concatenation-concat-vs-operator
  321.  
  322.        твой вариант тоже ок)"
  323.  
  324.                 >>>>>>>> спасибо за идею, я переделал маленьк
  325. /*
  326.     таки ты заразился на exercism-е лямбдами )
  327.     ок)
  328. */
  329. ========================================================================================================================
  330. 6. "    private void addTasksToLocalStorage() {
  331.            String tasksJson = doJsonfromList(this.tasks);
  332.  
  333.            if (tasksJson.isEmpty()) {
  334.                executeJavaScript("localStorage.removeItem('todos-troopjs')");
  335.            } else {
  336.                executeJavaScript("localStorage.setItem('todos-troopjs', JSON.stringify([" + tasksJson + "]))");
  337.            }
  338.        }
  339.     /*
  340.        вобще - выполнение localStorage.setItem('todos-troopjs', JSON.stringify([]))
  341.        дает нам очистку списка тасок
  342.  
  343.        так что тут без if-а можно обойтись
  344.  
  345.        doJsonfromList - немного не выдержан CamelCase (From)
  346.     */"
  347.  
  348.             >>>>>>>> круто, не знал, спасибо) имя поправил
  349. /*
  350.     ок
  351. */
  352. ========================================================================================================================
  353. 7. "    при таком вызове методов пейджа - ок, норм исмпользование should
  354.        все ок
  355.        разницы уже особо нет - shouldBe vs shouldHave
  356.  
  357.        с проверками - щас подправлю
  358.    */
  359.        @Test
  360.        public void basicTasksFlow() {
  361.            given().completed("1")
  362.                    .atAllFilter()
  363.                    .prepare();
  364.  
  365.            Tasks.add("2");
  366.            Tasks.shouldBe("1", "2");
  367.            Tasks.edit("2", "edited2");
  368.            Tasks.shouldBe("1", "edited2");
  369.  
  370.            Tasks.goActive();
  371.            Tasks.shouldBe("edited2");
  372.            Tasks.cancelEdit("edited2", "notedited2");
  373.            Tasks.toggle("edited2");
  374.            Tasks.shouldBeEmpty();
  375.  
  376.            Tasks.goCompleted();
  377.            Tasks.shouldBe("1", "edited2");
  378.            Tasks.destroy("edited2");
  379.            Tasks.shouldBe("1");
  380.            Tasks.toggle("1");
  381.            Tasks.shouldBeEmpty();
  382.  
  383.            Tasks.goAll();
  384.            Tasks.shouldBe("1");
  385.        }"
  386.  
  387.             >>>>>>>> тут только одна проверка добавилась, а я её уже добавил еще с
  388.                     твоих ответов на вопросы)
  389. /*
  390.     ок
  391. */
  392. ========================================================================================================================
  393. 8. "    @Test
  394.        public void add() {
  395.            given().atActiveFilter()
  396.                    .prepare();
  397.  
  398.            Tasks.add("1", "2");
  399.            Tasks.shouldBe("1", "2");
  400.            Tasks.itemsLeftShouldBe(2);
  401.        }
  402.    /*
  403.        Tasks.add("1", "2"); - это 2 действия
  404.        в гивен-действиях - укажи что есть таска "1"
  405.  
  406.        и в тестируемом действии = добавь таску "2"
  407.        так проверишь создание второй таски в списке - если біла такая цель"
  408.  
  409.                 >>>>>>>> а я чет не подумал что add(1, 2) это по суди два одинаковых add(), и нет смысла проверять
  410.                         добавление нескольких как целостный функционал) сделал как ты сказала с гивеном
  411. /*
  412.     ок
  413. */
  414. ========================================================================================================================
  415. 9. "    @Test
  416.        public void clearCompleted() {
  417.            given().active("1")
  418.                    .completed("2")
  419.                    .atActiveFilter()
  420.                    .prepare();
  421.  
  422.            Tasks.clearCompleted();
  423.            Tasks.itemsLeftShouldBe(1);
  424.            Tasks.goCompleted();
  425.            Tasks.shouldBeEmpty();
  426.        }
  427.    /*
  428.        и после Tasks.clearCompleted(); нужно проверять Tasks.shouldBeEmpty();
  429.  
  430.        вроде бы, стоит
  431.        перейти на All (c Active  на Completed мы уже переходили)
  432.        и выполнить обе проверки  - Tasks.shouldBeEmpty(); и Tasks.itemsLeftShouldBe(1);
  433.        и в названии метода отразить что мы проверили и clearCompleted и navigateToAll
  434.        и тогда уже метод public void navigateToAllFilter() не нужен
  435.        хотя, конечно - в таком тесте - как выше - мы хуже проверяем фильтеринг ...
  436.        что критично. А раз так - то зачесть это как покрытие тестового действия  navigateToAll - не выйдет
  437.  
  438.        в общем, раз так - раз мы все равно не сможем проверить фильтеринг тщательно
  439.        то ок
  440.        пусть будет твой вариант, от имени метода, до его реализации
  441.        но все равно - после Tasks.clearCompleted(); тоже нужно проверять Tasks.shouldBeEmpty();
  442.        действие должно быть проверено сразу
  443.        то, что мы потом еще уточнились - то норм
  444.        но и сразу надо все проверить
  445.  
  446.        таких тестов - есть еще сколько-то
  447.        это учти и для них
  448.    */"
  449.  
  450.         >>>>>>>> не понял о чем ты, как это проверить после clearCompleted() -> shouldBeEmpty() ?
  451.                 это же Active фильтр, он не остается пустой после clearCompleted
  452.  
  453.                 это же как раз тот случай где пришлось делать маленький e2e
  454. /*
  455.     да, про shouldBeEmpty() - ошиблась
  456.     имела в виду - проверку состояния списка тасок
  457.     как буду смотреть код - прокомментирую
  458.  
  459.     если буду не согласна - просто приведу свой вариант кода
  460. */
  461. ========================================================================================================================
  462. 10. "    @Step
  463.         public static void editEnter(String fromTaskName, String toTaskName) {
  464.             edit(fromTaskName, toTaskName);
  465.         }
  466.     /*
  467.         я б не стала реализовывать такой метод
  468.         ограничилась бы edit-ом
  469.  
  470.         не вижу особых плюсов в существовании editEnter-а
  471.     */"
  472.  
  473.         >>>>>>>>> ну для очевидности, у нас есть метод editTab, editClickOutside, а editEnter-а нет?
  474.                 сразу возникает вопрос, что это за edit такой непонятный, без пояснения)
  475.  
  476.                 как по мне если писать уже такие разные методы, то пусть они будут похожи)
  477. /*
  478.     ну, допустим, ок - нужен editEnter, раз есть editTab, editClickOutside )
  479.     тогда зачем edit, который ты вызываешь внутри editEnter-а? )
  480. */
  481. ========================================================================================================================
  482. 11. "    уже писала тебе про это
  483.         не стоит держать в проекте - как ресурс - chromеdriver
  484.         то ты картинки сразу удаляешь, чтоб экономненько было
  485.         то по проектам раскладываешь chromеdriver )
  486.  
  487.         chromеdriver - это не проекта сущность
  488.         это - то, что задается на уровне окружения
  489.         а в проекте - максимум - мы прописываем путь к хромдрайверу
  490.  
  491.         а то и этого не делаем
  492.         а делаем это на уровне окружения - прописав этот путь единожды - на все окружение - в переменной PATH
  493.  
  494.         тогда на уровне проекта не понадобится даже путь к хромдрайверу указывать"
  495.  
  496.                 >>>>>>>> вообще ты права конечно, я подумал подумал и согласился)
  497. /*
  498.     ух ты)
  499.     ок)
  500. */
  501. ========================================================================================================================
  502. 12.
  503. ==========================================================================================
  504. junitTestClasses
  505. ==========================================================================================
  506.  
  507.         для решения этой задачи - достаточно 2-ух категорий
  508.  
  509.         buggy - то, что обозначили как buggy
  510.         smoke - то, что обозначили как smoke (можно - за исключением buggy, как вариант)
  511.         all - вообще все
  512.         full acceptance = all - buggy
  513.  
  514.         вот такие должны быть сьюты
  515.         и заданы они должны быть - используя только 2 категории buggy и smoke
  516.      */
  517.  
  518.             >>>>>>>> окей, я сделал так, но это не очень KISS как по мне, такое сложное
  519.                     оперирование категориями.
  520.  
  521.                     собственно, то что full acceptance = smoke исходя их того что ты написала
  522.                     это как последствие такого сложного менеджмента категориями) категорий мало,
  523.                     зато работать с ними труднее, нужно в голове держать лишнюю информацию
  524. /*
  525.     это не так - full acceptance = smoke
  526.     full acceptance = all - buggy
  527.     smoke = smoke OR smoke - buggy
  528.  
  529.     если не все тесты помечены как smoke - разница будет
  530.  
  531.     представь - что тестов много
  532.     в твоей схеме - с 4-мя категориями - дольше категории расставлять
  533.     с моей схеме - согласна, она более интеллектуальна - меньше работы по указанию - какой тест каким категориям принадлежит
  534.  
  535.     на самом деле, в моей схеме
  536.         на примере smoke & buggy категорий - мы увидели вариант - что разметили, то и получили
  537.         на примере all : full acceptance - мы увидели вариант синтетический, не требующий категорий, что тоже иногда полезно будет
  538.  
  539.     так что для задания - я таки настаиваю на 2-ух категориях)
  540.  
  541.     что до жизни - надо всегда взвешивать +ы и -ы
  542.     на что больше времени уйдет - на указание кучи категорий для кучи тестов
  543.     или на соблюдение неких логических правил
  544.     от проекта к проекту ответы будут разными)
  545. */
  546.     ==========================================================================================
  547.  
  548.      public class FailSuiteTest {
  549.          @Test
  550.          public void failedTest() {
  551.              System.err.println("SUITE CONFIGURED INCORRECTLY");
  552.              fail();
  553.          }
  554.      }
  555.      /*
  556.         странный сьют)
  557.         я бы даже сказала - что это вообще не сьют
  558.  
  559.         разумнее по умолчанию - запускать какой-то из сьютов
  560.         настоящих сьютов
  561.         тот же smoke к примеру
  562.         самое часто запускаемое - как раз по умолчанию и задай
  563.  
  564.                 >>>>>>>> ну да, это пустышка для того чтоб просто показать что что то не так
  565.                         пошло во время конфигурации.
  566.  
  567.                         чем разумнее по умолчанию запускать какой то из съютов?
  568.  
  569.                         как по мне лучше когда если ты криво наконфигурировал джобу ту же,
  570.                         или вообще забыл указать съют, то удобнее когда все мгновенно падает
  571.                         и указывает ошибку, мол дружище что то ты провтыкал)
  572.  
  573.                         было несколько таких ситуаций, и если бы ранилисб обычные тесты то
  574.                         заняло бы намного больше времени разбирательства, почему что как куда
  575.                         запустилось, что вообще происходит)
  576. /*
  577.     я не пробовала
  578.     но проверь
  579.  
  580.     на уровне pom - по умолчанию задай не существующий сьют
  581.     и не делай никаких таких пустышек
  582.  
  583.     в результате
  584.     если не укажешь сьют - тесты раниться не будут - т к по умолчанию задано то чего нет
  585.     если укажешь сьют правильно - будет раниться нужный сьют
  586.     если укажешь сьют не правильно - тесты раниться не будут
  587.  
  588.     какой профит = не будет вот таких сьютов которые вовсе и не сьюты
  589.     меньше сущностей)
  590. */
  591. ========================================================================================================================
  592. 13.
  593. ==========================================================================================
  594. mavenProfiles
  595. ==========================================================================================
  596.         что то у меня не получилось сделать нормальные профили сделать all и acceptance,
  597.         почему то в них включается DefaultFail тест :\
  598. /*
  599.     это странно, надо смотреть
  600. */
  601. *****************************************************************************************************************************************************
  602. ***************************************************************************************************************************************************
  603. сорсы - https://github.com/AleksanderPopov/automician_course/tree/master/src
  604. ****
  605.  
  606.  public void editConfirmedByEnter() {
  607.  public void editConfirmClickOutside()
  608. /*
  609.     я бы называла тест-методы по одной схеме - если ConfirmedBy - значит у всех так писала бы
  610.  
  611.     логика одна, значит и схема в нейминге - одна
  612.     также - вспомогательные соответствующие методы - назвала бы также
  613.  
  614.     одно понятие = один термин
  615. */
  616. ***********************************************************************
  617.     @Test
  618.     public void editConfirmClickOutside() {
  619.         given().active("1")
  620.                 .atActiveFilter()
  621.                 .prepare();
  622.  
  623.         Tasks.editClickOuside("1", "edited1");
  624.         Tasks.shouldBe("edited1");
  625.     }
  626. /*
  627.     ты таки не всегда используешь проверку Tasks.itemsLeftShouldBe(...); - даже если это воможно
  628.     а она ведь - уточняет проверки и улучшает покрытие
  629.  
  630.     и почти не усложняет фиче-тестов
  631.  
  632.     почему?
  633. */
  634. *************************************************
  635. public class TasksOperationsAtActiveFilterTest extends BaseTest {
  636. ...
  637.     @Test
  638.     public void clearCompleted() {
  639.         given().active("1")
  640.                 .completed("2")
  641.                 .atActiveFilter()
  642.                 .prepare();
  643.  
  644.         Tasks.clearCompleted();
  645.         Tasks.itemsLeftShouldBe(1);
  646.         Tasks.goCompleted();
  647.         Tasks.shouldBeEmpty();
  648.     }
  649.  
  650. //привожу свой вариант
  651.  
  652.     @Test
  653.     public void clearCompleted() {
  654.         given().active("1")
  655.                 .completed("2")
  656.                 .atActiveFilter()
  657.                 .prepare();
  658.  
  659.         Tasks.clearCompleted();
  660.         Tasks.shouldBe("1");
  661.         Tasks.itemsLeftShouldBe(1);
  662.         Tasks.goCompleted();
  663.         Tasks.shouldBeEmpty();
  664.     }
  665. /*
  666.     после действия clearCompleted - мы и можем, и должны выполнить проверки списка тасок
  667.     они достаточно точно проверяют положение дел после выполнения операции
  668.  
  669.     поскольку дальшейший переход на Completed - лишь уточняет - что закомпличеных тасок нет -
  670.     то тут уже достаточно  проверки Tasks.shouldBeEmpty()
  671.  
  672.     мне по-прежнему кажется это перебором - переходить на Completed фильтр и еще что-то уточнять
  673.         я бы так не делала
  674.  
  675.         вот этого -
  676.                 Tasks.goCompleted();
  677.                 Tasks.shouldBeEmpty();
  678.         уже бы в тест не включала
  679.  
  680.     тоже - спорить тут уже смысла нет
  681.         похоже, каждый из нас остался при своем мнении
  682. */
  683. *************************************
  684.  public void deleteByEditToEmpty() {
  685.  public void destroy() {
  686. /*
  687.     в обоих случаях выполняем удаление таски
  688.     а термина - 2 разных - destroy и delete
  689.  
  690.     советую использовать один какой-то
  691.  
  692.     понятно, что destroy - т к кнопку так зовут
  693.     в данном случае я рекомендую остановиться на одном термине - т к по результату - одинаковое действие
  694.  
  695.     мне ближе идея с термином delete
  696.  
  697.     тоже - уже не будем спорить
  698.     просто прими мое мнение к сведению
  699. */
  700. ****************************
  701. public class TasksOperationsAtAllFilterTest extends BaseTest {
  702.     @Test
  703.     public void completeAll() {
  704.         given().active("1", "2")
  705.                 .completed("3")
  706.                 .atAllFilter()
  707.                 .prepare();
  708.  
  709.         Tasks.toggleAll();
  710.         Tasks.itemsLeftShouldBe(0);
  711.         Tasks.goCompleted();
  712.         Tasks.shouldBe("1", "2", "3");
  713.     }
  714. /*
  715.     вот разве что для complete / complete all / reopen / reopen all на All фильтре - еще могу понять -
  716.     что нужно уточниться перейдя на другой фильтр
  717.     на остальных фильтрах/в остальных обстоятельствах мне это кажется совсем лишним
  718.  
  719.     тут мой вариант такой
  720. */
  721.     @Test
  722.     public void completeAll() {
  723.         given().active("1", "2")
  724.                 .completed("3")
  725.                 .atAllFilter()
  726.                 .prepare();
  727.  
  728.         Tasks.toggleAll();
  729.         Tasks.shouldBe("1", "2", "3");
  730.         Tasks.itemsLeftShouldBe(0);
  731.         Tasks.goCompleted();
  732.         Tasks.shouldBe("1", "2", "3");
  733.     }
  734. /*
  735.     после действия тестируемого - проверили все
  736.     и уточнились после перехода на другой фильтр
  737.  
  738.     ранее писала - почему можно не уточняться переходя на другие фильтры
  739.     потому что - есть тест-методы для проверки переходов с фильтра на фильтр
  740.     и у нас есть проверки - как отображаются таски в различных статусах - на различных фильтрах
  741.  
  742.     тоже - уже не будем спорить
  743.     просто прими мое мнение к сведению
  744. */
  745. ***********************************************************************************************************
  746. *************************************************************************************************************
  747. junitTestClasses - https://github.com/AleksanderPopov/automician_course/tree/junitTestClasses
  748.  
  749. ***************
  750. http://joxi.ru/gmvqJvkHLv1Q7r
  751. /*
  752.     не согласна с таким структурным решением
  753.     к предку тест-класса категории не имеют никакого отношения
  754.  
  755.     потому - я б не держала такое в рамках одной ветки
  756. */
  757. *********************
  758. public class FailSuiteTest {
  759. /*
  760.     про это - писала выше, в ответах на вопросы
  761.     я б постаралась обойтись без такого класса
  762.  
  763.     который по сути не сьют
  764. */
  765. ***********************************************************************************************************
  766. *************************************************************************************************************
  767.  
  768. mavenProfiles - https://github.com/AleksanderPopov/automician_course/tree/mavenProfiles
  769.  
  770. ***
  771.  
  772.     <build>
  773.  
  774.             <plugin>
  775.                 <groupId>org.apache.maven.plugins</groupId>
  776.      ...
  777.                 <configuration>
  778.                     <groups>${test.includeCategories}</groups>
  779.                     <excludedGroups>${test.excludedCategories}</excludedGroups>
  780.                     ...
  781.                 </configuration>
  782.                 ...
  783.             </plugin>
  784.  
  785.         </plugins>
  786.     </build>
  787.  
  788.     <profiles>
  789.  
  790.         ...
  791.         <profile>
  792.             <id>full acceptance</id>
  793.             <properties>
  794.                 <test.includeCategories></test.includeCategories>
  795.                 <test.excludedCategories>
  796.                     com.alexautomician.todomvc.configuration.categories.DefaultFail,
  797.                     com.alexautomician.todomvc.configuration.categories.Buggy
  798.                 </test.excludedCategories>
  799.             </properties>
  800.         </profile>
  801.  
  802.     </profiles>
  803.  
  804. /*
  805.      ты писал -
  806.  
  807.       что то у меня не получилось сделать нормальные профили сделать all и acceptance,
  808.             почему то в них включается DefaultFail тест :\
  809.  
  810.       я писала и ранее - эта идея - создавать то ли специальный сьют, то ли специальые категории
  811.       для случая не так заданных сьюта или профиля - мне кажется не верной
  812.       и я выше писала - как стоит разрулить это
  813.  
  814.       в данном случае - тоже идея со специальной категорией такой - достаточно странная
  815.       что-то добавить, чтоб потом только исключать - не знаю, по-моему, перебор)
  816.       предлагаю просто - не делать ни категорию, ни такой тест-класс)
  817.      
  818.       что до синтаксиса - перечисления через запятую
  819.       насколько это применимо для категорий
  820.      
  821.       вот тут - не перечислены groups и excludedGroups - что можно применять к ним синтаксис с запятыми  
  822.       http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html
  823.      
  824.       тем не менее, по информации от JUnit - вроде как возможно указывать через запятую категории
  825.       https://github.com/junit-team/junit4/wiki/Categories (Using categories with Maven)
  826.      
  827.       а у Мавена - про перечисление категорий ничего не написано, зато описан интересный момент по использованию наследования категорий)
  828.       http://maven.apache.org/surefire/maven-surefire-plugin/examples/junit.html (Using JUnit Categories)
  829.  
  830.       Лично я применяла только одну указанную категорию или ни одной - в groups и excludedGroups
  831.       так что - точнее не подскажу)
  832. */
  833. *******************************
  834. /*
  835.     Итого
  836.     по full coverage - считаем задание доделанным. Если посчитаешь нужным - применишь что-то из описанного в этом ревью
  837.    
  838.     по тест сьютам и мавен профайлам
  839.         - избавься от хромдрайвера в проекте
  840.         - избавься от DefaultFail сьютов/категорий/тестов - они не нужны
  841.            
  842.     google/gmail - ход не дошел
  843.         - к следующему ревью просмотри видео по виджетам и попробуй применить эти знания к gmail
  844. */
Advertisement
Add Comment
Please, Sign In to add comment