julia_v_iluhina

Untitled

Jan 17th, 2017
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 26.47 KB | None | 0 0
  1. ==================================================================================================
  2. 1. "зачем удалять файлы - если  - mvn clean - прекрасно зачищает все это"
  3.  
  4.         >>>>>>>> зачем они нам нужны? мавен удалит это да, но это означает что до след рана
  5.                 на диске будет мертвым грузом лежать тонна скринов, видео, html, и т.п.
  6.                 которая к тому же уже в алюре, он же делает свои копии аттачей, т.е. по сути
  7.                 то что осталось после рана (что отдавалось алюру в репорт) это дубли, которые
  8.                 отличаются от аллюровских тем, что в них сложнее разбиратся.
  9. /*
  10.     любые операции - замедлят работу тестов
  11.     файловые операции - не самые быстрые и не самые надежные
  12.     да и вообще - любые операции - могут дать ошибки
  13.     из этих соображений - если что-то можно не делать - лучше не делать - я про работу тестов
  14.  
  15.     если генерится тонна скринов каждый раз - так на эту тонну должно быть место на диске по-любому
  16.     потому - тут экономить бессмысленно
  17.     что они все время лежат
  18.     что на них место должно быть
  19.     мало отличающиеся ситуации, на самом деле
  20.  
  21.     если уж очень хочется экономить
  22.     то я бы такой шаг делала после формирования алюр-репорта
  23.     средствами мавена
  24.     оно бы было явно - "кишками наружу"
  25.     что хорошо
  26.     т к это на самом деле не такой уж стандартный ход - во время формирования результатов по пути еще что-то за собой подчищать
  27.     причем - именно что-то, далеко не все
  28.  
  29.     но вообще - я считаю - не стоит оно того, ни в каком варианте)
  30. */
  31. ==================================================================================================
  32. 2. "public PreConditionsBuilder tasks(TaskType taskType, String... taskNames) {
  33.            /*
  34.                при такой реализации метода - не получишь цепочки тасок
  35.                 закомпличеная а
  36.                 активная b
  37.                 закомпличеная с"
  38.  
  39.             >>>>>>>> в смысле не получишь?
  40.  
  41.                             givenAtTodoMvc()
  42.                                     .tasks(TaskType.ACTIVE, "1")
  43.                                     .tasks(TaskType.COMPLETED, "compl2")
  44.                                     .tasks(TaskType.ACTIVE, "3")
  45.                                     .filter(FilterType.ACTIVE)
  46.                                     .buildPreConditions();
  47. /*
  48.     т е - в списке тасок будут вот такие таски именно вот в такой последовательности?
  49.     активная 1
  50.     закомпличеная compl2
  51.     активная 3
  52.  
  53.     судя по старому коду - нет)
  54.     а должно быть именно так
  55. */
  56. ==================================================================================================
  57. 3. "да и  switch  - не знаю
  58.    мне кажется - решение было бы аккуратнее внутри и проще снаружи
  59.    если бы мы могли вызывать
  60.    ...comlpeledTasks("a", "b").activeTasks("c", "d").completedTasks("e", "f")
  61.    и получать таски - в нужном нам состоянии и именно в такой последовательности"
  62.  
  63.             >>>>>>>> ну проще да, было бы 2 метода вместо одного) ну это то о чем я говорил, что
  64.                     немного по другому реализовал, мне показалось так тоже удобно, что тебе сразу
  65.                     подсказывают что ты можешь добавить стоит тебе написать TaskType.
  66.  
  67.                     сделать как ты предложила - это критично? я не вижу недостатков явных в своем
  68.                     варианте, разве что в твоем можно от TaskType избавится класса вообще, но он
  69.                     может в дальнейшем понадобится, так что не знаю даже)
  70. /*
  71.     Это очень похоже на ситуацию - когда мы реализовывали 3 метода для переходов на каждый фильтр, а не один
  72.     И в фак это рассмотрено
  73.     https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.8bflixemdgfw
  74.  
  75.     когда речь шла о простом варианте решения - просто о наборе гивен-методов - таки да, наверное, правильнее было использовать параметры
  76.     можно было все свести к вариантам
  77.         given(Filter filter, Task... tasks)
  78.         given(Filter filter, TaskType taskType, String... taskTexts)
  79.     или к 6 методам - если фильтр не передавать как параметр, а реализовівать гивені для каждого из фильтров
  80.  
  81.     у тебя - решение позволяет сделать KISS вариант
  82.     причем - все сложности будут под капотом
  83.     тот кто будет вызывать билдер для гивенов -
  84.     указывает имя метода
  85.     ставит точку
  86.     и видит набор методов
  87.     сравнительно не большой
  88.     с очень простым набором параметров
  89.     мы в таком случае - можем вообще людей не прогружать - наличием типов Filter filter и TaskType taskType
  90.     там, где-то глубоко внутри - они вполне могут быть
  91.     но - зачем знать это тем, кто просто юзает решение
  92.     им надо выдать инструменты, желательно - максимально простые, удобные и наглядные
  93.  
  94.     в тестировании - это важно - чтобы код был KISS
  95.     важнее чем при разработке ПО
  96.     этот вроде бы простой момент - в голове укладывается плохо поначалу)
  97.     но потом - доходит - в чем тут плюсы
  98. */
  99. ==================================================================================================
  100. 4. "минимально к ревью
  101.             - упрости решение
  102.             - не лови null pointer exception
  103.             - уйди от мутабельности
  104.             - не убивай файлы
  105.             - не лови IOException
  106.  
  107.         максимально к ревью (можно не делать, это только если видишь практическую пользу для себя)
  108.             - аттачить как скриншот так и ???html - если он сформировался)
  109.             - возможность аттачить на любом степе теста (это не сложно - вызывай в степ-методе - метод с аннотацией Attachment)"
  110.  
  111.                 >>>>>>>> сразу общий ответ по всем репортам:
  112.  
  113.                         1. html генерит screenshot(), takeScreenshotAsFIle() - нет, так что нужно
  114.                             только первый вариант использовать http://prntscr.com/duqlg3
  115.                         /*
  116.                             ну да, если есть цель аттачить и html - тогда да)
  117.                         */
  118.  
  119.                         2. Переделал полностью AllureScreenPublisher -> AllurePublisher (т.к. он уже не только скрины паблишит), обрати внимание:
  120.  
  121.                              -- переделал инициализацию с учетом билдер паттерна, теперь она выглядит так:
  122.  
  123.                                  @Rule
  124.                                  public AllurePublisher publishHtmlonFail = AllurePublisher.onFail().saveHtml();
  125.  
  126.                                  @Rule
  127.                                  public AllurePublisher publishScreenOnSuccess = AllurePublisher.onSuccess().saveScreens();
  128.  
  129.                                  @Rule
  130.                                  public AllurePublisher publishScreensAndHtmlAlways = AllurePublisher.always().saveScreenAndHtml();
  131.  
  132.                                 (кстати можно несколько сразу включать, например 1-й и 2-й, абалдеть крутота :D )
  133.  
  134.                              /*
  135.                                 ага, очень круто)
  136.                                 прям ващее
  137.                                 очень мне понравилось решение
  138.                                 и паттерн соблюден ок)
  139.                              */
  140.                              -- теперь он паблишит не только скрины, но и html
  141.                              /*
  142.                                 это крутое решение, скажу я тебе )
  143.                                 лучшего я не видела
  144.                              */
  145.  
  146.                              -- чистка после паблиша конфигурируема
  147.                              /*
  148.                                 ну я писала тебе - я б не тратилась)
  149.  
  150.                                 а тут - да, у тебя есть cleanAfterPublish
  151.                                 но оно никак не влияет на то будет ли чистка происходить или нет )
  152.                                 чистка и cleanAfterPublish - живут параллельными жизнями
  153.                              */
  154.  
  155.                              -- ловлю IOException, потому что:
  156.                                     * если он вдруг начнет лететь, заглушит Throwable в случае падающего теста
  157.                                     * это checked exception, а правила методов failed() и succeeded() не позволяют добавлять к сигнатуре throws
  158.  
  159.                              -- кидаю AssertionError для того чтобы если вдруг что то отвалится, тесты упали. Если тест успешный - вылетает,
  160.                                 если падающий - добавляю к тому что летело что мол еще и скрины отвалились
  161.                              /*
  162.                                 ок, все логично)
  163.                              */
  164.  
  165.                         3. Добавил класс AllureHelper, в нем методы publishHtml() и publishScreenshot(), можно вызывать в любой момент теста
  166.                             работает: http://prntscr.com/dus2ld
  167.                             /*
  168.                                 тоже красиво все
  169.                                 подумай - как заюзать в AllurePublisher - AllureHelper
  170.                                 чтоб уйти от дублирования кода
  171.                                 и облегчить AllurePublisher
  172.                                 т е - AllureHelper - умеет гененить и аттачить скриншоты/html
  173.                                 AllurePublisher - умеет это вызывать когда нужно
  174.  
  175.                                 будет очень хорошо)
  176.                             */
  177. ==================================================================================================
  178. 5. "public class SmokeTodoMVCTest
  179.    /*
  180.        объединять тесты для Smoke покрытия в одном тест-классе - не свегда удачная идея
  181.        часто - удобнее - когда тесты собраны по тест-классам тематически
  182.        и некоторые из них - составляют смоук покрытие
  183.        это скоро научимся делать
  184.  
  185.        так что - да  - важное заметил - нам надо уметь запускать только тесты для такого-то покрытия
  186.        но реализовывать это нужно по-другому
  187.  
  188.        этот тест-класс - оставь как тест-класс для интеграционных тестов
  189.        фиче-тесты - расположи в соответствующих фильтру тест-классах
  190.  
  191.        в каждом тест-методе - используй гивен-методы
  192.  
  193.        хм....
  194.        смотрю на другие тест-классы - похоже ты так и сделал
  195.        а это - с прошлого задания тест-класс
  196.  
  197.        если так - все равно переименуй тест-класс в TodoMVCTest
  198.        и расположи в правильном пекедже - где ты предыдущие задания собираешь
  199.        как для предыдущего задания - с ним все ок
  200.    */"
  201.  
  202.             >>>>>>>> а то что тесты содержат smoke логику не объединение по тематике?
  203.  
  204.                     так ты не говорила что smoke покрытие можно удалять, как я узнаю что его уже
  205.                     нужно в историю кинуть?
  206.  
  207.                     да и зачем, чем он нам мешает? и логически смоук тест съют должен быть в проекте
  208. /*
  209.     смоук в проекте - да должен быть
  210.     но - это не отдельный тест-класс
  211.     это - набор тестов, которые составят смоук покрытие
  212.     они могут быть раскиданы и по разным классам
  213.  
  214.     так лучше на практике
  215.  
  216.     тест-классы - в них тесты собраны по неким темам - это - то-то тестит, другой класс - что-то другое
  217.     и часть этих тест-методов (не все тест-методы из не всех тест-классов) - и будут составлять смоук покрытие
  218.  
  219.     как раз это категориями и задается - покрытие
  220. */
  221. ==================================================================================================
  222. 6. ""    идеально наверное, вообще вот так -
  223.             page.itemsLeft().shouldBe(...)
  224.  
  225.             ну то потом так напишем)
  226.  
  227.             щас - не буду спорить"
  228.  
  229.                >>>>>>>> я не силен в ООП в джаве пока, ума хватило только на такую реализацию.
  230.                        посмотри пожалуйста, так нормально реализовано?
  231.    /*
  232.        все ок в общем-то
  233.        стоило ли делать иннер-классом - а не знаю)
  234.        может в данном случае и стоило)"
  235.  
  236.             >>>>>>>> ну если мы хотим иметь возможность в цепочки объеденять эту проверку,
  237.                     то как без иннер-класса - я хз
  238. /*
  239.     дождись виджетов, там разберем
  240. */
  241. ==================================================================================================
  242. 7. "    нормально подрубиться к ScreenShooter - не выйдет)
  243.        причину - ты хорошо описал)
  244.        возможно - можно отнаследоваться от ScreenShooter
  245.        и что-то там дописать в потомке
  246.        но я не вижу острой необходимости так делать
  247.  
  248.        твои 2 варианта - ок
  249.        насчет не чистятся - я писала про это
  250.        костыля - не вижу
  251.        особенно - если код немного поравнять)"
  252.  
  253.             >>>>>>>> тогда оставлю рул, я вроде идею развил и теперь это отдельный сервис,
  254.                     к которому можно добавлять сколько хочешь функционала
  255.  
  256.                     ScreeShooter - отнаследоватся нельзя, конструктор приватный
  257. /*
  258.     уже твое решение - крутое
  259.  
  260.     а если еще сделать код более DRY
  261.     и более четко обозначить ответственности Helper & Publisher
  262.     будет идеально
  263. */
  264. ==================================================================================================
  265. 8. "    Прятать создание пейджей в предке тест-класса - не хорошая практика,
  266.        особенно в общем случае - когда у нас несколько пейджей
  267.  
  268.        На самом деле - для разных тест-классов - может понадобиться разный набор пейджей
  269.        Потому - создавать весь набор инструментов - вроде как перебор
  270.  
  271.        Да и скрываем мы это - в тест-классе не ясно - что за пейдж и откуда он берется
  272.  
  273.        Вот если использовать некую одну точку входа - тут создавать некий объект
  274.        с помощью которого можно будет получить доступ к любым пейджам - так оно будет более оправдано
  275.        Если, конечно, пейджей больше одного)
  276.        Да и создание такой точки входа - лучше вынести в отдельный предок тест-класса
  277.        тк  - Single Responsibility principle
  278.  
  279.        Почитай вот тут - диалог Якова и студента, который аналогичное решение применял
  280.        http://pastebin.com/qP85P1SP
  281.        думаю, вопросы должны отпасть
  282.  
  283.        Далее - когда мы с виджетами будем разбираться - как раз вариант с единой точкой входа проработаем"
  284.  
  285.             >>>>>>>> согласен, в предка создание пейджи прятать было глупо.
  286.  
  287.                     из диалога не понял ровным счетом нихрена)
  288.  
  289.                     кто что предлагает, что вообще происходит, какие контейнеры, какие предки...
  290.  
  291.                     когда вариант объявлять страницы полями в классе перестал быть достаточным?
  292.  
  293.                     идея в том чтоб каждый раз не писать с какими страницами работа? в каждом тест классе?
  294.                     так тогда в каждом жеж тесте будет что то типа pages.taskPage или Pages.taskPage если
  295.                     делать отдельный класс...
  296.  
  297.                     а если страница длинно называется, типа как taskWithVeryDifficultFlowPage в тесте
  298.                     прямо так и писать эту колбасу?
  299.  
  300.                     не понял кароче о чем спор вообще)
  301. /*
  302.     Вот студент настаивал - что надо спрятать создание пейджей в предке тест-класса
  303.     чтоб типа не засорять екод тест-классов
  304.  
  305.     вот о чем спор)
  306.  
  307.     привела - т к у тебя было реализовано создание пейджи - в предке тест-класса
  308. */
  309. ==================================================================================================
  310. 10. "    ясно
  311.  
  312.         я писала выше - тут вообще стоит location.reload() делать
  313.         после таких открытий - сразу на урле фильтра
  314.         как показал опыт - самое надежное решение"
  315.  
  316.                 >>>>>>>> неа, все равно падают. оставляю селениумский refresh()
  317.  
  318.                         кстати, а чего вдруг селенидовский рефреш совсем не рефреш, в чем прикол?
  319. /*
  320.     про селенидовский рефреш - первое что делай - когда вопрос возникает - смотри исходники
  321.     вот посмотри например на код open  - https://github.com/codeborne/selenide/blob/master/src/main/java/com/codeborne/selenide/impl/Navigator.java
  322.     там куча вариантов
  323.     в том числе - и странички, открываемые локально
  324.    
  325.     думаю, текущая реализация рефреша - наиболее универсальна в таких обстоятельствах
  326.     это моя гипотеза)
  327. */
  328. ==================================================================================================
  329. 11. "    @Test
  330.         public void clearCompleted() {
  331.             givenAtTodoMvc()
  332.                     .tasks(TaskType.ACTIVE, "1")
  333.                     .tasks(TaskType.COMPLETED, "compl2")
  334.                     .filter(FilterType.ACTIVE)
  335.                     .buildPreConditions();
  336.  
  337.             page.clearCompleted();
  338.             // TODO how to check it with existing functional ?
  339.         }
  340.     /*
  341.         проверь тексты тасок и итемс лефт
  342.  
  343.         этого будет достаточно
  344.  
  345.         уже разбирали в слеке -
  346.         у нас же должен быть тест - когда мы с какого-то фильтра переключаемся на эктив
  347.         и в списке - у нас видимы только активные таски + итемс лефт - именно их и отражает
  348.         (по-моему - не все 6 переходов с фильтра на фильтр покрыты тестами - это высокоприоритетное
  349.         с комплитеда на эктив - нету вроде бы)
  350.  
  351.         в нашем случае - количество видимых тасок в списке (мы проверили тексты)
  352.         равно количеству итемс лефт (мы проверили итемс лефт)
  353.         косвенно - мы можем сделать вывод - что все ок - если эти 2 проверки прошли
  354.  
  355.         если не нравится идея
  356.         можно монизить приоритет clearCompleted на эктив фильтре до среднего и не покрывать
  357.  
  358.         или - придумать - как реализовать маленький е2е
  359.         в котором что-то еще проверить
  360.         и уточнить то - что нам нужно
  361.  
  362.         я за первый вариант
  363.  
  364.         то же касается и других твоих похожих вопросов (то что ты оранжевым в тест-плане выделил)"
  365.  
  366.         >>>>>>>> скрипя сердцем добавил маленькие е2е в те места, т.к. другой возможности нормально
  367.                 проверить не знаю...
  368.  
  369.                 с твоими предложениями по поводу приоритета и косвенных выводов - не согласен)
  370. /*
  371.     не буду спорить)
  372.     когда-то и я с Яковом не соглашалась в этом вопросе)
  373.    
  374.     теперь соглашаюсь)
  375.     просто держала в голове - что есть еще и такой подход
  376.    
  377.     как-то на живом проекте - увидела серьезнейшие выгоды в эффективности подхода
  378.     при том - что в точности не потеряли
  379.     и теперь соглашаюсь)
  380.    
  381.     а поначалу никак не могла согласиться)
  382. */                
  383. ==================================================================================================
Advertisement
Add Comment
Please, Sign In to add comment