0: Меня зовут Женя, я работаю в яндексе несколько лет и большую часть времени занимался разработкой инструментов интеграционного тестирования. Вот например есть мокка, есть jest да, это инструмент.
1: Менты юни тестирования, чтобы запускать юниттесты. Вот мы разрабатывали инструмент для интеграционного тестирования. О чем будем сегодня разговаривать. Во первых, поймём, что такое интегра.
2: Тесты. Зачем они нужны? Чем отличаются от модульных Тестов? Нужны ли вообще? Может быть нужны только интеграционные тесты, а модульные не нужны. В общем, ответим на эти вопросы. Затем во 2 части лекции.
3: Затронем вопрос автоматизации, тестирования. Посмотрим, какие есть инструменты для автоматизации действий в браузерах и какие есть инструменты для этого, для запуска этих Тестов.
4: Итак, все, сейчас попили воды, ушли на перерыв 5 минут и, конечно же, про все забыли. Уже никто не помнит, да, что такое модульные тесты. Хотя Дима посвятил этому примерно 2 часа своей жизни вам отдал как бы всего
5: Себя. Итак, модульные тесты. У меня будет определение такое же, но там чуть другая формулировка модульные тесты или модульное тестирование. Это тестирование 1 компонента системы в окружении, изолированном от других компо.
6: Системы. Давайте разбираться и вспомним на абстрактном проекте, что же это сейчас значило? Представим себе абстрактный проект. Он состоит, как правило, из фронтенда, если
7: Веб приложение. Если это мобильное приложение, то ещё это называют вью, есть backend, если это опять же веб приложение, кто-то называет это контроллеры, модули, ядро, бизнес.
8: Логика. В общем, это не важно. Мы будем называть это бэкендом, потому что нам это ближе. Также у нашего проекта есть какие-то сторонние компоненты, например, база данных, там эскьюэль.
9: Clickhouse также может быть платёжная система, там какой-нибудь paypal настроен, наш фронтенд состоит из множества компонентов, точно также и бэкенд на фронтенде это то.
10: С чем пользователь взаимодействует, кликает там это инпуты, там кнопочки, формочки, формочки в формочках на бэкенде. Мы обрабатываем все, что у нас накликал пользователь, и что-то с этим делаем.
11: Наш абстрактный проект на что похож?
12: У всех, кто есть в зале, есть шанс поднять руку, сказать, на что он похож.
13: Там есть платёжная система база.
14: Ну, например, на интернет-магазин можно как-то притянуть за уши. Ну, попробовать хотя бы или нельзя. Можно, да, давайте представим, что это какой-то интернет-магазин, вспоминая, что у нас такое модульный тест, это тестировании.
15: Компонента в окружении, изолированном от других компонент. Давайте попробуем понять, как же нам написать юниттест на вот этот компонент бэкенда. Представим себе, что этот компонент
16: Используют обращение к платёжной системе. То есть это какая-то обёртка, которая вызывает платёжную систему и платит за какие-то товары со стороны фронтенда к ней, ну,
17: Приложении прилетают данные, эти данные, она как-то обрабатывает и вызывает платёжную систему. Что нам нужно сделать, чтобы вот этот вот тестовый сценарий, который я описал, стал юнит тестом, нам необходимо
18: Не вызывать реальную платёжную систему, потому что мы иначе будем тратить деньги. Мы должны использовать, что
19: Да, мы должны использовать моки стабы. Все, чему нас Дима только что научил, точно также с фронтенда. Мы используем нереальные данные с фронтенда. Мы сами в тесте определяем, какие входные данные получает наш компонент.
20: Все так. Мы написали модульный тест на то есть мы разобрали какой-то тестовый сценарий и можем сказать что это unit test окей, что же такое интеграционные тесты даём общее определение как по всем книжкам.
21: Интеграционное тестирование это тестирование взаимодействия 2 или более компонентов системы. Все не очень понятно, да, поэтому хочется это определение чуть чуть расширить, чтобы
22: Стало понятнее. И плюс оно будет очень хорошо подходить для тестирования интерфейсов, то есть для интеграционного тестирования web интерфейсов, веб приложений, то есть интеграционное тестирование.
23: Это тестирование все тех же, все тоже взаимодействие 2 или более компонентов системы, но в окружении практически таком же, в котором оказывается реальный пользователь. Давайте разбираться.
24: Тест, он у нас там есть, никуда не делся. Сейчас будем параллельно с ним придумывать какой-то тестовый сценарий, который можем назвать интеграционным. У нас притянутый за уши интернет-магазин. Мы об этом помним.
25: Давайте подумаем, что за сценарий можно тут накрутить. Ну, например, зайти на страницу, накликать товаров и отобразить эти товары в корзине, тестовый сценарий. Что сделать, чтобы
26: Этот тестовый сценарий стал интеграционным, нам необходимо на стороне фронтенда уже какое-то, какое-то реальное окружение для пользователя. Какое для пользователя реальное окружение, да.
27: Браузер, то есть фактически браузер, который пользователь видит на стороне браузера. Мы хотим как бы накликать реально накликать каких-то товаров, отправить их в backend, backend, как-то повзаимодей.
28: С базой или не с базой. Это чуть позже. Сейчас с каким-то хранилищем и отдаст ответ фронтенду скажет все. Я записал знания о том, что эти элементы в корзине. Можешь пользователю их отображать и
29: Content отобразил красивенько нашу корзину, то есть интеграционный тест выглядит примерно так. То есть мы поднимаем окружение, которое очень похоже, но не полностью воспроизводит. Это важно, что не полностью
30: Окружение, в котором оказывается реальный пользователь, почему не полностью воспроизводит? Потому что я сейчас ничего не сказал о записи в базу. Этот сценарий может считаться интеграционным, даже если мы базу
31: Заставаем, допустим, заставаем её следующим образом. Будем писать не в реальную там монгу, а напишем какой-то мог, который будет на файловой системе все это оперировать, то есть записывать или чуть ли не в память себе записывать данные о том, что клиент
32: Там отправил какие-то, какую-то информацию, то есть мы не используем здесь реальную базу данных, но тестовый сценарий считается интеграционным. Почему мы тестируем сразу несколько компонентов и мы поднимаем уже окружение похожее
33: В котором оказывается пользователь есть ещё 3 вид Тестов. На самом деле, как и Дима говорил, их там можно больше выделить, но в нашем понимании есть вот 3 основных юни теста интеграцион.
34: На e2e, а все остальное на самом деле можно примерно от них придумать. То есть это их ветвление. Что такое ету, тест нтн, тестирование это все тоже тестирование взаимодействия 2 или более компонентов, но.
35: В окружении, которое, насколько это возможно, максимально повторяет то, в котором оказывается пользователь. Иными словами, мы тут стараемся ничего не ставать.
36: Понятно, да, тут стоит отметить, что любой себя уважающий т тест может смело называться интеграционным, потому что в принципе он не противоречит определению интеграционного теста, но не каждый интеграционный тест.
37: Может называться ету сейчас на примере. Итак, у нас есть юнитест интеграционный тест. Опять же, есть тестовый сценарий отображения корзины пользователя. То есть нужно прийти на страницу, накликать и это
38: Корзину. Как может выглядеть ету тест? Вот так мы не стабам базу. У нас есть реальная база, да, это не продакшн база, это её реплика, но полностью она повторяет её архитектуру. Эта база поднимается по запросу для этого теста.
39: По запросу также поднимается реальный браузер, там что-то кликается, эти данные отправляются в backend, backend их обрабатывает, записывает в базу. База, говорит, да, я все записала, бэкэнд это понимает, отправляет данные обратно фронтенду фронтенд говорит, во
40: Смотрите, твоя корзина это e2e тест.
41: Вопрос на засыпку, если мы теперь разобрались, вот это какой тест?
42: Стесняемся, ладно?
43: Вот это хорошее замечание. Правильно? Смотрите, неправильно. Я сейчас поясню. Смотрите, с точки зрения сухого определения интеграционных Тестов, которые про в начале, не опираясь на окружение, это всегда интеграционный тест, но надо
44: Всегда руководствоваться также здравым смыслом. Вот эти 2 модуля. На самом деле, на самом деле все уже зависит не от абстрактного проекта, а от конкретного случая. Например, эти 2 модуля
45: С точки зрения там уровня абстракции архитектуры проекта реализовывают и описывают 1 сущность. Ну, например, у вас есть родительский класс и дочерний родительский класс фактически нигде не используется, он используется только в дочер.
46: А ваша программа и код использует только дочерний класс. Это же странно писать, хотя кто-то пытается тесты юнитесты на родительский класс. Правильным подходом было бы писать юнитесты только на доче.
47: Которые реально в вашей программе используются, как бы этот компонент у этого компонента пользователь, ваша программа, ваши сторонние компоненты.
48: Поэтому здесь, опять же, повторюсь, нужно руководствоваться здравым смыслом и все зависит от ситуации. То есть это может быть такая схема как интеграционным тестом, так и юнит тестом. Но в нашем случае, как правило, это все-таки, да, как и
49: Прошлой лекции говорилось это будет unit, тестирование, а такой тест.
50: Тут смотрите, зависит от окружения. Смотри, если вы поднимете реальный браузер и начнёте там что-то делать, прям реальный браузер. Будете потреблять ресурс этого браузера, то это уже интеграционный тест. Но если вы что-то на фронте
51: Где вот как вы в конце лекции там отображали рендерили страницу, кликали что-то делали, то есть имитировали и несколько компонентов затрагивали то это не интеграционный тест это unit test.
52: 3 вопрос на засыпку а это какой тест?
53: Это тоже все зависит от ситуации. Этот пример я показал, для чего. Для следующего часто люди путают немножко определение. Здесь юнитест, это ж модульные тесты.
54: А когда мы джаваскрипт пишем, мы как бы намекаем себе да, модуль точка экспорт, слово модуль, да, и это вводит людей в заблуждение, что модуль это или компонент, это 1 файл, нет.
55: Тогда, может быть какой-то компонент реализован в нескольких файлах в зависимости от того, что так требует архитектура, так требует качество кода, чтобы код хорошо читался, так требует, так требуется для того, чтобы код можно было реиспользовать. То есть
56: Тут хотелось отметить, что 1 файл это не есть компонент или модуль. Мы можем писать юнитесты сразу на несколько файлов, представляя, что это 1 сущность.
57: Зачем нам столько видов тестирования? Да, мы сейчас назвали 3. Кто-то почитает какую-то литературу, скажет, там ещё есть 15 их штук. Давайте остановимся на 3 по хорошему. 1 лучше, чем 3, потому что юни тесты это
58: Писать код, интеграционный тест. Это надо написать код, тест. Надо написать код. А лучший код это ненаписанный код, да, казалось бы. Блин, давайте не будем их писать, хоть хотя бы какой-то вид тестирования. Забегая вперёд, скажу, что
59: У вас так не получится кратко. Почему? Потому что каждый вид тестирования решает конкретную задачу. Он обладает теми преимуществами, которые другие, которыми другой вид тестирования не обладает и
60: Также обладает недостатками, которые покрываются другими видами тестирования. Давайте разбираться.
61: Отрицательные стороны модульных Тестов. Самое главное это то, что они не тестируют связи между компонентами, о чем речь слева. Это её тест мы уже знаем, который можем назвать интеграционным. Справа юнит тест.
62: Вспоминаем, что мы в юниттесте не использовали реальную платёжную систему, не использовали реальные данные с фронтенда, и как бы мы по определению не тестировали связи между компонентами, то есть связи между компонентами не
63: Проверяются. Я сейчас могу много теорий рассказать, но все описывает. Самое главное. Вот эта картинка. У нас есть система. Дверь и замок. Замок должен закрывать дверь. Он началось, да вот замок закрывает дверь, не закрывает замок.
64: Дверь юнит тесты прошли, замок закрылся, но основная суть системы, чтобы дверь нельзя было открыть. Хотя замок вы закрыли. Не тестируем связь между компонентами. 2 недостаток.
65: Очень сложно тестировать ui вот вы на прошлой лекции попытались отрендерить страницу и даже вопросы были а что там со скриншотами вам сказал лектор так стили.
66: Нет, у вас просто оно как в отображено, как в доме есть, так, так вот это вы можете проверить, а как оно на самом деле выглядит, как оно выглядит на самом деле, это вот юниттестами. Если не практически невозможно, то сложно проверить. То есть визуаль.
67: Визуальная составляющая вашей страницы 3 одновременно недостаток и преимущество юниттестов. Они заставляют вас писать дополнительный код преимущества. Почему заставляют писать дополнительный код? Вы
68: Может быть, уже сталкивались, но ещё столкнётесь. Если писали много юнит Тестов, вам повезло, то столкнулись по любому, начали писать код, написали, все хорошо, все работает. Надо протестировать. Пишите юнит тесты и понимаете, что код ваш
69: Не тестируемый. С какой точки зрения вы начинаете писать юнитесты, а они там корявые. То есть они не такие, как как вас Дима учил на прошлой лекции, то есть их тяжело поддерживать, они громоздкие, там какая-то логика выполняется, вы начинаете смотреть и
70: Понимаете, что всего этого можно избежать. Если ваш код порефакторить продакшн код, вы начинаете это рефакторить, и такие можно потестировать уже хотя бы как-то удобненько. И тестики такие аккуратненькие получаются. Это хорошая сторона, но также
71: В лекции прошлой вы убедились необходимо иногда подхачивать код специально для того, чтобы протестировать его unit тестами этот код в production вообще не нужен, но вам нужно это подхачить то есть что-то внести в
72: Вашу, ваш код, чтобы можно было протестировать с интеграционными тестами. Здесь проще. Мы 1 раз настраиваем, настраиваем инфраструктуру там, что значит инфраструктура, это там пишем конфиг там
73: Включаем нужные пакетики, все готово. Запускаем с юни тестами. Это не так. Вы в зависимости от кода начинаете ваш код подстраивать под юни тестирование.
74: Вот эти все недостатки, которые я озвучил, то есть не тестирование связи между компонентами, сложность тестирования юай, то, что нужно левый код какой-то писать, все это недостатки юниттестов, которых лишены интеграционные тесты.
75: Интеграционный тест, допустим, если рассматривать не тестирование связи между компонентами, как как поезд пройдётся по вашему приложению, скажет, все работает или ничего не работает и кажется, может можно
76: Отказаться от юнит Тестов нет, потому что есть же и отрицательные стороны интеграционного тестирования, и когда я говорю отрицательные стороны интеграционного тестирования, я здесь подразумеваю и e2e тестирование, потому что это как надкласс.
77: Интеграционных Тестов и все недостатки, которые сейчас я озвучу, они только усугубляются.
78: Итак эти тесты очень медленные для сравнения парень это интеграционный тест а девушка это unit test почему из определения у нас?
79: Окружение приближённо или фактически такое же, насколько это возможно в случае теста к тому, в котором оказывается реальный пользователь, реальный пользователь, оказывается в настоящем браузере. Настоящий браузер надо открыть.
80: Вы когда кликаете в браузер, он так делает прыг, прыг и открывается. Это занимает там сотни, миллисекунд за сотни миллисекунд можно прогнать 1000 юниттестов, например. Ну, смотря каких, но точно не 1.
81: Точно также там со стороны, если вы, допустим, базу данных поднимаете какую-то фейковую, то она тоже какая бы быстрая не была, это тоже десятки, сотни миллисекунд. А юниттестам это не надо. Они в изолированном окружении протестировались и сразу дали
82: Вам какой-то фидбэк. 2 недостаток это то, что юнит тесты стабильные, в отличие от интеграционных Тестов. Что это значит? Это значит, что опять же, из определения и, ну они не
83: Стабильный из определения, потому что окружение, то, в котором оказывается пользователь. Попробуйте у себя на компьютере 100 раз открыть и закрыть браузер где-то на 57. По статистике он говорит, я не могу открыться. Отправьте отчёт разработчикам, ну,
84: Что-то типа такого. Это говорит о том, что у вас интеграционный тест может упасть не потому что
85: У вас с кодом что-то не так, а потому что инфраструктура такая нижележащая инфраструктура, на которую вы опираетесь, может дать сбой, может там ресурсов не хватить. Допустим вы пытаетесь поднять браузер реальный, а забили процесс какими-то другими программами.
86: И пытаетесь открыть. А вам, говорит браузер, недостаточно оперативы. Все, тест упал, как бы сам сценарий с юнитест. Такого нет, если у вас юниттесты выдают.
87: Разные результаты это плохо написанные юнит тесты. А если интеграционный тест упадёт, то не факт, что он плохо написан. Но об этом мы сейчас чуть позже поговорим. 3 ошиб, 3 ошибка. 3 3 проблема интеграционная.
88: Тесты не говорят конкретно, где ошибка, когда вы запускаете юнит тест. Если вы нормально его назвали, проименовали, он вам чуть ли не строчку кода скажет, где, где, что не так сломалось, как будет с интеграционным тестом вы
89: Напишите код, запустите интеграционный тест, например, про отображение корзины, да, и у вас на выход будет примерно такой ответ. Корзина не отобразилась или в корзине не те элементы?
90: Который вы должны быть, и вы будете сидеть и вот так вот вот типа, а что делать с этим? Почему опять же, из определения компонентов несколько у нас количество компонентов, которые мы затрагиваем
91: Может быть, не 1, не 2 много. И вы не знаете, где конкретно че сломалось и нужно идти и разбираться. То ли это на фронтенде где-то что то продолбали, то ли бэкэнд как-то не обработал. Может быть что-то с базой, может архитектура не такая, что-то не так не учли.
92: Ну а юнитест конкретно говорит, вот вот здесь все я сделал, все чини, исходя из этого картинка, которую я украл у 1 из авторов.
93: Книжки по тестам, по моему. Ну как бы не конкретно у него там она в каком тёте была? Пирамида, есть масло у человеческих потребностей есть пирамида Тестов, которая гласит
94: Что чем дешевле тест, а дешёвый тест это быстрый, стабильный. Сразу говорит, где ошибка, тем больше этих Тестов должно быть чем дороже тест, тем меньше этих Тестов должно быть. Соответственно, интеграционных Тестов должно быть меньше, чем модульных.
95: Ещё меньше, потому что проблемы их только увеличиваются. Ну, примерно понятно, да. А вот нифига есть. Короче, недавно нашёл ещё 1 картинку, которая говорит абсолютно примерно об обратном там
96: Следующая мысль, что чем сложнее ваш проект, тем вы больше будете хотеть написать интеграционных Тестов, и они будут вам давать большую уверенность в том, что ваш проект работает правильно вам будет.
97: Вы будете реально там избавляться от времени, которое вы тратите на ручное тестирование. То есть там говорится следующее, что да, юнит тесты сильно дешевле, но на длинной дистанции вот эта вот цена за
98: Описание многих интеграционных Тестов покрывается тем, что вы реально ловите баги, которые, с которыми сталкивается пользователь, или не пропускаете их в production здесь говорится о том, что юниттестов должно быть меньше, чем интеграционных, но интеграционных меньше.
99: Чем, но интеграционных больше, чем те Тестов, как бы такая схема, что я хотел сказать вот этими 2 схемами, которые фактически полностью противоречат друг другу, тем, что как бы подход
100: Много. И каждый из них правильный, если он оправдывает средства. То есть если как-то победителя не судят, если ваш проект, если вы выбрали какую-то стратегию, ваш проект без багов, вы постоянно в него вносите, фичи.
101: И boogie новые не появляются, и вы работаете там по этой схеме предыдущей, то отлично. Вы молодец. То есть что выбирать, решать вам. Да, я шучу не вам, вашему руководителю. А вот когда вы станете руководителем, тогда вам.
102: На этом заканчиваем 1 часть теоретическую. Дальше будет самое интересное. Впереди. Сейчас было скучно. Будем говорить про автоматизацию тестирования, если вы
103: Ещё не уверены, что тесты все надо автоматизировать, то вам не в эту аудиторию, вам в следующую. Ну, не в эту точно.
104: Просто приведу пример. Представим, что у вас есть маленький проект и 20 тестовых сценариев, казалось бы, 20 тестовых сценариев это немного, но если вы хотите их качественно протестировать, ну то есть как тестиров,
105: Открыть, не там кликнуть, посмотреть, что действительно все так и должно, как мы хотели то, ну, минуту это займёт. Можно даже тут не спорить вообще даже больше, соответственно.
106: 20 минут. Вам надо, чтобы их протестировать немного. В принципе, можно и не автоматизировать. Зачем париться? Тут приходит менеджер и говорит алярма, все, горим на айосах у нас вообще прило.
107: Жени, оказывается, не открывается, и ты такой, хорошо, я буду тестировать ещё и на айосах. И он говорит, давай ещё андроида потестим. И ещё 3 браузера десктопных, там, chrome, firefox, там, age, вот андроиды какие-нибудь.
108: 5 уже 100 Тестов, 100 Тестов. Это уже около полутора часов. В лучшем случае неприятно. Да, 8 часовой рабочий день, полтора часа тратить на какие-то там тесты, руками делать. Мы ж программисты. А если Тестов станет на 5 больше?
109: Их всего 25. Умножаем на 5. Я уже даже не могу так посчитать, сколько там получается. Ну, что-то около 2 часов, да, как бы 2 часа нужно потратить из 6, из 8 рабочих. Вам надо потратить 2 часа на ручное тестирование. Ну, это ж нонсенс авто.
110: Автоматизировать надо. Давайте попробуем что-то автоматизировать. Оптимистичный слайд трехлетней давности. Типичный тестовый сценарий. У яндекса. Спрашиваем курс доллара к рублю. Курс доллара на данный момент на двена.
111: 15.03.2018 56,84 ₽. Это сценарий тестовый, он может по праву считаться интеграционным и там e2e сценарием, потому что мы поднимаем
112: Реальный браузер мы реально кликаем, реально получаем какой-то результат, то есть в окружении, в котором может оказаться любой пользователь.
113: Чтобы это автоматизировать, нужно использовать специальные инструменты благодаря Такому инструменту, как selenium это инструмент для автоматизации действий в браузере. Такая возможность появилась, как это работает на вашем
114: Компьютере есть несколько браузеров. Все нормальные. Е, да, сейчас age уже, я забыл картинку поменять, там, по моему, другая. Итак, у нас есть набор браузеров, которые у вас стоят на компьютере для
115: Каждого из нормальных браузеров и интернет эксплорера написан, написана определённая программа для хрома. Она называется хром драйвер, для е. Е. Драйвер, а для фаерфокса, как уже все знают, 3 4 не гека драйвер.
116: Не firefox driver хром драйвер e driver гекодрайвер это определённые программы, которые программы, которые можно запустить, они поднимаются на как сервер на определённых портах.
117: Их можно запустить, это программы, которые позволяют автоматически поделать какие-то действия в браузере как аштипи клиент по определённому запросу шлёт боди.
118: Там get, запросы, пост, запросы посылает и говорит, подними мне такой-то браузер хром, там такой-то версии браузер поднимется, отдаст вам идентификатор этого браузера, и вы сможете по этому идентификатору.
119: В браузере что-то поделать, перейти на url, в этом урле перейти на ещё 1 url в этом урле кликнуть в кнопку в общем, все, что нам надо, но чтобы не ходить в 3 разные ручки, как я сейчас показал а на самом деле этих ручек может быть, тысяч.
120: То есть 1000 браузеров у нас 1000 Хромов, например. Может быть такое может быть, у нас такое есть. В яндексе ставится такая прокси, которая, в которую мы посылаем.
121: Вопрос а дальше она сама решает, откуда взять браузер?
122: Хорошая схема, это масштабируемая вот эта схема как бы может быть поднята локально, без регистрации из СМС на вашем локальном компьютере. Мы это сделаем. Ну, вы сделаете позже. Я сделаю сейчас. Эта схема может быть масштабирована на множество раз.
123: Хостов. Представим себе, что у нас есть мощный хост, на котором можно поднять. Вот допустим, что имеется ввиду мощный мы сейчас попробуем 15 Хромов на компьютере поднять, у нас компьютер начнёт тупить, а если какой-то мощный мощное Железко, то там можно поднять параллельно
124: 15 Хромов и запустить параллельно 15 Тестов, потому что ресурсы позволяют. Итак, у нас есть какой-то хост, который отдаёт только хромы, какой-то хост который отдаёт только иехи и какой-то хост который отдаёт там только фаерфоксы с другими браузерами также
125: Там просто инфраструктура поднятия этих браузеров сильно сложнее, мы это пока не затрагиваем, но в домашке это будет. Шучу честно, не будет. Не надо будет вам айосы поднимать, мы сами пока ещё не умеем нормально.
126: Итак, точно также есть селениум, сервер, который является проксей. Мы шлем аштипи клиентам, в него запросы, он нам отдаёт браузеры по отданному айдишнику. Можем в браузерах что-то поделать, но мы
127: Будем сейчас поднимать вот эту схему локально. Как это сделать? Поехали.
128: С 1 пункта установить ждк я специально добавил этот пункт, потому что, судя по прошлым лекциям, у всех возникают сильные вопросы, когда им в логе выдаёт
129: Ошибка, please, install, джидик, и они пишут в чат, а что же делать, у меня не поднимается.
130: Я не привожу, как установить ждк, усложняю задачу, да, можно ввести в поиске этот запрос, но он нужен, нужен как-то раньше. Я даже не знал, что он, честно говоря, нужен, потому что, ну, как есть компьютер, я
131: Сношу там какое-то окружение, делаю чистое, думаю, ну все вроде как по пунктам все работает. А оказывается я когда-то там 3 года назад поставил его себе зачем-то, и он у меня работал. А вот недавно я пролил на ноутбук Колу, теперь у меня дру.
132: Теперь точно с нуля я ставил. Короче, должно работать все, почему я это сказал в конце лекции там будет пункт про это. Итак, ставим команды. Энем н стал селениум, стандалон, минус, минус гло.
133: Че мы сейчас сделали? Мы поставили селениум сервер, это нтм пакет просто, но фактически мы поставили вот это, вот это.
134: Далее мы выполняем команду селениум 100 инстал. Мы ставим наши драйверы. Далее мы выполняем страшную команду установки пакета под названием гермионы, причём с каким-то непонятным
135: При релизом. Тут оговорюсь, что как бы сейчас вот катится 4 версия этого пакета, она ещё в пререлизе. Если вдруг вы начнёте делать домашку и она будет стабильная, то мож.
136: Устанавливать просто стагер. А иначе пока вам приедет 3 версия, там будут обратно несовместимые изменения. У вас там что-то может по лекции не заработать, поэтому пререлиз, что мы сейчас сделали? Мы поставили вот этот такой вот интересный типи клиент.
137: Но не простой http client мы взяли клиент к веб драйверам джаваскриптовый и раннер Тестов на тот момент, когда гермиона реализовывалась очень.
138: Популярные там это лет 5 уже назад наверное и объединили их в runner для интеграционного тестирования называли его гермиона, но это не та гермиона, все совпадения случайны, это они у нас содрали.
139: Да, мы поставили не простой tp клиент, а пакет гермиона, которая называ, ну, является раннером для интеграционных Тестов в отдельной вкладке терминала, это прям даже указано, прям обратите на это внимание, запускаем наш силениум серве.
140: Далее переходим к написанию конфига. В мокке есть конфиг, в джесте есть конфиг. Я не обратил внимание, писали ли вы конфиг? Ну, как правило, в таких юни тестовых утилитах, оно там из коробки практически все работае.
141: У нас тут так не получится. Мы указываем проперти без url. Напоминаю, что мы хотим автоматизировать интеграционный тест, который проверяет, что яндекс по запросу курс
142: Доллара к рублю корректно отрабатывает. То есть мы тестируем яндекс. Фактически грит url это наш поднятый только что селениум, сервер в отдельной вкладке терминала. Далее мы указываем список браузеров.
143: Здесь мы указали хром, это айдишник браузера, это название как будто бы переменной, здесь можно указать все что угодно, но семантически, конечно, нужно указывать то, что мы конкретно поднимаем, а поднимаем мы то, что указали в desire копаит, мы поднимаем браузер хром.
144: Давайте напишем тест он очень похож на любой другой не test видно всем кто-то прищурился нормально точно также есть дискрайб иты дискрайб описывает группу.
145: Тестов на 1 и ту же тематику it это конкретный какой-то тест, что здесь происходит у нас в контексте колбэка есть переменная this браузер это инстанс того самого веб драйвер ио. Клиента вот этот робот, который
146: Со значком этот клиент предоставляет удобное человека, понятное с точки зрения java script апи для взаимодействия с браузером. Давайте смотреть насколько оно понятно. Итак, переход по урлу понятно, да.
147: Мы в элемент, который в фокусе у яндекса главная на главной странице основной инпут в фокусе мы шлем, символы, курс доллара к рублю и нажимаем enter это вот ключевое.
148: Слово enter это он не ведёт энтер, а нажмёт enter далее мы обращаемся к элементу на странице и проверяем, существует ли он или нет, то есть конкретно селектор на странице.
149: И проверяем, что он существует. Если не существует. Конвертор валют не появился. Окей, давайте запустим гермиону. Гермиона запускается у меня здесь на слайдах не видно. Буду тогда тоже посматривать. Запускается.
150: Как и mocha примерно на конкретный файл это все делаю не я. Вот руки это все делается автоматически.
151: Правда, это запись видео, но не знаю, зачем поднял руки. Короче, это делал не я. Это делается автоматически. Когда вы настроите вот эту всю инфраструктуру и запустите гермиону, у вас автоматически будет подниматься хром. Там будут происходить все эти магические действия. Вы видели, что
152: То ввёлся запрос. Конвертор валют действительно появился тест прошёл. Все окей. Давайте запустим ещё раз.
153: Запустим ещё раз обратите внимание, что указываем конкретный файл, но это не обязательно. Гермиона по умолчанию ищет тесты в Папке гермиона. Это можно указывать в конфиге, то есть перенастраивать, но нам пока это не важно.
154: Че то с internet connection, получается моргнула сеть и тест упал, мы столкнулись с той самой проблемой, что интеграционный тест.
155: Могут быть нестабильными и иногда могут падать не потому, что код плохой, потому что где-то инфраструктура лаганула вокруг, то есть моргнул, моргнула сеть. Как решать эту проблему?
156: С помощью ретраев акцентирую внимание на том, что юниттесты не решаются ретраями. Интеграционный тест только решаются ретраями. Если вы решаете юнитест интеграцион, если вы решаете ретрай юнитест, то либо вы написали
157: Неправильный юнитест, либо вы написали интеграционный, но думаете, что это unit ну как бы тут такое 1 из 2 ретраи, что можно и нужно ретраить по пунктам сетевые проблемы, как у нас сейчас случилось.
158: Проблемы с поднятием браузеров это если 100 раз попытаться поднять браузер. Какой раз 57 раз он упадёт, да, известные, редко воспроизводимые баги веб драйверов, веб драйвер это то, что управляет нашим браузером веб драйвер это программа, её написали люди, там тоже могут быть баги.
159: Ну, как бы, мы ж не можем остановить разработку интеграционных Тестов из за багов, да, нужно репортить им и дальше писать тесты. Проблема нижележащей инфраструктуры. Что это имеется ввиду сейчас, пока мы локально все поднимаем, нижележащая инфраструктура это наш компьютер. Если
160: Какие могут быть проблемы? Ну, например, мы его сильно загрузили, как я говорил, и у вас оператива не хватает или начинает проблемы там с нехваткой цпу, и у вас начинает сильно тупить и тест таймаутится. Это тоже проблема нижележащей инфраструктуры открыты.
161: Проблемы инструмента тестирования точно также просто по опыту мы когда разрабатывали гермиону, бывали случаи, когда тесты начали плавать просто потому, что инструмент там начал неправильно себя вести и давать разные результаты. Ну, сейчас такого уже нету.
162: Но такое может быть, если даже там используете не гермиону, опять же это программа, её написали люди, там могут быть проблемы, если вы чётко осознали, что это проблема не вашего кода, а instrumental тестирования, то такое можно ретраить и напоследок, как бы подытоживая все это, что можно.
163: Все, что все проблемы, возникающие из за фазы луны, у нас какой-то момент это стала фраза крылатой. То есть когда вы чётко и точно уверены, это не ваш код, какая-то инфраструктурная вокруг проблема, что
164: Это даёт, это даёт отсутствие ложных срабатываний. Ну то есть вы не отвлекаетесь на ложные срабатывания, то есть вы пишите код, решите, решили что-то потестировать. Бах, он упал, вы начинаете разбираться. Блин, это сейчас с сетью, понятно. А там
165: Может быть ну, что-то, что-то вдруг это я сломал. А вдруг не я сломал? Иногда были случаи, когда люди говорили, это инфраструктура, а в итоге вливали в транк, ну, в основную ветку, и оказывалось, что они сломали код, то есть нужно с этим разбираться.
166: И аретра бы это все съели, и вы бы даже не узнали об этом. Как следствие это даёт ускорение разработки, как и локальной. Вы не тратите время на то, чтобы отвлекаться на тесты, так?
167: И разработки в continuous integration вы уже что-то настраивали в continuous integration.
168: Continuous integration. Это как-то среда непрерывной разработки. Это когда вы например открываете, отправляете квест и автоматически система прогоняет все юни тесты или все интеграционные тесты и в статусах на гитхабе вам выдаёт ответ ок или не ок. Вот если
169: Ретраев нету у вас из 101 интеграционный тест упал, вам система показала не ок. И вы этот реквест по хорошему влить не можете, потому что если вы действуете по системе там зелёного транка, вы должны вливать только всегда зелёные тесты, чтобы гарантировать работоспособ.
170: Собность вашего кода.
171: И вот это все как следствие, сохраняет нервную систему разработчиков, чтобы опять же не отвлекаться на всякие мелочи. Давайте запустим с ретраеми.
172: Все точно также запускаем гермиону и указываем опцию ретрай 2 2. Это наугад выбранное. Там все зависит от проекта и стабильности ваших Тестов на данный момент и стабильности вашей инфраструктуры. Открылась.
173: Страница. Курс доллара к рублю не такой оптимистичный, как хотелось бы. Так все.
174: Упал. Ну, хотя бы посмотрели, что такое ретрай. Да, так, пошёл на retry. Тест опять неоптимистичный. Ну, сейчас то он пройдёт. Угу. Тест прошёл, но я
175: Я вас поздравляю, вы написали свой 1 плавающий тест. Ну, как я написал, а вы меня не остановили.
176: Что такое плавающий тест, как бы название говорит само за себя, когда уже не инфраструктура виновата, а проблема в коде или тесте это самое большое зло интеграционных Тестов создаются.
177: Целый инфраструктуры вокруг интеграционных Тестов по отлавливанию плавающих Тестов создаются целые команды, которые разбирают плавающие тесты. Это я сейчас не шучу, это как бы реально происходит. Создаются всякие фишки для того, чтобы
178: Автоматически скипать плавающие тесты. Это самая большая проблема в интеграционном тестировании. Почему? Потому что определение такое, да, у нас система, в которой пользователь, оказывается, она максимально приближена к ней, плавающие тесты по
179: Моему происхождению бывают 3 видов, можно выделить, может быть, и больше, но основные такие неправильно написанные тесты, например, разные тесты, влияют друг на друга, что 1 приходит в голову, наверное, не самое очевидное. Не зна.
180: Почему мне это приходит впервые в голову? Вы в 1 тесте выставили куку, a2 тест на эту куку опирается.
181: Пока тесты идут, 1 за 2 все работает хорошо, но как только тесты по какой-то причине там тесты читаются, как-то фильтруются, порядок изменится, 2 тест запустится, раньше 1 не получит.
182: И скуки, и упадёт. А вы потом перезапустите опять порядок поменяется, все нормально, завязка на внешние ресурсы тоже пример из жизни.
183: Некоторые браузеры, когда вы кликаете в ссылку, открывают страницу стороннюю, и пока она не загрузится дальше ничего не делают. И вот у нас были тесты, где мы кликаем, загружается сторонний ресурс, потом он где-то 2 часа, ну того и все.
184: Тесты падают, потому что чуть ли не каждый 3 тест ходит именно в эту ссылку, ну, в этот ресурс, фактически там по разным ссылкам, но в этот ресурс. А потом через 2 часа все хорошо, все нормально, все с подняли.
185: Отсутствие корректных стабов. Также, может быть тоже пример из жизни среди вас сидят люди, которые напишут, напишут такой интеграционный тест, да, хоть убей где-то уже лет 6. Сколько яндекс там пишет активно интеграционные тесты, перо.
186: Января дежурному. Это с похмелья. Вот так вот приходит смска, а у меня тесты падают. Знаете почему? Потому что был 2019 год, стал 2020. На страничке поменялось автоматически дейт нау. Теперь говорит, 2020 год и скриншоты все, которые снимали страниц.
187: Поломались и там сидит релиз, менеджер и такой, ну что делать? В общем, некорректные стабы. Такое надо было заставить. В конечном итоге коряво написан тест.
188: Это что касается неправильно написанных Тестов. Самое страшное это когда у вас ошибка в коде сервиса. Что имеется ввиду, когда вы вводите курс доллара к рублю и у вас яндекс иногда конвертер не отдаёт или отдаёт там неправильно, а иногда
189: Даёт это вообще самое сложное в Починке, ну как и в любом, в принципе, коде, когда какая-то плавающая фишка, то это тяжело воспроизводится, тяжело чинится. Ну и, наконец, ошибки в коде инструмента тестирования. Такое тоже может быть явно у нас сейчас не ошибка в коде инструмента.
190: Тестирование и не ошибка в коде сервиса. Да, яндекс вроде как работал корректно. Мы в ретрае, когда 1 раз упал тест, видели, что все-таки отображается конвертор валют. Объективно разные тесты влияют друг на друга. У нас 1 тест.
191: Вязка на внешние ресурсы. Мы вроде ничего не делаем. Отсутствие корректных стабов мы как бы ничего не ставали, дат нету. Ну коряво написан тест. Ну что ж, ещё остаётся, сейчас будем чинить. Я говорил.
192: Что нужно на ретраить? Вот, вот это нельзя. А вот так нельзя так взять и ретраить вот эти ошибки. Почему кто-то может сказать да фиг с ним, с этим конвертором валют он появился.
193: Сегодня появился, завтра не появился. Оно ж проходит. Давайте фиганет туда ретраев 7 точно же пройдёт. Во первых, не точно. И вы столкнётесь опять с проблемой, что у вас упадёт тест, вы пойдёте разбираться, скажете да? Е а.
194: Во вторых, это банально замедляет тесты и так медленные тесты. Ещё больше вы тратите ресурсы. Вместо того, чтобы тест прошёл за 10 секунд, он проходит в 2 раза медленнее за 20 секунд. Если у вас Тестов 1000, то вместо там 30 минут. Тратите час. Зачем?
195: Никому не надо. Давайте починим тест. Я вот заведомо писал корявенько, мы удалим вот эти строчки и добавим вот эту, что мы сейчас здесь сделали, что было, что стало, мы перешли на страницы.
196: И как бы не дожидались рендеринга всех компонентов. Мы просто, безусловно говорили, страница открылась. Дайте мне компонент и давайте проверим, что он существует. А возможно, ну, как бы и браузер работает быстрее, чем мы.
197: Обратите внимание, что программа, которая контролирует браузер, там даже курс доллара к рублю вводится с какой-то невероятной скоростью. Ну как бы так, нормальный человек не вводит. Нам просто сейчас это не нужно, чтобы он вводил медленнее, это можно сделать. И в связи с этим могут появляться проблемы.
198: Вот такого характера и по хорошему нужно ждать, пока страница полностью загрузится и отрендерит все, или, допустим, ждать этот элемент методом Вейт фо экзист по умолчанию там.
199: 500 миллисекунд элемент будет. Мы будем ждать. Элемент можно указать больше. Все зависит от того, что вам надо.
200: Пока не запускаем, этот тест будет стабильный, будет работать нормально до тех пор, пока яндекс не захочет не отдавать нам конвертер валют. То есть сломается. Да? Чего не хватает? Какие есть идеи?
201: Подсказка. Да, в принципе, в принципе, можно сказать, что до этого мы занимались полной ерундой, и текущий сценарий можно потестировать юни тестами, как вы с Димой тестировали.
202: Ну, фактически.
203: Выждал техническую паузу 5 минут, 5 минут, 5 секунд. Мы визуально никак не тестируем наш компонент. Фактически до этого можно было, как я сказал, все потестировать, юни, тестами, потестировать, что элемент есть на странице. А вот
204: То, что делает тестировщик, он фактически смотрит, как конвертер отобразился на все отступы, на все цвета, на все кнопочки, что все красиво, все хорошо, это то, что юниттесты не дают тестирование ui.
205: Переходим к тестированию вёрстки скриншотами. В чем идея? Вот наш. Наша есть страница, которая отображает конвертор валют. Мы хотим снять скриншот вот этого конвертора.
206: Валют. Нам причём не надо даже всей страницы. Это не тот тест сохранить его на файловую систему, пописать код.
207: Точно также открыть эту страницу, снять скриншот элемента, сохранить на файловую систему и сравнить и после сравнения внезапно узнать, что мы как-то че то провафлили и точка у нас вместо запятой, а между прочим,
208: Доказано, что это миллионы рублей в продакшене. Дима вам приводил пример. Вот что мы хотим, как это сделать? Это из коробки предоставляет гермиона. Там довольно нетривиальная логика под капотом это
209: Кажется, да, что нужно просто взять.
210: Координаты элемента там очень много всяких нюансов итак, команда называется third вью. 1 аргументом туда передаётся название состояния это как имя переменной можно указать все что угодно. 2 аргументом передаётся селекторы, которые ну.
211: Нужно снять. Давайте запустим.
212: С запуском ничего тут не меняется, кажется. Да, обратите внимание, что сильно дольше мы запускаем всего лишь 1 тест. А насколько быстро Дима запускал свои тесты? То есть здесь та самая проблема, как мы поднимаем окружение у на
213: Все очень долго так.
214: Так, так, почему сейчас тест упал? Есть идеи?
215: Вспоминаем концепцию. Да, нам не с чем сравнивать. Нам нужно сначала сохранить эталон. Есть несколько способов это сделать. Расскажу сразу. Правильный. Нам нужен такой инструмент, который
216: Поставляется рядом с гермионой называется html, отчёт, он предоставляет определённые гуи для запуска Тестов в поле plugins добавляем html, отчёт, у него там есть какие-то параметры, это можно посчитать в доке, самое основное это куда сохранять.
217: Запустим с гуя запускается да, добавляется командочка гуя, обратите внимание, все остальное такое же, со слова gui не смеяться.
218: Так, да, у нас открылся, открылась открылся такой интерфейс, в котором мы видим, что
219: Ну, реальную ошибку не нашли эталонного скриншота. Давайте его примем. Визуально выглядит он ок, мы принимаем этот скриншот и
220: По ретраем посмотрим, все ли будет ок ретрай. Обратите внимание, что мы уже не в консоли что-то запускаем, а прям в интерфейсе. В этом и суть этого юзер интерфейса, он такую дровину структуру предоставляет. Там ещё много всяких разных фич. Это не будем здесь останавливатьс.
221: Можете потом покликать, все окей, заработало, казалось бы, но нет ничего более нестабильного, чем что курс доллара, правильно? Эта же штука может меняться.
222: Точно так же, как и вот эта штука может меняться по хорошему. Не давайте по хорошему я это 2 шагом будет по хорошему, что нужно можно сделать. Здесь есть 2 способа. 1. Сейчас с ним познакомимся. Эти
223: Элементы можно как бы застабать на стороне вёрстки. Сейчас покажу как-то есть на стороне команды.
224: А сейчас запустим и поймём, что он нестабильный, да, потому что обратите внимание, что там прям время выдаётся. Это совсем нестабильный тест. Я буквально через пару минут запустил его, мы ввели, а курс доллара уже поменялся, и там уже дата даже
225: Другая стоит. Вот. И так вот у нас появился дифф, который будет постоянно появляться, вы будете аксептить скриншот, он будет обратно постоянно появляться, как видно на скриншоте, но здесь видно самое главное, что если у вас
226: Какая-то ошибка реально в интерфейсе, то вам инструмент покажет и покажет где дифф давайте исправлять эту ошибку с помощью такого параметра как no elements он.
227: Он закрасит, слышно? Да, он закрасит черным квадратиком элементы, которые мы указали ему. То есть конкретные селекторы. Мы тут хотим закрасить циферку, курс доллара к рублю и времечко запускаем.
228: Запускаем.
229: Сейчас, как вы думаете, тест упадёт или нет?
230: Да, он закрасит. Да, логично. Я просто так это слежу. Как это слушаете вообще или нет? Потому что поздно. Прошёл уже час практически лекции. Перерыв не нужен. Все хотят домой побыстрее закончить. Да. Какой перерыв?
231: Да, вот у нас все равно он упал, потому что вот так вот на самом деле выглядит скриншот, да, он много чего закрыл. Эксепте его принимаем и попробуем.
232: Теперь уже сравниваться будет вот с этим скриншотом все должно быть корректно. Вы посмотрели сейчас и думаете, а что же мы тут, в принципе, в интерфейсе? Мы половину закрасили. Да, да.
233: По хорошему нам, если мы как бы писали тесты, разрабатывая яндекс, нам необходимо стабат сервер, то есть необходимо, чтобы по запросу курс доллара к рублю. Яндекс знал, что мы в тестовом окружении, и всегда давал оптимис.
234: Результат 56 ₽. И конкретную дату на это время. Мы сейчас пока это не затрагиваем, затронем чуть позже. Сейчас пока вот починили тест. Вот таким вот способом он иногда тоже может быть полезен, все тест прошёл.
235: Все работает. Поставим себе такую задачу. Кто то когда-то катил эксперименты на сервер, на сервис. Ну то есть раскатывается какая-то новая фича, нужно там её раскатить на там, н, процентов пользователей.
236: Ну, например, такая вот задача, как это сделать? Ну, например, добавляется в url query параметр, который говорит серверу, что это эксперимент и сервер по другому работает и раскатывается там на часть пол.
237: Иногда нужно прогнать тесты под экспериментом, то есть выкатили эксперимент, новую функциональность, и мы хотим прогнать все тесты и проверить, что да, ничего не ломается. Запрос понятен.
238: В принципе, да, понятно. Да, я так, все кивают. Надеюсь, в зуме тоже все кивают. Покивайте в итоге, чтобы запустить под экспериментом, нам нужно добавить какой-то квери параметр, а у нас 1000 Тестов, но даже автозамен.
239: И то вас не прокатит, скорее всего, потому что каждый по разному будет писать по хорошему. Надо вот сюда, вот вот сюда вот нужно добавить вот к комментариям какой-то конкретный квери параметр, но это не очень целесообразно хочет
240: Иметь что-то автоматическое. Так мы плавно перешли к плагинам или плагинам. Мы уже, в частности, затронули эту тему. Мы ставили отчёт. Это плагин гермионе, который отображает результаты выполнения Тестов. И не только
241: Видите, можно даже запустить тест. Все это возможно, потому что гермиона реализована на событийно ориентированной архитектуре. Какое сложное слово. А кто знает, что это такое?
242: Отлично. Я не знал, что у вас какая лекция. Подряд не подготовился. Ну отлично. Значит, не так. Все забыли. Я вас проверял.
243: Итого гермиона триггерит определённые события во время запуска это точки инъекции, в них можно подписаться, в них, на них можно подписаться и что-то поделать. Например, подписаться на тест сакссес и
244: Понять, что тест успешный, посчитать количество успешных Тестов, посчитать количество зафейленных Тестов, много чего там можно поделать, там писать, плагины не переписать. Давайте посмотрим, че мы хотим. Опять же вспоминаем, мы хотим уметь
245: По запросу в каждый url наших Тестов, а у нас их может быть 1000 и 10000 и 40 добавить какой-то query параметр. Делается это так ну как бы это как может это выглядеть в плагины нам хочется подключить какой-то плагин. Назовём его гермиона.
246: Url декоратор обращаю сразу внимание, что префикс гермиона можно не писать. Можно писать вот так, как написано. Url декоратор просто. А в опциях ему указывать. То есть мы какое-то же общее решение даже пытаемся писать. Что мы хотим добавить квери
247: Какой-то то есть энейбл экс и со значением 1. Давайте напишем мы пишем в файлике реализацию нашего плагина сверху сторонний модуль. Когда будете писать обратите внимание, его надо поставить я как бы вы
248: По ноде уже проходили, да, лекцию, вы это в курсе. Итак, функция плагин. Плагин это функция, которая экспортится 1 аргументом. Это инстанс гермионы, 2 это опции инстанс гермионы. Сейчас мы чуть ниж.
249: Поговорим об этом. А опции это наши вот эти квери, которые мы передаём из со стороны конфига. Итак, гермиона триггерит. Разные события, чтобы реализовать добавление квери параметра во все урлы.
250: Нужно переопределить команду url, то есть как это алгоритмически выглядит. То есть мы хотим, чтобы при вызове команды url программа сама понимала, что так вызвали url. Нужно ей добавь докинуть параметров, что
251: Переопределять команды, чтобы добавлять команды новые переопределять, нужно подписываться на конкретное такое событие нью браузер туда прилетает в callback браузер это instant, driver её клиента робота помним, да.
252: Помним, да, web driver. Клиент мокка н. Хэвэл. Вот его вот этого, который робот.
253: И с помощью команды оверврайт команд url пишем её реализацию, перезаписываем её реализацию. 1 аргументом там прилетает изначальная реализация урла. 2 аргументом аргументы.
254: Для команды url. Обратите внимание, что команда url изначально хитрая, она может не принимать аргументов. Если она не принимает аргументов, то она возвращает текущий url. Поэтому это нужно обработать, но в обычном слу.
255: Мы как бы просто добавляем в url наш квери параметр и вызываем оригинальную функцию, изначальную с новым подкаченным урлом. Все, как это выглядит с точки зрения файловой системы. Вы создаёте файлик?
256: Индекс джес в какой-то папочке гермона декоратор в индекс джес кладёте вот этот код в json кладёте минимально типа название пакета версия пакета мейн джис какие-то зависимости все кладёте это рядом с нашим проектиком, где мы все запускаем.
257: Линкуете их через npm линк или выпускаете версию, но герона у декоратор у вас не получится, забито, по моему, имя уже в npm. Ну у, декоратор 2.
258: Или как-то по другому все мы подключаем наш плагин мы его уже подключили. Запускаем url декоратор с запускаем гермиону с плагином url декоратор тоже через gui?
259: Трайме, все как положено, так у нас запускается. Все отлично. Ретраем. Сейчас попрошу внимание на когда поднимется браузер. Ещё раз хочу проакцентировать внимание на то, ка
260: Это все медленное, особенно когда у меня ещё в гостинице был медленный интернет. Как он долго грузится? Обратите внимание на url. У нас все работает. У нас появился квери параметр, то есть задача выполнена.
261: Все дальше запускается тест. Мы кликнули там пропал, здесь пропал почему-то.
262: Так должно быть, скорее всего.
263: Вот, а в трансляции все, видать, все. Я вообще, как бы, да, и сюда показывал все время, да, если вы обратили внимание, я там не сделал паузу, когда мы кликнули и перешли на страницу.
264: Которая показывает конвертер, там уже не было квери параметра. Почему? Потому что мы не вызывали url, чтобы на него перейти. Мы кликнули сервисом, перешёл все. Поэтому там и не должно быть такой задачи не было у нас. Давайте убедимся, что тест
265: Стабилен, да, важный момент. Важный момент. Как же понять, что тест больше не плавает. Единственный нормальный способ это позапускать его энное количество раз. Помните, я говорил, что есть целые инфраструктуры?
266: Для того, чтобы ловить плавающие тесты. Вот есть шедулеры, которые запускают прогоны Тестов, собирают статистику с разных прогонов, чтобы проверять, что тесты стабильны. То есть это проблема в принципе, открытая. То есть локально, если вы потестирует
267: Его там 10 раз не факт, это хотя бы хоть что-то гарантирует, но не факт, что он не не плавающий. То есть умение писать неплавающие тесты придётся реально с опытом, когда вы разберётесь там с инструментом тести, даже не с гермионой.
268: Самим the driver ио. Когда вы все это пощупаете, поймёте, как браузеры себя ведут на разных командах, тогда вы перестанете уже писать плавающие тесты. Ну что, давайте определим, что тест.
269: Что тест стабилен или нет, мы запустили ретрай, у нас что-то упало unable to connect. Ага, драйв, что-то с браузером. Напоминаю, что мы в отдельной вкладке терминала, я акцентировал на этом внимание. Подняли селен.
270: Сервер. И он тебе дружненько последний час что-то там крутился. Почему-то он упал. Очевидно, почему упал. Причин может быть много. Хоть мы закрыли его случайно, хоть там он какую-то ошибку поймал. Неудобно запускать.
271: Во время Тестов параллельно себе сервер. Неудобно же, неудобно. Давайте перестанем это делать, напишем плагин, назовём его гермиона селениум то runner.
272: Можете как-то по другому его назвать, что эта штука сделает? Она перед стартом теста поднимет сервер после завершения теста его погасит. Буквально подписываемся на события раннер старт. Все эти события есть в доке и на слайдах.
273: Может, что-то уже с новой версией появилось, неважно. Почитайте в доке, если что, здесь мы вызываем процесс, стартуем сервер, перенаправляем все его логи.
274: В конкретный файлик и 4. На самом деле нужно подождать, пока сервер поднимется, как это сделать. Там написано тудух для тех, кто хочет 6 с плюсом за домашку, нужно будет полить вот эту ручку, она подни.
275: Это быстро, буквально из этих 2 секунд, но мы не можем без эвейта сделать, потому что тесты сразу стартанут, сразу стартанут, а браузеры ещё не отдаются. То есть здесь читер чит такой ждём, да, я здесь использую.
276: Пакет дилей. Я здесь опустил реквайр, чтобы не было такого. Скопировали, вставили.
277: Далее мы на конец Тестов на runner and тоже.
278: Киляем наш процесс, там сектер шлётся по умолчанию. И это тоже тут недоработка. Я, я не писал полную версию, чтобы вы че то поделали в этом, в этом месте. И плюс оно тупо бы на слайды не поместилось. Честно говоря, это основная причина. Я там
279: Писал да я, как я это не могу, это не видно будет. Короче, здесь нужен force shutdown. Что значит, что если мы послали кил процессу, он не завершился, мы ж не можем, чтобы он вечно висел, надо его девяткой прибить просто через какое-то время и все. Ну как бы это так надо бы сделать.
280: Подключаем наш, нашу, наш плагин, в подключаем наш плагин просто и теперь по запускам у вас перед запуском сервер поднимется тесты про
281: Тут сервер погасится в файлике селениум лог будет весь стдр, стдаут тоже можно накручивать. Можно здесь опции добавить. Куда писать лог, там ещё че-нибудь, сколько ждать поднятия сервера сколько?
282: Ждать его погашения. Ну там можете придумать все, че угодно. Рекомендации по домашке это новая секция. Если кто-то смотрел когда-то лекции по интеграционному тестированию за прошлые шри, этого не было, это самое
283: Приятное, что может быть 1, очень важное не бросаться делать свою домашку, взять лекцию и воспроизвести все примеры у себя на компьютере, если
284: Что-то не работает. Решите проблему сами. Не надо. Как это по опыту прошлых лекций. Помните, я про ждк рассказывал 1 человек, у него не было ждк. Он пожаловался в чат. Да, ради Бога, можно спрашивать вопросы, но просто
285: Мы ж, блин, уже взрослые люди, программисты, можем решать свои проблемы самостоятельно. Там, погуглив хотя бы на 1 ссылке это все, получив ответ, написал в чат, и все решили тоже не поднимать гермиону. А у меня тоже не поднимается. И все просто 15000 сообщений я не могу.
286: Поднять это все ну если все равно не получилось, все равно решите проблему сами там ничего не rocket science это все, это все контрол ц контрол, в это все должно работать, используйте гермиону.
287: Дима вам сказал, что можно использовать джест, мокку, все, что угодно?
288: Мы ж пришли в шри яндекса, здесь используется во всех крупных сервисах гермиона. Вам нужно все равно это прочитать. И мы не просто так что-то накрутили, тоже как-то комментарии читал. Знаете, это как это?
289: В лицо боятся сказать, а комментарии пишут, типа, да, тут чувак час создавал и называет мне имя какого-то мейнстримового, ну, инструмента, который там пиарится, у него там есть какие-то стары, типа, зачем?
290: Это все надо, ну, как бы, естественно, ответ на этот вопрос заключается в том, что яндекс бежит впереди всех и вся, и, значит, не было тех инструментов, которые решают наши проблемы. Я как бы смотрю этот комментарий и думаю, блин.
291: Что ж там за инструмент? Может реально все это зря мы тут делаем. И типа там 1 комментарий, саппорт, онли хром конкретной версии. Ну серьёзно, в чем фишка самая главная гермионы? Ну, 1 из главных в том, что мы стараемся
292: Поддерживать все самые популярные браузеры по возможности. То есть у нас поддержаны там хромы, фаерфоксы, всякие режимы, эмуляции, айосы, андроиды, там последние года 2 назад у нас ещё e6 был поддержке. Сейчас уже слава Бог.
293: Только единственный там в небольших проектах остался, но тем не менее, многие решения аналоговые, которыми вы пытаетесь, там кто-то уже, может, пользовался. Я не против этих решений, просто у нас как бы опять же, шрифт
294: Яндекс, это круто, что вы будете знать и то и то. Не надо приходить с тем, что я знаю только это. Я не хочу тратить на время, на изучение чего-то нового.
295: 2 фича это то, что гермиона позволяет тестировать скриншотами. Я не зря акцентировал внимание, немножко акцентировал внимание на том, что это не просто так получить размеры элемента, получить его позицию и снять скриншот. Там очень много всякой
296: Логики, очень много всяких нюансов, чтобы это все работало в разных браузерах, чтобы это все работало на разных разрешениях. Это как бы целая целое исследование было проведено, чтобы это работало и продолжает проводиться, потому что баги
297: Все равно всплывают. Иногда бывает, что снимается что-то не то редко, но за счёт того, что у нас поток Тестов большой, тестовых сценариев большой, то как бы скорее всего вы с этим не столкнётесь. Очень много фич, например, если вы хотите на мобилках снять какой-то блок,
298: Который во вьюпорт не влезает. То есть я только в гермионе видел такое, чтобы она умела снять. Даже если не влезает во вьюпорт, она там умеет подскролла ь по умному склеить изображение и давать вам нужное высокая производительность.
299: Опять же тоже то, чего нету. И кажется, наверное, не будет, не то, что не будет сейчас тоже нету у каких-то аналогов мы должны запускать в яндексе. Вот если взять пример серпа,
300: 40000 интеграционных Тестов, 40000 Тестов. Прикиньте, это все запускается за 15 минут. В худшем случае. Ладно, не в худшем. В худшем случае, если все тесты проходят успешно, просто если они проходят неуспешно, они ретраятся. Ну, получается, какой
301: Это, ну, замедление, но, тем не менее, если ваш код написанный работает правильно, то тесты прогонятся за 15 минут. Ну, то есть, это там, помимо всего прочего, помимо гермеон, ещё вокруг инфраструктура. Понятно, что вокруг ещё куча, у нас браузеров есть куча.
302: Но гермиона сама так реализована, что она под эти мощности грамотно утилизирует те инструменты, там какие-то аналоги, может быть, сейчас что-то похожее, где-то есть, но на когда нужно бежать впереди и вся, они этого не предоставляют и коммититься в них.
303: Не договоришься.
304: Там, фич, очень много можно почитать в доке. Вообще все хочется. Я каждый год это говорю, и каждый год никак не доходят руки. Хочется создать доклад, который про про то, чтобы сравнить какие-то
305: Популярные инструменты с гермионой и там как бы сравнивать, опять же, не пересрав ивать, я выделил только там основные 3, но там много есть. И последнее пожалейте проверяющих дома.
306: О чем речь? Опять же, приходит такой крутой разработчик и говорит, да, я там на этой штуке разрабатывался. Гермиону у меня не получилось поднять или не хочу поднимать. Напишу-ка я на вот этой схеме. Ну, понимаете, и ко
307: Мне приходит человек, который проверяет домашки и говорит, ну, я ж ответственный человек, я запускаю, а он, ну, а код не запускается. Такое часто бывает. Среди вас сидят люди, у которых сдадут домашку, с которой, ну, тесты не
308: Запускаются я и про zoom говорю про все все кто-то по любому есть люди ну не могут быть все отличники как хотя может это шри такое ну точно будут люди, которые сдадут там или не сдадут домашку и как сдаёт домашку она не запускаетс.
309: Человек видит, что инструмент не гермиона, перечитывает всю доку, запускает эти тесты, делает нормальный фидбэк по тестам. То есть не конкретно, что, как нужно сделать было, да, ему
310: Я ему так и сказал, может быть, типа 2, оно не запускается? Нет, человек разобрался, потратил время на инструмент, который он не использует и использовать не будет. Запустил эти тесты, дал фидбэк по тестам. Ну как бы, это ж человек просто за спаси.
311: Cibo помогает, ну как бы шри, чтобы это было, есть и чтобы было когда-то ещё. Поэтому пожалейте докладчиков, изучайте что-то новое, давайте мы докладчиков, докладчиков тоже, они ж тоже домашки проверяют так это все.
312: Такие лирические были, кстати, рекомендации теперь рекомендации более реальные. Вот это, по идее, если мне меня правильно проинформировали, уже не как это абстрактный проект похож на то, что вы делаете в у себя.
313: Шри, вы отображаете интерфейс какого-то гитхаб репозитория?
314: Совет, дружеская рекомендация. Ставайте ответы стороннего компонента, что здесь есть сторонний компонент, это git или github. Ну то есть, если вы клонируете репозиторий, вызываете команды Гита и потом их отображаете и результаты этой ком.
315: Команды выдаёте на странице, либо вы под github апи ходите и получаете данные, чтобы писать стабильный тест интеграционный, не надо ходить на гитхаб, он тоже, бывает, лагает. Соответственно, если гитхаб все, то ваши тест.
316: Это тоже все. Как это сделать?
317: Представим, что мы хотим протестить, что url такой-то по слэш комис выдаёт там список коммитов, и проверить этот визуально идёт запрос его.
318: Обрабатывает сервер. Вы понимаете, что запрос коммит, знаете какой репозиторий? Идёте в китап апи, получаете данные джесону огромную, да, такую, и потом отображаете её наверх. Все, если вы
319: Так сделаете. В домашке то вы напишите ничего плохого в принципе, но вы напишите to её тест. Но домашка по интеграционным тестам. Вам надо научиться составать запросы. И как это сделать у нас?
320: Все инструменты для этого есть. Мы можем добавить, научить наш сервер обрабатывать какую-то, какой-то квери параметр гермиона тест равно 1 например, это даст серверу знание о том, что мы находимся в режиме тестирования и
321: Взять и для конкретного урла джесону готовую, которую вы как-то раньше реальную получили с github апи. Таким образом вы решите проблему с датами, с количеством, коммитом, с тем, что гитхаб не работает. То есть вы просто зафиксировали, заморозили
322: Состояние, которое вы хотите протестировать, и это позволит вам эти данные протестировать интерфейс. Все.
323: Итак, нужно добавить тестовый квери параметр. Через плагин мы в лекции добавляли квери параметр. Вся лекция, удивитесь, была не просто так. У вас вся информация для этого есть. Добавляем через плагин квери параметр.
324: Научить сервер. Вам придётся обрабатывать этот квери параметр. Это как бы не написание дополнительного кода. Это все ещё входит в настройку инфраструктуры. Вы 1 раз настроили и забыли со звёздочкой, но опять же, если надо
325: Как-то надо, как Дима говорил, что иногда и тестовые селекторы можно в продакшн выпускать, тут можно реализовать несколько режимов сборки, чтобы в продакшн вот эта обработка этого параметра не шла как задание.
326: Звёздочкой запуск должен быть самодостаточным. Что это значит? Запуск? Selenium сервера должен быть частью запуска Тестов. Не писать доку в репозитории. Это тоже из прошлых шри, типа запусти.
327: Сначала селениум, сервер запустите, потом моё приложение. Вот это 2 пункт. А должно быть только конкретно. 1 команда нпм ран гермиона можно назвать не гермиона, как хотите. Под этой командой должно быть спрятано. Как это сделать? Мы тоже
328: С вами, ну, проходили мы, он уже понятно, как там есть какие-то тудухи. Ну, сами решайте, надо вам это делать или нет. А сервис ваш вы тоже можете запустить и также его погасить. Тестируйте вёрстку скриншотами, просто потренируйтесь это
329: Тоже полезно. Интересно. Ну и как это основная фича? 3. Используйте практики из написания юниттестов. Просто освежу в памяти, там
330: Все практики полезные, то есть семантически правильно именуйте тесты, то есть не 1, 2, 3. Тестируйте код, а не функциональность. Ой, не тестируйте код, а функциональность. То есть не надо смотреть в код и думать. Так, у меня здесь вот так и так, и так сейчас.
331: По этому коду так пройдусь. Нет, нужно придумать себе сценарий, чтобы когда код реализация изменится, а функциональность останется такая же, а изменится она, допустим, вы порефакторил код, то тесты ваши не сломались? Проверяйте, что тесты друг от
332: Друга не зависят всегда держите это в голове, что ваши тесты запускаются как попало. Там параллельно запускаются тесты и 1. Если вы записали их вот так как по 1 в линию, то скорее возможно, что последний запустится раньше. То есть это тоже нужно учитывать.
333: Сломайте код теста и убедитесь, что тест падает. Сломайте код сервиса. Убедитесь, что тест падает. Код теста это в 1 очередь код, и он должен быть понятен другим разработчикам. Его должны поддерживать. Он должен быть понятен.
334: Его должны использовать, во что я хотел этим сказать.
335: Что модульные тесты? Да, мы поговорили, что это тестирование 1 независимого компонента в окружении, тоже независимым от других компонентов, с которыми он взаимодействует. У юниттестов есть недостатки, они не тестируют связи между компонентами.
336: Сложно тестировать ui заставляют писать дополнительный код, интеграционные тесты, тестирование 2 или более компонентов, но мы добавляем, что окружение практически такое.
337: В котором оказывается пользователь. И там мы можем что-то застабать. У них есть недостатки там-то, что они медленные, нестабильные и не говорят ответ на вопрос, а где же ошибка, ету тесты? Это надстройка над интеграционными тестами.
338: Более высокого уровня, там все те же проблемы сохраняются, как и в интеграционных тестах, да, только ещё хуже, потому что там окружение полностью такое, как у пользователя. Нужно покрывать код и юнит тестами и интеграционными тестами.
339: И e2e тестами, но вот эту, это количество сколько писать, чего придёт с опытом в зависимости от проекта и то, какую литературу вы начитаете, потому что там-то, как вы сейчас этот доклад восприняли, тоже какую-то информацию получили вы.
340: Читаетесь ещё литературы с каким-то опытом, с каким-то опытом просто написания кода. Примите решение, что же вам использовать. Может быть вы придумаете свою пирамиду, назовите её пирамида Иванова, и все будут на лекциях её показывать. Все.
341: Виды тестирования должны быть и могут быть автоматизированы, к этому нужно стремиться. И напоследок документация по инструментам мокка. Думаю все знакомы веб драйвер ио. Это клиент, который общается с браузером, сама гермиона и к ней отчёт
342: Все, спасибо за внимание, вы прекрасная публика.