julia_v_iluhina

Untitled

Jan 19th, 2017
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 32.78 KB | None | 0 0
  1. questions - https://github.com/AleksanderPopov/automician_course/blob/master/questions_and_review/12_questions.txt
  2. ==================================================================================
  3. 1. "    любые операции - замедлят работу тестов
  4.        файловые операции - не самые быстрые и не самые надежные
  5.        да и вообще - любые операции - могут дать ошибки
  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. /*
  33.     ну давай представим такую машину)
  34.  
  35.     проще всего представить машину с CI Server-ом
  36.     например Jenkins-ом
  37.     на котором запускаются джобы
  38.  
  39.     проектов много, настроенных Job - соответственно
  40.  
  41.     они запускаются независимо друг от друга
  42.     и независимо друг от друга - при запуске - будут генерить гигабайты хлама
  43.  
  44.     значит - ресурсов на этом сервере - должно быть столько - что даже если все гигабайты хлама будут нагенерены
  45.     одновремено
  46.     ресурсов должно хватать
  47.     если это не так - это проблема серьезная)
  48.     и просто вот такими поисками ресурсов - ее глупо решать
  49.     время специалиста, который будет вот так гоняться за ресурсами - стоит дороже самих ресурсов)
  50.  
  51.     а раз так - сомнительно, что нужно их чистить
  52.  
  53.     ну допустим, хочется чистить
  54.     ну ок, чисть в рамках post build Action (если мы о дженкинсе говорим) и делай mvn clean
  55.  
  56.     или  - запускай сначала
  57.     mvn clean test - тесты выполнили
  58.     mvn site - отчеты нагенерили,
  59.     ... - куда-то там их сохранили
  60.     mvn clean - опять все зачистили
  61.  
  62.     я никогда этого не делала - не чистила папки ПОСЛЕ запуска тестов )
  63.     и пока твоих доводов мне не хватило - чтоб я начала так делать )
  64.  
  65.     так что рассуждаю - считай о коне в вакууме сферическом
  66.  
  67.     всегда - перед запуском тестов - выполняю clean и этого с головой достаточно (мне)
  68.  
  69.     если знаешь как это можно сделать, чтобы еще можно было включать-выключать, скажи пожалуйста - вот это не поняла
  70.     что включать-ваключать
  71.     если про то как вызывать - то как писала выше
  72.     зависит от того - как тесты запукаются, каким инструментом
  73. */
  74. ===================================================================================
  75. 2. "    т е - в списке тасок будут вот такие таски именно вот в такой последовательности?
  76.        активная 1
  77.        закомпличеная compl2
  78.        активная 3
  79.  
  80.        судя по старому коду - нет)
  81.        а должно быть именно так"
  82.  
  83.             >>>>>>>> а у меня сейчас просто сначало все активные, потом все закомпличенные)
  84.                     нужно сделать так чтоб они как пишутся в тестах, в таком порядке и добавлялись?
  85. /*
  86.     ну да, как мы задали таски, чтоб точно так, в той же последовательности они добавлялись)
  87.     а то - нагородили кода, билдер-паттерны и все такое)
  88.     а такого простого не обеспечили)
  89. */
  90. ===================================================================================
  91. 3. "    про селенидовский рефреш - первое что делай - когда вопрос возникает - смотри исходники
  92.        вот посмотри например на код open  - https://github.com/codeborne/selenide/blob/master/src/main/java/com/codeborne/selenide/impl/Navigator.java
  93.        там куча вариантов
  94.        в том числе - и странички, открываемые локально
  95.  
  96.        думаю, текущая реализация рефреша - наиболее универсальна в таких обстоятельствах
  97.        это моя гипотеза)"
  98.  
  99.             >>>>>>>> я как раз смотрел, и там же и увидел что нет такого метода как refresh(),
  100.                     а есть скрытый navigate(url), и спросил, может ты знаешь почему так)
  101.  
  102.                     странное решение, учитывая что как вот показывает практика оно не особо
  103.                     работает в рядовых кейсах
  104. /*
  105.     это не рядовой кейс)
  106.     т к вот эти странички - по фильтрам которые - ведут себя ... не совсем как разные странички с разными урлами)
  107.     тут мы еще и на особенности реализации этой версии todoMVC наступили)
  108.     так что случай не совсем рядовой)
  109.  
  110.     и ты б всего вот этого не заметил
  111.     если бы в рамках гивен-методов - делал переходы используя линки переходов по фильтрам)
  112.  
  113.     но мы ж сразу наворачиваем)
  114.     за что и заплатили)
  115. */
  116. ===================================================================================
  117. 4. "    не буду спорить)
  118.        когда-то и я с Яковом не соглашалась в этом вопросе)
  119.  
  120.        теперь соглашаюсь)
  121.        просто держала в голове - что есть еще и такой подход
  122.  
  123.        как-то на живом проекте - увидела серьезнейшие выгоды в эффективности подхода
  124.        при том - что в точности не потеряли
  125.        и теперь соглашаюсь)
  126.  
  127.        а поначалу никак не могла согласиться)"
  128.  
  129.             >>>>>>>> может когда я увижу что действительно в точности не потеряно,
  130.                     поменяю мнение) пока я вижу что куски функционала остаются плохо
  131.                     проверенными, или вообще непроверенными при таком подходе)
  132. /*
  133.     ну, повторяться не будем
  134.     пока держи в голове - что есть и такой подход
  135.     может когда-то придешь к такому же выводу)
  136. */
  137. ===================================================================================
  138. 5. "http://joxi.ru/Dr860ybh4oqdQ2
  139.    /*
  140.        исходя из того - что такие классы могут беть переиспользованы не только для todoMVC - разумно вынести это по структуре выше
  141.        в пекедж core (или api)
  142.  
  143.        GivenHelpers - в пекедже given или helpers
  144.        что-то более близкое по смыслу
  145.        точно не api это
  146.    */"
  147.  
  148.         >>>>>>>> согласен, переместил гивены для todomvc в соотв. пекедж
  149. /*
  150.     ок
  151. */
  152. ===================================================================================
  153. 6. "public class AllureHelper {
  154.  
  155.        @Attachment(value = "Page-screenshot", type = "image/png")
  156.        public static byte[] publishScreenshot() {
  157.            String path = getPathOf(screenshot());
  158.            ...
  159.        }
  160.  
  161.        @Attachment(value = "Page-source", type = "text/html")
  162.        public static byte[] publishHtml() {
  163.            String path = getPathOf(screenshot());
  164.            ...
  165.    /*
  166.        тут можно чуть оптимальнее
  167.  
  168.        если нам нужно приаттачить и скриншот, и html
  169.        то получится - что мы дважды вызываем screenshot()
  170.  
  171.        помимо того что это не оптимально
  172.        еще может быть вот что
  173.        вызвали publishScreenshot() - зафиксили скриншот
  174.        ситуация успела поменяться
  175.        потом вызываем publishHtml() - получаем  html, который к только что приаттаченному скриншоту - никакого отношения не имеет
  176.        можно долго разбираться в таких дебрях)"
  177.  
  178.             >>>>>>>> я переделал, можно теперь вот так вызывать
  179.  
  180.                     AllurePublisher.publishNow().screen();
  181.  
  182.                     AllurePublisher.publishNow().pageSource();
  183.  
  184.                     AllurePublisher.publishNow().screenAndSource();
  185.  
  186.                     вроде норм, можно было бы затулить без иннер класса прям в паблишер,
  187.                     но мне почему то показалось красивее так сделать, чем вызывать
  188.                     длинные методы типа
  189.  
  190.                     AllurePublisher.publishScreenAndSource();
  191.  
  192.                     получается мы будем использовать этот класс или в руле, или когда нужно сфоткать
  193.                     в конкретный момент что то, и я сразу хочу отделить визуально интерфейсы для разных
  194.                     задач, мол если оформляешь рул, то onFail, если сейчас то publishNow
  195.  
  196.                     ну вот чет просто мне показалось что так будет красиво и просто вншне)
  197. /*
  198.     Не)
  199.     я предлагала тебе вариант покрасивее)
  200.  
  201.     в моем варианте - каждый класс отвечал за свое
  202.     Твое решение - нарушает Single Responsibility Principle
  203.  
  204.     получился более сложный вариант
  205.     советую переделать
  206.  
  207.     скажем так, настаивать не стану в категорической форме
  208.     но и не жди от меня - что я соглашусь - что текущее решение - красивое
  209.  
  210.     все может быть стройнее гораздо
  211.     к тому же, мной предложенный вариант - его и нарастить сможешь другими какими-то паблишерами
  212.  
  213.     в общем - делать или нет - на твое усмотрение )
  214.     мое мнение ты понял)
  215.  
  216.     Не факт, что Яков согласился бы со мной или с тобой)
  217.     Он тоже фанат Single Responsibility Principle )
  218. */
  219. ===================================================================================
  220. 7. "    и дальше это можно использовать
  221.        @Rule
  222.        public Publisher publisher = Publisher.always().withAttachments(allureAttachment().withScreenshot().withHtml().build()).createPublisher();"
  223.  
  224.             >>>>>>>> это трешак какой то, читается плохо и выглядит страшно) как по мне сейчас проще
  225. /*
  226.     как по мне - трешак сейчас), к этой версии
  227.     когда в одном классе - понапихано всякого
  228.  
  229.     для варианта always() - на фига вообще рула)
  230.     гораздо проще заюзать
  231.     After-метод с вызовом красивого лаконичного паблишера
  232.  
  233.     если с рулой все же хочется
  234.     и мной предложенная строка не нравится
  235.     может - можно как-то упростить выражение
  236.     объявить переменную выше и присвоить ей allureAttachment().withScreenshot().withHtml().build()
  237.     и уже затем - использовать ее для рулы
  238.  
  239.     для меня всегда индикатор - когда я не в состоянии придумать имя переменной
  240.     то может и не стоит это придумывать)
  241.  
  242.     ну и наверное - можно имена как-то поравнять
  243.     станет лучше)
  244.     про это проще думать - когда структурно и функционально классы реализованы
  245.     все работает
  246.     потом дать точные лаконичные имена  - проще
  247.  
  248.     дальше - или реализуй мной предложеный вариант
  249.     и сам подумай над именами всех классов и методов
  250.     или - давай останемся при своих мнениях и остановимся по данному вопросу
  251.  
  252.     мне и самой интересно тот вариант что я предложила - реализовать)
  253.     может так и сделаю
  254.     когда время на это будет)
  255.  
  256. */
  257. ===================================================================================
  258. 8. "private void addTasksToLocalStorage() {
  259.            StringBuilder tasksJson = new StringBuilder("");
  260.            tasksJson.append(doJsonfromList(true, activeTasks))
  261.                    .append(tasksJson.toString().isEmpty() ? "" : ",")
  262.                    .append(doJsonfromList(false, completedTasks));
  263.    /*
  264.        вот - видишь
  265.        получаем - всегда будут идти вначале - активные таски
  266.        потом - закомпличеные
  267.        как бы мы их не добавляли сами - картинка будет только такая
  268.  
  269.        а надо - как добавляли
  270.        чтоб в такой последовательности они и шли"
  271.  
  272.             >>>>>>>> не совсем понял что ты имела ввиду, как ты видишь имплементацию корректную,
  273.                     но я перепедалировал, вроде все ок, ну работает так точно, и кода меньше стало,
  274.                     я там еще пару косяков исправил у себя)
  275. /*
  276.     посмотрела на текущую реализацию
  277.     теперь таски добавятся в том же порядке
  278.     что и задан при вызове
  279.     что ок
  280. */
  281. ===================================================================================
  282. 8. "   public enum Filter {
  283.            ALL(""),
  284.            ACTIVE("active"),
  285.            COMPLETED("completed");
  286.  
  287.            private String subUrl;
  288.  
  289.            Filter(String subUrl) {
  290.                this.subUrl = subUrl;
  291.            }
  292.  
  293.            @Override
  294.            public String toString() { return "https://todomvc4tasj.herokuapp.com/#/" + this.subUrl; }
  295.         }
  296.     /*
  297.         чуть более DRY вариант предлагаю
  298.  
  299.         не настаиваю - т к твой вариант более KISS )
  300.         а это тоже важно)
  301.  
  302.         лично для себя я держу такую грань
  303.         то что юзаю в тест-методах - должно быть более KISS
  304.         а вот сама реализация пейджей/виджетов/хелперов/кондишенов - тут уже просто правила разработки ПО применяю
  305.         DRY - тут уже важно )
  306.         т е - снаружи все эти  пейджи/виджеты/хелперы/кондишены = то что видно при использовании этого всего
  307.         должно конечно обеспечивать KISS
  308.         а вот внутри - там где мы алгоритмы реализуем, какую-то сравнительно серьезную логику - там уже значимость DRY - гораздо выше
  309.  
  310.         потому бы - для enum Filter
  311.         выбрала более DRY реализацию"
  312.  
  313.             >>>>>>>> крутая идея, спасибо! согласен про DRY, звучит логично)
  314.                     типа то что могут видеть и неопытные автотестеры, или
  315.                     новички, должно выглядеть просто, а то что внутри уже
  316.                     должно быть эффективно)
  317. /*
  318.     )
  319.     да, мысль простая
  320.     )
  321.     но рабочая
  322. */                    
  323. ===================================================================================
  324. 9. "return tasks.findBy(cssClass("editing"))
  325.                    .find(" .edit")
  326.    /*
  327.        тут - пробел перед  .edit не дает ровно ничего
  328.  
  329.        метод find для SelenideElement - ищет строго внутренние элементы
  330.        согласно цсс селектору = маске
  331.  
  332.        так что от этого пробела - ни холодно, ни жарко"
  333.  
  334.             >>>>>>>> та я случайно оставил, провтыкал )))
  335. /*
  336.     надеюсь, разбор по линке в описании этой ошибки - тебе что-то новое открыл )
  337.     в свое время для меня такой эффект был неожиданностью
  338. */            
  339. ===================================================================================
  340. 10. "    */
  341.             given().completed("compl1")
  342.                     .atAllFilter()
  343.                     .prepare();
  344.  
  345.             add("2");
  346.             /*
  347.                 в этот момент = у тебя 2 таски в списке
  348.                 значит - операция edit("2"
  349.                 не проверит результат предыдущей операции add("2");
  350.                 т к проверит состояние только одной из 2-ух тасок"
  351.  
  352.                     >>>>>>>> минуточку) мы говорили что гивен не проверяем,
  353.                             а операция add не трогает ничего кроме создающейся
  354.                             таски, поэтому я проверяю edit("2"), и после этого
  355.                             остаюсь со всем проверенным (гивен + таск2)
  356. /*
  357.     мы результат гивена - и не проверяем
  358.     нету же проверки после вызова гивена
  359.     и не надо
  360.     речь только про это
  361.     что тут, после вызова гивен-метода - не нужна проверка    
  362.    
  363.     но вот любая проверка теста = должна проверять не только ту таску
  364.     с которой мы поработали
  365.     но и весь список тасок
  366.    
  367.     это уже вопрос не к гивену
  368.     а к тестовой ситуации
  369.     если у тебя одна таска в списке - то да
  370.     проверка через следующее действие над единственной таской - уместна
  371.     а так - нет
  372.    
  373. */                            
  374. ===================================================================================
  375. 11."        edit("2", "edited2");
  376.            shouldHave("compl1", "edited2");
  377.  
  378.            goActive();
  379.            /*
  380.                следующее действие - лишь проверит что "edited2" - есть
  381.                а состояние всего списка - не проверено
  382.  
  383.                я б только тут добавляла вторую таску
  384.                после проверки состояния списка
  385.            */"
  386.  
  387.                 >>>>>>>> в смысле состояние не проверено? а что проверяет shouldHave,
  388.                         если не состояние всего списка?
  389. /*
  390.     нужна проверка после перехода на Active фильтр
  391.    
  392.     shouldHave("compl1", "edited2"); - она ПЕРЕД переходом на фильтр
  393.     а тут речь о проверке ПОСЛЕ перехода
  394. */                        
  395. ===================================================================================
  396. 12. "    @Test
  397.         public void basicTasksFlow() {
  398.         /*
  399.             перемудрил малость ты с тестом)
  400.         */
  401.             given().completed("compl1")
  402.                     .atAllFilter()
  403.                     .prepare();
  404.  
  405.             add("2");
  406.             /*
  407.                 в этот момент = у тебя 2 таски в списке
  408.                 значит - операция edit("2"
  409.                 не проверит результат предыдущей операции add("2");
  410.                 т к проверит состояние только одной из 2-ух тасок
  411.  
  412.                 не торопись добавлять таску
  413.                 ты ж можешь и compl1 отредактировать
  414.  
  415.                 кстати - не советую так таску называть)
  416.                 вот это - активная или закомпличеная - очень легко меняется в процессе
  417.                 и выносить это в имя таски - имхо - перебор
  418.  
  419.                 и еще - не сокращай слова
  420.                 если сокращение не общепринятое - не используй его
  421.             */
  422.             edit("2", "edited2");
  423.             shouldHave("compl1", "edited2");
  424.  
  425.             goActive();
  426.             /*
  427.                 следующее действие - лишь проверит что "edited2" - есть
  428.                 а состояние всего списка - не проверено
  429.  
  430.                 я б только тут добавляла вторую таску
  431.                 после проверки состояния списка
  432.             */
  433.             cancelEdit("edited2", "notedited2");
  434.             toggle("edited2");
  435.             /*
  436.                 проверка?
  437.                 идем по кругу)
  438.             */
  439.  
  440.             goCompleted();
  441.             /*
  442.                 проверка нужна
  443.             */
  444.             destroy("edited2");
  445.             shouldHave("compl1");
  446.             /*
  447.                 как-то без имени пейджа - shouldHave("compl1") - по-сиротски выглядит)
  448.                 не понятно - кто это кому должен)
  449.                 читай чуть ниже
  450.             */
  451.             toggle("compl1");
  452.             /*
  453.                 нужна проверка
  454.                 эххх)
  455.             */
  456.  
  457.             goAll();
  458.             shouldHave("compl1");
  459.         }"
  460.  
  461.             >>>>>>>> половину не понял наездов, но осознал что проверок
  462.                     не хватает, добавил)
  463. /*
  464.     еще раз расскажешь мне про наезд - будешь ждать ревью от Якова)
  465.     мне вот этого цирка еще от тебя не хватало)
  466.    
  467.     наездов нет, не было и не будет
  468.     есть только разбор кода
  469.     и усе)
  470.    
  471.     посмотрю на код, откомменчу и приведу правильный вариант - если потребуется
  472. */                    
  473. ===================================================================================
  474. 13. "кстати - Tasks.shouldHave("compl1") - уже ниче так) попонятнее)
  475.    а если не хочешь явно указывать для методов пейджа - имя его класса Tasks
  476.    то тогда лучше для проверок используй имена assert....
  477.    так оно логичнее будет"
  478.  
  479.             >>>>>>>> я переименовал shouldHave в shouldBe, без названия класса
  480.                     выглядит норм, с названием тоже, не хочу assert.... добавлять метод)
  481. /*
  482.     пока не вижу особой разницы - shouldBe или shouldHave
  483.    
  484.     код уже откомменчу
  485.     пока сложно окончательно что-то сказать
  486.    
  487.     но на первый взгляд - вряд ли оно помогло)
  488.     если только shouldBe вместо shouldHave и более ничего
  489. */                    
  490. ===================================================================================
  491. 14. "    @Step
  492.         public static ItemsLeft itemsLeft() {
  493.             return new ItemsLeft();
  494.         }
  495.  
  496.         public static class ItemsLeft {
  497.             private static final SelenideElement element = $("#todo-count>strong");
  498.  
  499.             public void shouldBe(int itemsCount) {
  500.                 element.shouldHave(exactText(String.valueOf(itemsCount)));
  501.             }
  502.         }
  503.     /*
  504.         для подхода с пейджами-модулями
  505.         я бы продолжила и тут тему
  506.  
  507.         Tasks.ItemsLeft.shouldBe...
  508.  
  509.         т е - от метода itemsLeft() - избавилась бы)
  510.  
  511.         раз пейджи-модули - знач пейджи-модули)
  512.         никаких объектов)"
  513.  
  514.             >>>>>>>>> звучит логично, но не совсем согласен) во первых если писать
  515.                     уже ItemsLeft.shouldBe() то логично приписывать еще и Tasks.ItemsLeft
  516.  
  517.                     а если писать Tasks, то и во все остальные вызовы тоже нужно тулить
  518.                     имя класса, чего не хотелось бы.
  519.  
  520.                     плюс еще и @Step аннотацию не удобно было бы в случае с иннер-классом
  521.                     тулить к методу shouldBe(int i), т.к. в отчете было бы не понятно, что
  522.                     там должно быть где куда)
  523.  
  524.                     кароче удалил все, оставил метод shouldBeItemsLeft().
  525. /*
  526.     да, есть такое с пейджами-модулями)
  527.     верно подметил
  528.     что репортиться будут только методы
  529.     и тут конечно может быть засада)
  530.    
  531.     твой вариант - имеет право на жизнь
  532.     но про формулировки - еще посмотрим)
  533.     тут пока не уверена
  534.     надо читать код
  535. */                    
  536. ===================================================================================
  537. 15. По замечаниям по именованию, покрытию, и шатанию:
  538.         - ставлю везде Tasks.
  539.             * т.к. чтоб не было коллизий методов пейджи с методами тестов
  540.             * чтоб можно было нормально вставлять в аллюр itemsLeftShouldBe
  541.         - переименовал нормально все тестовые методы
  542.         - проверил что они соответствуют содержимому)
  543.         - удалил SmokeTest т.к. это почти то же самое что и TasksIntegrationFlowTest
  544.         - items left проверяю как договаривались, на одном контексте только.
  545.             т.е. все вариации покрыты, просто на разных фильтрах, а не на всех сразу
  546. /*
  547.     буду читать код)
  548.     про items left - в е2е стоит покрыть единожды вообще, это да
  549.     но в фиче-тестах - эта проверка еше и уточняет проверку тестовой ситуации
  550.     помимо того что мы покрываем и проверку этой фичи по пути
  551.    
  552.     действительно, если из фиче-тестов убрать проверку items left
  553.     то не во всех тестах будет достаточно проверить состояние списка тасок
  554.     в общем - если я тебя правильно поняла конечно
  555.     ты с фиче-тестами погорячился)
  556.    
  557.     буду читать код)
  558. */            
  559. ===================================================================================
Advertisement
Add Comment
Please, Sign In to add comment