yashaka

Untitled

Feb 16th, 2017
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.15 KB | None | 0 0
  1. ========================================================================================================================
  2. public Emails shouldHaveTopics(String... texts) {
  3. topics.shouldHave(texts(texts));
  4. return this;
  5. }
  6.  
  7. ?
  8.  
  9. если уж ты решил быть "таким точным" (что в принципе не плохая идея), то разве не стоит отдельно иметь topics вместо mails, и таки переиспользовать уже готовую реализацию цикла? а не с нуля ее писать...
  10.  
  11.  
  12. >>>>>>>> смотри, я переделал, опять) подумал про твою идею 'topics', но т.к. я все еще не умею мапить коллекцию в
  13. коллекцию, создал отдельные переменные...
  14.  
  15. для того чтоб коллекции норм искались где надо я решил сделать контейнер со всеми емейлами, но после этого
  16. я узнал что когда ты ищешь там этих контейнеров становится два, так что мне пришлось их фильтровать и брать
  17. нужный, но т.к. это тригерит реальное действие, я засунул это все дело в метод container(), чтобы сделать
  18. поиск lazy, чет не догнал как сделать лучше)
  19.  
  20. Email класс пока оставил, он мне сейчас как бы не нужен, но вообще в целом в тестах он может пригодится, так
  21. что я не стал его удалять)
  22.  
  23.  
  24. ***
  25. .shouldHave(sizeGreaterThanOrEqual(1))
  26. .first();
  27.  
  28. шулд лишний
  29. селениде автоматом подождет именно такого же кондишена
  30.  
  31. ***
  32. @Step
  33. public Emails unreaded() {
  34. return new Emails("zE");
  35. }
  36.  
  37. не сильно читабельно получилось...
  38. я бы лучше завернул этот конструктор в другой класс
  39. типа
  40. new UnreadedEmails()
  41.  
  42. либо так... либо лучше как у тебя раньше было :)
  43.  
  44. ***
  45. .shouldHaveSize(number + 1).get(number));
  46.  
  47. и здесь шулд лишний
  48.  
  49. ***
  50. container().shouldBe(visible).findAll("tr");
  51.  
  52. и здесь шулд лишний... селениде все сам за тебя сделает..
  53. зачем ты это начал писать? :) раньше же не страдал таким кажется :)
  54.  
  55. ***
  56. public Emails shouldHaveTopics(String... texts) {
  57. topics.shouldHave(exactTexts(texts));
  58. return this;
  59. }
  60.  
  61. да, норм, абсолютно достаточно этого пока...
  62.  
  63. >>> я все еще не умею мапить коллекцию в
  64. коллекцию,
  65.  
  66. в селениде этого нормально просто не сделаешь...
  67. да в принципе можно и обойтись, все равно при работе обычно нужный один топик а не все...
  68.  
  69. и можно все это реализовать максимум на уровне:
  70.  
  71. topic(int index) {
  72.  
  73. return new Topic(this.mails.get(index))
  74. }
  75.  
  76. а shouldHaveTopics оставить на уровне Emails
  77.  
  78. ***
  79. public Emails() {
  80. mailsContainer = container().shouldBe(visible).findAll("tr");
  81. authors = container().shouldBe(visible).findAll(".yX .yW>span");
  82. topics = container().shouldBe(visible).findAll(".y6 span[id*=':']");
  83. messages = container().shouldBe(visible).findAll(".y6 .y2");
  84. }
  85.  
  86. public Emails(String cssClass) {
  87. mailsContainer = container().findAll(String.format("tr.%s", cssClass));
  88. authors = container().findAll(String.format("tr.%s .yX .yW>span", cssClass));
  89. topics = container().findAll(String.format("tr.%s .y6 span[id*=':']", cssClass));
  90. messages = container().findAll(String.format("tr.%s .y6 .y2", cssClass));
  91. }
  92.  
  93. вот здесь точно дублировать локаторы не стоит... потому что они еще и не читабельные...
  94.  
  95.  
  96. Но, почему не переиспользовать уже конструктор с cssClass?
  97.  
  98. ты же можешь внутри одного другой конструктор вызвать через this(нужныйЦссКласс)
  99.  
  100. tr.%s
  101.  
  102. вот эта часть повторяется часто... может она тоже часть какого то "контейнера" который можно вынести повыше?
  103.  
  104. а может только tr
  105.  
  106. в общем мне твои локаторы кажутся какими то сильно большими :) но я не уверен что можно упростить
  107. это так - идея обратить на это внимание
  108. ***
  109. private SelenideElement container() {
  110. return $$(".UI")
  111. .filterBy(visible)
  112. .shouldHave(sizeGreaterThanOrEqual(1))
  113. .first();
  114. }
  115.  
  116. там наверное лучше такой локатор будет: $("[role='main']");
  117. но нужно смотреть ближе
  118. ***
  119.  
  120. по лейзи...
  121. в твоей реализации контейнера - мне кажется не важно был бы он методом или переменной
  122. в селениде и так все лейзи...
  123.  
  124. ========================================================================================================================
  125. >>>>> я бы использовал похожий подход с той целью что бы в сьюте buggy всегда бил один тест который падает. Ибо идея сьюта багги в том, что бы на него завязать джобу в дженкинсе которая всегда будет падать со всеми тестами... и если все тесты падают - тогда имейл не приходит команде - сигнализируя о том что все хорошо. В этом случае "все хорошо" - значит что все тесты падают как и ожидается - на них есть ишью в джире - и мы просто еще не планировали их фиксить... а если вдруг какой то тест начинает проходить - значит это сигнал - что что то поменялось и и должен прийте имейл - что мы обратили внимание, разобрались что по чем - может баг чудесным образом какой то сам пофиксился - и стоит его перепроверить и из джири удалить, убрать анотацию @buggy и успокоится. При такой схеме, когда все баги будут по фикшены - то эта джоба начнет "проходить а не падать" - и вся настройка по имейл нофификации поламается :) И типа что бы этого не было - нужно что бы в сьюте оставался всегда один тест который падает.
  126.  
  127.  
  128. >>>>>>>> я понял так: ты делаешь джобу, в нее тулишь все падающие по багам тесты, которые должны падать.
  129. если она вдруг зеленая, то приходит нотификейшн, что мол что то идет не так, надо проверить.
  130. >>>> там нужно ее еще так хитро настроить, что бы не только когда она зеленая, а когда хотя бы один тест прошел :) это наверное ответит на твои вопросы ниже... но я если честно с нотификейшенами так не игрался еще... это пока на уровне гипотезы что в дженкинсе так можно сделать
  131.  
  132. такие вопросы:
  133. - если например багов 10, а тестов упало 9, а не 10, как ты узнаешь, что произошла ошибка? ты где то
  134. явно указываешь сколько должно падать?
  135. - если ты таки явно указываешь, то зачем тест который всегда падает, достаточно же считать грубо
  136. говоря количество фейлов, и если ты скажешь что их должно быть 0, то и ладно...
  137.  
  138. идея интересная, но пока не совсем понял как реализовано это у тебя)
  139. >>>>> пока никак) пока гипотеза только
  140. ========================================================================================================================
  141. >>>>>> что значит зависимыми от одной функции? Во первых не обманывай себя. Да мы стараемся писать "фиче тесты" атомарными - но это все равно не юнит тесты. Они все равно "интеграционные", и все равно тестируют несколько вещей сразу... Во вторых неправильно говорить "зависимыми от одной функции". Функции написаны один раз и работают. Ты же не удивляешься что у тебя много тесто завист от "одного конструктора пейджи" (который тоже есть "одной функцией"). Это не функции могут поламаться а фичи. А я тебе выше уже писал что нет фичи каунтера - есть 7 или сколько там разных фич (реально подфич соответствующих действий над задачами). Поэтому тесты не зависит от одной фичи - как раз каждый зависит от одной подфичи - ее и тестирует. И если поламается - то один тест а не все сразу. Есть правда еще зависимость от локатора. Но это нормально. Точно так же как все тесты зависят от одного урла страници - который тоже может поменятся. Это интеграционные тесты - мы полюбому в них зависим. Их нельзя сделать идеальными "юнит тестами". Мы просто можем уменьшить эти зависимости где риски велики. В этом случае он не велик. Все все равно "не проконтролируешь". Более важно сейчас (где под сейчас имеется ввиду ситуация когда типа как нам важно покрыть все эти подфичи потому что они типа как часто ломаются) покрыть все эти разные (а не одна) подфичи...
  142.  
  143. фича каунтера представляется мне как функция, которая рендерит кусок Html вместо текущего, значит она
  144. может быть одна, что то типа changeItemsLeft(i), которую нужно вызывать в специфических действиях, связанных
  145. с кол-м активных тасок. и если в этой функции конкретно что то пойдет не так, то все тесты сломаются....
  146.  
  147. то что ты там себе представляешь не соответствует действительности. Залезь в код и посмотри;)
  148.  
  149. ты считаешь что профит от такой проверки стоит риска?
  150.  
  151. я считаю что риска нет) Риск точно такой как риск от того что урл может поменятся... Ну ок, слегка больше, но все равно, он намного меньше чем то что реально мы пропустим баги по этому каунтеру для разных ситуаций с действиями... Потому что еще раз - каунтер - это 7 разных каунтеров по сути для каждого действия.
  152.  
  153.  
  154. >>>>>>>> ты шаришь как написано приложение, а я нет, и ты пытаешься мне объяснить с точки зрения
  155. девелопмента что это таки нужно проверять, а я не понял этого изначально, и думал что ты с точки зрения
  156. тестирования мне это все говорил)
  157.  
  158. посмотрел на гитхабе, особо ниче не понял, я вообще в js не особо :)
  159.  
  160. ок, аргумент принимается, добавлю во все фича тесты проверки на itemsleft, как Юля когда то изначально
  161. мне говорила)
  162.  
  163. >>> да да) с точки зрения девелопмента :) я кажется в самом начале тебе об этом говорил :)
  164. в том то и фишка что когда пишешь автоматизацию - приходится понимать как работает код, иначе нельзя эффективно построить автоматизацию... поэтому обычно если сам не шаришь - нужно ходить к программистам и спрашивать у них советов...
  165.  
  166. ну а так то - учи джеес)
  167. это на самом деле важно для автоматизации также... вот хотя бы что бы знать слегка такие нюансы...
  168. ========================================================================================================================
Advertisement
Add Comment
Please, Sign In to add comment