yashaka

Untitled

Feb 14th, 2017
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 30.98 KB | None | 0 0
  1.  
  2. >>>>> не, ну вы сударь изрващенец-с...
  3.  
  4. зацени, твой вариант:
  5.  
  6.  
  7. public Emails shouldHaveTopics(String... texts) {
  8. mails.shouldHaveSize(texts.length);
  9. for (int i = 0; i < texts.length; i++) {
  10. get(i).shouldHaveTopic(texts[i]);
  11. }
  12. return this;
  13. }
  14.  
  15. и тот на который я тебе намекал:
  16.  
  17.  
  18. public Emails shouldHaveTopics(String... texts) {
  19. mails.shouldHave(texts(texts));
  20. return this;
  21. }
  22.  
  23. мне не понятно зачем городить фор, если он уже встроен внутрь кондишена CollectionCondition.texts
  24.  
  25. >>>>>>>> ага, может я и извращенец, зато мой код работает как ожидается)) твой смотрит на контейнер емейла, который
  26. включает в себя кусок дескрипшена, автора, топик, и т.п.
  27. а можно ли смапить коллекцию элементов красиво в коллекцию детей я не знаю как...подскажи, если знаешь)
  28.  
  29.  
  30. >>>>>> ну ну :) окей, а как тебе такой тогда вариант:
  31.  
  32. public Emails shouldHaveTopics(String... texts) {
  33. topics.shouldHave(texts(texts));
  34. return this;
  35. }
  36.  
  37. ?
  38.  
  39. если уж ты решил быть "таким точным" (что в принципе не плохая идея), то разве не стоит отдельно иметь topics вместо mails, и таки переиспользовать уже готовую реализацию цикла? а не с нуля ее писать...
  40.  
  41. и если уж ты решил все делать так точно... то возможно достаточно было бы синтаксиса
  42.  
  43. THEN().atInboxPage()
  44. .emails()
  45. .topics()
  46. .shouldBe(topic);
  47.  
  48. вместо
  49.  
  50. THEN().atInboxPage()
  51. .emails()
  52. .shouldHaveTopics(topic);
  53.  
  54. но может это уже будет перебор... скорее сдесь это не нужно... будет пока что лишнее усложнение реализации...
  55.  
  56. ========================================================================================================================
  57. Зачем тебе DefaultFail категория с тестом? :)
  58. Ты конечно шаришь :) Я знаю для чего нужен этот трюк, но хочется услышать от тебя обьяснение :)
  59. Я просто не знаю, вы с Юлей говорили об этом уже или нет...
  60.  
  61. >>>>>>>> говорили, не то чтоб ей очень эта идея понравилась, но и настаивать на полном её удалении не стала)
  62.  
  63. моя идея в том, чтоб сделать пустышку с юзер-френдли сообщением, которая будет сообщать в случае неверной
  64. конфигурации, что произошло не так (в частности не существует выбранного тест класса, или в имени очепятка)
  65. и сразу падать, чтоб если вдруг мы чет пушнули, хотим на дженкинсе проверить, и ждем пока пробегут все тесты
  66. в проекте, потому что пропустили букву в имени тест класса)
  67.  
  68. а так сразу все упало и сказало тебе, что мол ты дружище что то напортачил, проверь конфигурации)
  69.  
  70.  
  71.  
  72. >>>>> хм... совсем не то для чего бы я это использовал (как то напомни мне, я тебе позже обьясню зачем это может еще понадобится)... то для чего ты это используешь реально выглядит извращением и абсолютно не KISS:) я пока не понял почему это оно сразу не завалится иза очепятки... у тебя реально были такие случаи?
  73.  
  74. >>>>>>> ну если ты передашь параметр профиля мавена с очепяткой, то он вроде заранит первый (верхний) профайл, у
  75. меня сейчас в рабочем так и сделано, верхний профайл - заглушка, которая кидает понятное сообщение об
  76. ошибке)
  77.  
  78. если бы ты передавал например параметр -Dtest то он вроде по умолчанию заранит вообще все тесты в проекте)
  79.  
  80. >>>>> ну вот для меня при очепятке заранить все тесты это довольно норм :) я бы не костылил в твоем случае... для меня это уже заддротство :) но ты сам делай как хочешь... твое дело :)
  81.  
  82. а ты зачем использовал, для мониторинга покрытия? :)
  83.  
  84. >>>>> я бы использовал похожий подход с той целью что бы в сьюте buggy всегда бил один тест который падает. Ибо идея сьюта багги в том, что бы на него завязать джобу в дженкинсе которая всегда будет падать со всеми тестами... и если все тесты падают - тогда имейл не приходит команде - сигнализируя о том что все хорошо. В этом случае "все хорошо" - значит что все тесты падают как и ожидается - на них есть ишью в джире - и мы просто еще не планировали их фиксить... а если вдруг какой то тест начинает проходить - значит это сигнал - что что то поменялось и и должен прийте имейл - что мы обратили внимание, разобрались что по чем - может баг чудесным образом какой то сам пофиксился - и стоит его перепроверить и из джири удалить, убрать анотацию @buggy и успокоится. При такой схеме, когда все баги будут по фикшены - то эта джоба начнет "проходить а не падать" - и вся настройка по имейл нофификации поламается :) И типа что бы этого не было - нужно что бы в сьюте оставался всегда один тест который падает.
  85. ========================================================================================================================
  86. >>>>>> чувак, ты не понял. Фича items left - это не фича сама по себе. Это технически 7 или сколько там подфич фич действий. Раставлять проверки каунтера - это не рандомно раставлять - а там где нужно.
  87. Проверка каунтера - это часть проверки действия. В гугл шите эти "подфичи" были отдельно только потому что будучи подфичами - они меньшего приоритета... и поэтому можно было не спешить их раставлять в тестах. А когда мы уже перешли к "полному покрытию" - мы их "не рандомно раставили" - а дописали туда где им и место.
  88.  
  89. У меня мозг плывет от твоего "тулить абы тулить". Ты что реально не понимаешь что проверить каунтер для ед таскас, это то же что проверить что задача добавилась?
  90. тольк типа "еще одна дополнительная проверка меньшего приоритета". Еще раз - каунтер - это не отдельная фича - это комплекс отедльных подфич которые являются частями фич действий. И поэтому абсолютно логично их проверять там же где и проверяются эти "основные" фичи. есть такое понятие как cohesion в программировании.
  91.  
  92. Которое говорит о том - что связанные вещи должны быть вместе. В контексте системного тестирования поведение каунтера под действие связано с действием. Поэтому это прямой идентификатор "должно быть вместе", и "тулить где попало" - это тут совсем не причем. наоборот - тулить туда где ему и место и по логике поведения пользователя, и по внутренней реализации.
  93.  
  94. Если бы мы писали юнит тесты - там все дробиться как можно меньше.. И там были бы отдельные тесты на добавление задачи в список, и отдельное на каунтер... При этом каунтер бы проверялся даже не через дейсвие, а через искуственно созданный ивент, или еще чего там такого... там бы пришлось симулировать эффекти добавления, реально его не делая... потому что такая уж философия у юнит тестов - вс тестировать раздельно всегда... Но системные тесты - на то и системные что бы тестировать "как оно работает" вместе, особенно учитывая то что каунтер - это часть действия а не отдельная от него вещь.
  95.  
  96.  
  97. >>>>>>>> ок, допустим проверку каунтера можно связать с действиями с тасками, которые могут на этот каунтер
  98. повлиять,
  99. >>> не допустим :) оно так и есть:) это не отдельная фича :) не веришь - залезь в код и посмотри :)
  100.  
  101. но я все еще не понимаю, зачем делать exhaustive testing ?
  102.  
  103. >>>> вся наша домашка full coverage - высосана из пальца. это же тестовое приложение... на котором мы стараемся просто сэмулировать разные ситуации на проектах. Допустим у нас ситуация - что было много багов с этими каентарами... и нам таки нужно это экзостив тестинг... вот мы его и делаем :) Ты уж извини что не во всех описаниях заданий прописаны все такие нюансы :) Жизнь сложна... У меня на все времени не хватает.
  104. Да и курс этот уже закрыт. Скоро доделаю новый. Там скорее всего будут слегка другие домашки.
  105.  
  106. все действия, которые связаны напряму с каунтером (добавить, удалить, комплит, и т.п.) протестированы
  107. в существующих фича тестах на всех фильтрах.
  108.  
  109. действия, которые не должны его никак менять, протестированы на 1-3 фильтрах (надо смотреть в таблицу)
  110.  
  111. ты предлагаешь добавить проверку каунтера во все тесты, таким образом перепроверив его везде где можно,
  112. но сделав все фича тесты зависимыми от одной функции?
  113.  
  114. >>>>>> что значит зависимыми от одной функции? Во первых не обманывай себя. Да мы стараемся писать "фиче тесты" атомарными - но это все равно не юнит тесты. Они все равно "интеграционные", и все равно тестируют несколько вещей сразу... Во вторых неправильно говорить "зависимыми от одной функции". Функции написаны один раз и работают. Ты же не удивляешься что у тебя много тесто завист от "одного конструктора пейджи" (который тоже есть "одной функцией"). Это не функции могут поламаться а фичи. А я тебе выше уже писал что нет фичи каунтера - есть 7 или сколько там разных фич (реально подфич соответствующих действий над задачами). Поэтому тесты не зависит от одной фичи - как раз каждый зависит от одной подфичи - ее и тестирует. И если поламается - то один тест а не все сразу. Есть правда еще зависимость от локатора. Но это нормально. Точно так же как все тесты зависят от одного урла страници - который тоже может поменятся. Это интеграционные тесты - мы полюбому в них зависим. Их нельзя сделать идеальными "юнит тестами". Мы просто можем уменьшить эти зависимости где риски велики. В этом случае он не велик. Все все равно "не проконтролируешь". Более важно сейчас (где под сейчас имеется ввиду ситуация когда типа как нам важно покрыть все эти подфичи потому что они типа как часто ломаются) покрыть все эти разные (а не одна) подфичи...
  115.  
  116. фича каунтера представляется мне как функция, которая рендерит кусок Html вместо текущего, значит она
  117. может быть одна, что то типа changeItemsLeft(i), которую нужно вызывать в специфических действиях, связанных
  118. с кол-м активных тасок. и если в этой функции конкретно что то пойдет не так, то все тесты сломаются....
  119.  
  120. то что ты там себе представляешь не соответствует действительности. Залезь в код и посмотри;)
  121.  
  122. ты считаешь что профит от такой проверки стоит риска?
  123.  
  124. я считаю что риска нет) Риск точно такой как риск от того что урл может поменятся... Ну ок, слегка больше, но все равно, он намного меньше чем то что реально мы пропустим баги по этому каунтеру для разных ситуаций с действиями... Потому что еще раз - каунтер - это 7 разных каунтеров по сути для каждого действия.
  125. ========================================================================================================================
  126. мне кстати не совсем нравиться твоя идея называть "пакет куда ты складываешь полезняшки" как api...
  127. оно просто конфузит слегка... к чему АПИ? :)
  128.  
  129. причем иногда ты называешь так часть которая относится к тест модели - здесь апи как раз подходит...
  130. а иногда часть которая как раз "полезняшки" - типа кастомкондишенов и так дале...
  131.  
  132. ну такое... не уверен знаю ли я лучшее имя... мы обычно называем как core полезняшки
  133. еще есть практика называть common
  134.  
  135. а тестовую модель я называю model... но в этом случае и api подойдет...
  136.  
  137. >>>>>>>> мне просто нравится как это звучит, и пишется :)
  138.  
  139. можно core назвать, возможно оно лучше подходит под описание...
  140. common не нравится, получается что у меня тогда будет верхний коммон, и коммон todomvc, и коммон gmail...
  141. так себе)
  142.  
  143. >>>>>>> так в том то и фишка, что не будет... в тех слоях что вертикальные - вверху будет common (или core) а внутри (для todomvc) будет model ну или api - тут как раз оно подходит....
  144. а в паралельных слоях если будет одинаково - то тоже ок, оно ведь там будет только потому что ты в один проект все налепил... в реальных случаях оно бы в разных проектах было бы скорее всего... да и вообще - для паралельных слоев - оно норм если бы одинаково называлось... пейджобджектс же также и там и там есть...
  145.  
  146. а по поводу model я не совсем понял, поясни пожалуйста)
  147.  
  148. >>>>>>>> ну то что у тебя api для todomvc - это по сути "вход в модель тестового приложения...." поэтому я бы так его и назвал... с другой стороны пейджобджекты тоже часть модели приложения... поэтому я иногда делаю такую структуру:
  149. model/pageobjects/..
  150. model/Application.java
  151.  
  152.  
  153. >>>>>>>>>> у тебя есть скриншотик с "красивым" по твоему устройством проекта? я не совсем понял как выглядит сорс
  154. мавен-проекта, в котором есть несколько тестовых проектов (как у меня todomvc and google)
  155.  
  156. >>>>> не знаю есть ли но вот например:
  157. common < это коммон для всех
  158. gmail/commmon < а это коммон именно для жмейла
  159. gmail/model
  160. gmail/model/pageobjects
  161. gmail/model/Application.java
  162. todomvc/сommon < а это именно для тудуемвиси
  163. todomvc/...
  164.  
  165. ну и такое это все... сдесь можно играться с именами... просто api - вместо коммон - это будет конфузить людей :)
  166. ========================================================================================================================
  167. >>>> твой аргумент с анимацие верный. Именно для таких случаев и с такой логикой - и стоит использовать точечные таймауты. Все верно. Но... С жмейлом другая ситуация. Анимация - это конкретный детерминированный случай. Лучше такие сразу "точечно определять и в тестах". Но жмейл - не детерминированный - он реально тормоз. Причем часто и много где. Поэтому с точки зрения эффективности - именно для этого приложения - ты сэкономишь больше времени как раз не на том что падающие тесты будут меньше времени занимать. А на том что не будешь в начале автматизации - заморачиваться с этими точечными вейтами... Потом, позже... У тебя появится какая то статистика, и ты действительно сможешь определить "стабильные тормоза" типа из твоего примера с анимацией. И тогда уже их раставить. Это именно то что я тебе сразу хотел обьяснить.
  168.  
  169. >>>>>>>> я согласен что этот лоадинг недетерминированный, и ставить на него отдельный вейт - значит иметь много
  170. проблем при проблемах с интернетом (хотя это проблема окружения, как по мне, а не тестов).
  171.  
  172. я честно говоря просто видел единственный такой тормоз - этот лоадинг - поэтому так его и выделил,
  173. как ты называешь "стабильным тормозом", остальное у меня все с таймаутом в 4-5сек нормально бежало...
  174.  
  175. >>>> ну раз так то и славно... главное что бы ты понимал этот прикол "с недетерминированостью"
  176.  
  177. по итогу - я согласен что ставить совсем уж хардкодный вейт в случае недетерминированного времени
  178. ожидания идея так себе, но увеличивать общий таймаут мне все еще не хочется (т.к. у меня остальное быстро
  179. грузится :) )...
  180.  
  181. можно сделать переменную Configuration.long_timeout = Configuration.timeout * 3;
  182.  
  183. >>>>> можно именовать да, но не так как ты сделал... потому что идея Configuration.timeout в том что его могут изменять где то... как угодно... поэтому я бы лучше создал метод long_timeout() а не переменную...
  184.  
  185. или что то в этом духе....тогда тесты будут ждать дольше необходимого в случае фейла только на этих вот
  186. "анимациях" или "тормрзах", что менее критично, чем если бы это были все тесты вообще...что думаешь?
  187.  
  188. >>>> да не нравится с умножением, заверни во что то - но заверни в метод а не переменную...
  189. ========================================================================================================================
  190.  
  191. public static Emails all() {
  192. return new Emails(
  193. $$(".Cp tr") // вот этот локатор дублируется, возможно стоит его таки "заDRYить" вынеся его в стическую переменную
  194.  
  195. >>>>>>>> возможно, но он используется почти в одном месте (3 метода рядышком), и я такой типа CopyAndReplace рулит,
  196. Яков на своих видосах говорил, зачем создавать поле если можно и так без проблем поменять локатор когда придется :)
  197. мне не мозолит, но могу вынести, если критично :)
  198.  
  199. >>>> ну... для меня это таки уже не "рядышком" :) ну такое... все субьективно конечно... просто этот локатор сам по себе - не читабельный... я бы его вынес в переменную просто с целью дать ему красивое имя :)
  200.  
  201. ну такое... может сдесь это и не сильно актуально, смотри сам...
  202.  
  203.  
  204. @Step
  205. public Emails emails() {
  206. return Emails.all();
  207. }
  208.  
  209. @Step
  210. public Emails unreadedEmails() {
  211. return Emails.unreaded();
  212. }
  213.  
  214. @Step
  215. public Emails readedEmails() {
  216. return Emails.readed();
  217. }
  218.  
  219. все ок, но просто как идея еще одного варианта апи:
  220.  
  221. просто
  222.  
  223. @Step
  224. public Emails emails() {
  225. return new Emails();
  226. }
  227.  
  228. но потом можно:
  229.  
  230. emails().unreaded()
  231. emails().readed()
  232.  
  233. ну эт такое... я еще сам не уверен что так было бы лучше.... нужно пробовать...
  234.  
  235.  
  236. >>>>>>>> немножк переписал, вроде бы погибче стало...поля стало 2 вместо одного, зато читать проще :)
  237. ========================================================================================================================
  238. public class LoginPage {
  239.  
  240. @Step
  241. public void ensureLoggedAs(String email, String password) {
  242. $("#Email").setValue(email).pressEnter();
  243. $("#Passwd").setValue(password).pressEnter();
  244. $(".cmsg").waitUntil(hidden, 15_000);
  245. }
  246.  
  247. }
  248.  
  249. поднимая снова тему о "эншурности"
  250.  
  251. я бы тут убрал еншуре вместе с вейтом...
  252.  
  253. а еншуре версию метода встроил бы таки в Application
  254.  
  255. и там бы и добавил еще и проверку не залогинены ли мы уже, ведь если да, то незачем и логин делать еще раз...
  256.  
  257. у тебя кстати этой проверку тут и нет:
  258.  
  259. public void ensureLoggedAs(String email, String password) {
  260. new LoginPage().ensureLoggedAs(email, password);
  261. }
  262.  
  263.  
  264. а это уже не сильно хорошо... потому что он на то и еншуре - что должен все быть "приводить к цели как можно более эффективно..."
  265.  
  266.  
  267. >>>>>>>> согласен про еншурность, добавил проверку, пока хватило ума только на урл, без более широкого контекста
  268. чет не могу сообразить, какой урл в браузере можеть быть в этот момент...
  269.  
  270. поэтому я в тесте открываю open("/"), если есть mail.google.com - значит я где то уже залогинен, и
  271. перехожу просто в inbox, если нет в урле этого, то начинаю тайпать логин и пароль, в надежде что я
  272. на accounts.google :)
  273.  
  274. >>>> ну урла мало таки... нужно же заеншурить не только то что кто то залогинен - а что залогинен тот кто указан в параметрах... поэтому если залогинен не тот, нужно еще сначала и вылогиниться... :)
  275.  
  276. конечно на реальному проекте, желательно попросить программистов что бы для тестовой сборки предоставили API
  277. например просто по гет запросу по какому то урлу - оно автоматически тебя логинит куда надо...
  278. тогда вообще еншуер такой умный будет не нужен...
  279. ну... все равно нужен будет - если уже там где нужно мы - то даже по урлу можно не переходить... не тратить время... если оно грузиться долго..
  280. а если грузится быстро - можно для начала не парится - а просто по урлу такому модному переходить и все...
  281.  
  282. а потом еще если припечет дописать таки оптимизацию... что если мы уже залогинены этим юзером - то и незачем переходить по урлу...
  283. ========================================================================================================================
Advertisement
Add Comment
Please, Sign In to add comment