HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <h2>E2E Практики</h2>
1 <h2>E2E Практики</h2>
2 <h2>Hexlet</h2>
2 <h2>Hexlet</h2>
3 <h2>Что вообще проверяем?</h2>
3 <h2>Что вообще проверяем?</h2>
4 <ul><li>Соответствие макету<ul><li>поддержка retina-мониторов</li>
4 <ul><li>Соответствие макету<ul><li>поддержка retina-мониторов</li>
5 <li>pixel-perfect</li>
5 <li>pixel-perfect</li>
6 <li>контраст / следование style guides</li>
6 <li>контраст / следование style guides</li>
7 </ul></li>
7 </ul></li>
8 <li>Проверка на разных разрешениях экрана<ul><li>десктопной</li>
8 <li>Проверка на разных разрешениях экрана<ul><li>десктопной</li>
9 <li>мобильной</li>
9 <li>мобильной</li>
10 <li>адаптивных</li>
10 <li>адаптивных</li>
11 </ul></li>
11 </ul></li>
12 <li>HTML / CSS / JS</li>
12 <li>HTML / CSS / JS</li>
13 <li>Шрифты</li>
13 <li>Шрифты</li>
14 </ul><ul><li>Работа в разных окружениях<ul><li>кроссбраузерность</li>
14 </ul><ul><li>Работа в разных окружениях<ul><li>кроссбраузерность</li>
15 <li>работа на разных устройствах</li>
15 <li>работа на разных устройствах</li>
16 <li>работа на разных операционных системах</li>
16 <li>работа на разных операционных системах</li>
17 <li>корректная работа с разной скоростью интернета</li>
17 <li>корректная работа с разной скоростью интернета</li>
18 <li>корректная работа при включенном расширением AdBlock в браузере</li>
18 <li>корректная работа при включенном расширением AdBlock в браузере</li>
19 <li>анимация / прокрутка / sticky элементы / плавность</li>
19 <li>анимация / прокрутка / sticky элементы / плавность</li>
20 </ul></li>
20 </ul></li>
21 <li>Контент<ul><li>большой текст</li>
21 <li>Контент<ul><li>большой текст</li>
22 <li>орфографии</li>
22 <li>орфографии</li>
23 <li>изображения</li>
23 <li>изображения</li>
24 </ul></li>
24 </ul></li>
25 </ul><h2>Что мы делаем</h2>
25 </ul><h2>Что мы делаем</h2>
26 <ul><li>определяем пользовательские сценарии<ul><li>логин</li>
26 <ul><li>определяем пользовательские сценарии<ul><li>логин</li>
27 <li>создание аккаунта</li>
27 <li>создание аккаунта</li>
28 <li>отправка сообщений</li>
28 <li>отправка сообщений</li>
29 <li>покупки</li>
29 <li>покупки</li>
30 </ul></li>
30 </ul></li>
31 <li>автоматизируем сценарии</li>
31 <li>автоматизируем сценарии</li>
32 <li>тестируем тесты</li>
32 <li>тестируем тесты</li>
33 <li>учитываем кроссбраузерность</li>
33 <li>учитываем кроссбраузерность</li>
34 </ul><h2>Даже не пытаемся тестировать</h2>
34 </ul><h2>Даже не пытаемся тестировать</h2>
35 <ul><li>CAPTCHA<ul><li>Отключаем капчу в тестовом окружении</li>
35 <ul><li>CAPTCHA<ul><li>Отключаем капчу в тестовом окружении</li>
36 <li>Добавьте хук, позволяющий тестам обходить капчу</li>
36 <li>Добавьте хук, позволяющий тестам обходить капчу</li>
37 </ul></li>
37 </ul></li>
38 <li>Двухфакторная аутентификация<ul><li>Отключаем 2FA в тестовом окружении</li>
38 <li>Двухфакторная аутентификация<ul><li>Отключаем 2FA в тестовом окружении</li>
39 <li>Отключаем 2FA для определенных пользователей в тестовом окружении Вы можете использовать учетные данные этого пользователя при автоматизации</li>
39 <li>Отключаем 2FA для определенных пользователей в тестовом окружении Вы можете использовать учетные данные этого пользователя при автоматизации</li>
40 <li>Отключите 2FA для входа в систему с определенных IP-адресов Мы можем установить эти IP-адреса для наших тестовых машин</li>
40 <li>Отключите 2FA для входа в систему с определенных IP-адресов Мы можем установить эти IP-адреса для наших тестовых машин</li>
41 </ul></li>
41 </ul></li>
42 </ul><h2>Даже не пытаемся тестировать</h2>
42 </ul><h2>Даже не пытаемся тестировать</h2>
43 <ul><li>вход на сервисы вроде Gmail и Facebook, с помощью WebDriver это делать не стоит<ul><li>это против условий использования этих сайтов</li>
43 <ul><li>вход на сервисы вроде Gmail и Facebook, с помощью WebDriver это делать не стоит<ul><li>это против условий использования этих сайтов</li>
44 <li>вы рискуете потерять учетную запись</li>
44 <li>вы рискуете потерять учетную запись</li>
45 <li>это медленно и ненадежно</li>
45 <li>это медленно и ненадежно</li>
46 <li>используйте сервис, предоставляющий API для создания тестовых учетных записей</li>
46 <li>используйте сервис, предоставляющий API для создания тестовых учетных записей</li>
47 <li>работа с API может усложнить работу, но это окупится скоростью, надежностью и стабильностью</li>
47 <li>работа с API может усложнить работу, но это окупится скоростью, надежностью и стабильностью</li>
48 </ul></li>
48 </ul></li>
49 <li>геттеры / сеттеры</li>
49 <li>геттеры / сеттеры</li>
50 <li>нечто нерелевантное / внешнее / постороннее</li>
50 <li>нечто нерелевантное / внешнее / постороннее</li>
51 </ul><ul><li>Поддержка X браузеров на Y платформах - затратно</li>
51 </ul><ul><li>Поддержка X браузеров на Y платформах - затратно</li>
52 <li>Ведет к ловушке поддержки X×Y реализаций</li>
52 <li>Ведет к ловушке поддержки X×Y реализаций</li>
53 <li>Делайте ваши тесты как можно более<a>устойчивыми</a>=== тесты не будут сразу ломаться при любом изменении</li>
53 <li>Делайте ваши тесты как можно более<a>устойчивыми</a>=== тесты не будут сразу ломаться при любом изменении</li>
54 </ul><ul><li>Ориентируйтесь на перспективу конечного пользователя</li>
54 </ul><ul><li>Ориентируйтесь на перспективу конечного пользователя</li>
55 <li>Мыслите как пользователь</li>
55 <li>Мыслите как пользователь</li>
56 <li>Сосредоточьтесь на особенностях приложения, а не на его реализации<ul><li>Чего пытается достичь пользователь?</li>
56 <li>Сосредоточьтесь на особенностях приложения, а не на его реализации<ul><li>Чего пытается достичь пользователь?</li>
57 <li>Легко ли найти то, что он(а) ищет?</li>
57 <li>Легко ли найти то, что он(а) ищет?</li>
58 <li>Достигнет ли пользователь своей цели в несколько простых шагов?</li>
58 <li>Достигнет ли пользователь своей цели в несколько простых шагов?</li>
59 </ul></li>
59 </ul></li>
60 </ul><ul><li>Избегайте нагромождений селекторов</li>
60 </ul><ul><li>Избегайте нагромождений селекторов</li>
61 <li>Убедитесь, что у элемента есть стабильный селектор, который не изменится в следующей версии приложения</li>
61 <li>Убедитесь, что у элемента есть стабильный селектор, который не изменится в следующей версии приложения</li>
62 <li>Выбирайте элементы страницы с умом<ul><li>ID</li>
62 <li>Выбирайте элементы страницы с умом<ul><li>ID</li>
63 <li>CSS селекторы</li>
63 <li>CSS селекторы</li>
64 <li>data-аттрибуты</li>
64 <li>data-аттрибуты</li>
65 <li>Доступность (aria)</li>
65 <li>Доступность (aria)</li>
66 </ul></li>
66 </ul></li>
67 </ul><ul><li>Тесты не должны зависеть друг от друга</li>
67 </ul><ul><li>Тесты не должны зависеть друг от друга</li>
68 <li>Не игнорируйте неустойчивые тесты, которые возвращают разные результаты без каких-либо изменений в коде</li>
68 <li>Не игнорируйте неустойчивые тесты, которые возвращают разные результаты без каких-либо изменений в коде</li>
69 <li>Прогоняйте тесты еще раз, прежде чем заводить issue</li>
69 <li>Прогоняйте тесты еще раз, прежде чем заводить issue</li>
70 <li>Убедитесь, что у вас есть подходящие тестовые данные</li>
70 <li>Убедитесь, что у вас есть подходящие тестовые данные</li>
71 </ul><ul><li>Напишите отчет</li>
71 </ul><ul><li>Напишите отчет</li>
72 <li>Проведите<a>дымовое тестирование</a></li>
72 <li>Проведите<a>дымовое тестирование</a></li>
73 <li>Разработайте наборы тестов на согласованность</li>
73 <li>Разработайте наборы тестов на согласованность</li>
74 <li>Постройте хорошую организационную структуру</li>
74 <li>Постройте хорошую организационную структуру</li>
75 <li>Нашли баг? Напишите тест, а затем исправьте его</li>
75 <li>Нашли баг? Напишите тест, а затем исправьте его</li>
76 <li>Ждите, не спите</li>
76 <li>Ждите, не спите</li>
77 </ul><ul><li>Тест должен быть простым</li>
77 </ul><ul><li>Тест должен быть простым</li>
78 <li>Используйте CI / уведомления</li>
78 <li>Используйте CI / уведомления</li>
79 <li>Используйте линтеры, следуйте стилям кодирования и т.д.</li>
79 <li>Используйте линтеры, следуйте стилям кодирования и т.д.</li>
80 <li>eslint-plugin-jest может предупреждать, когда в тесте нет утверждения (assertion)</li>
80 <li>eslint-plugin-jest может предупреждать, когда в тесте нет утверждения (assertion)</li>
81 <li>Вы можете группировать тесты тегам вроде<em>#smoke</em></li>
81 <li>Вы можете группировать тесты тегам вроде<em>#smoke</em></li>
82 <li>Антипаттерн: Вы читаете отчет =&gt; просматриваете код</li>
82 <li>Антипаттерн: Вы читаете отчет =&gt; просматриваете код</li>
83 </ul><h2>Подмена бекенда</h2>
83 </ul><h2>Подмена бекенда</h2>
84 <h2>Mock Service Worker (msw)</h2>
84 <h2>Mock Service Worker (msw)</h2>
85 <ul><li>Передовой мок-API</li>
85 <ul><li>Передовой мок-API</li>
86 <li>Перехватывает запросы на сетевом уровне, а не на уровне приложений</li>
86 <li>Перехватывает запросы на сетевом уровне, а не на уровне приложений</li>
87 <li>Вы можете использовать axios, fetch, xhr, что угодно</li>
87 <li>Вы можете использовать axios, fetch, xhr, что угодно</li>
88 </ul><ul><li>Вы можете использовать его для разработки и отладки</li>
88 </ul><ul><li>Вы можете использовать его для разработки и отладки</li>
89 <li>Поддержка REST API и GraphQL</li>
89 <li>Поддержка REST API и GraphQL</li>
90 <li>Выполнение на стороне клиента</li>
90 <li>Выполнение на стороне клиента</li>
91 <li>Поддержка TypeScript</li>
91 <li>Поддержка TypeScript</li>
92 <li>Независимый от фреймворков</li>
92 <li>Независимый от фреймворков</li>
93 </ul><h2>Исправление ответов сервера</h2>
93 </ul><h2>Исправление ответов сервера</h2>
94 <h2>Page Object Pattern</h2>
94 <h2>Page Object Pattern</h2>
95 <ul><li>много тестов</li>
95 <ul><li>много тестов</li>
96 <li>много кода в тестах</li>
96 <li>много кода в тестах</li>
97 <li>сложно понимать структуру и флоу</li>
97 <li>сложно понимать структуру и флоу</li>
98 </ul><h2>Page objects</h2>
98 </ul><h2>Page objects</h2>
99 <ul><li>упрощение разработки</li>
99 <ul><li>упрощение разработки</li>
100 <li>упрощение поддержки</li>
100 <li>упрощение поддержки</li>
101 <li>Высокоуровневый API</li>
101 <li>Высокоуровневый API</li>
102 <li>DRY-принцип: создаем переиспользуемый код избегая повторов</li>
102 <li>DRY-принцип: создаем переиспользуемый код избегая повторов</li>
103 </ul><ul><li><p>page object - обертка над HTML страницей или ее частью</p>
103 </ul><ul><li><p>page object - обертка над HTML страницей или ее частью</p>
104 </li>
104 </li>
105 <li><p>Ее API специфично для конкретного приложения</p>
105 <li><p>Ее API специфично для конкретного приложения</p>
106 </li>
106 </li>
107 <li><p>Манипулируйте элементами страницы, не углубляясь в HTML</p>
107 <li><p>Манипулируйте элементами страницы, не углубляясь в HTML</p>
108 </li>
108 </li>
109 <li><p>findElementWithClass('album') =&gt; selectAlbumWithTitle()</p>
109 <li><p>findElementWithClass('album') =&gt; selectAlbumWithTitle()</p>
110 </li>
110 </li>
111 <li><p>findElementWithClass('rating').setText(5) =&gt; updateRating(5)</p>
111 <li><p>findElementWithClass('rating').setText(5) =&gt; updateRating(5)</p>
112 </li>
112 </li>
113 </ul><h2>Преимущества</h2>
113 </ul><h2>Преимущества</h2>
114 <ul><li>Если UI страницы изменится<ul><li>тесты изменять не надо</li>
114 <ul><li>Если UI страницы изменится<ul><li>тесты изменять не надо</li>
115 <li>нужно изменить код в page object</li>
115 <li>нужно изменить код в page object</li>
116 </ul></li>
116 </ul></li>
117 <li>Все изменения касающиеся поддержки этого нового UI находятся в одном месте</li>
117 <li>Все изменения касающиеся поддержки этого нового UI находятся в одном месте</li>
118 <li>Все доступные операции или сервисы на странице хранятся в одном месте вместо того, чтобы дублироваться во всех тестах</li>
118 <li>Все доступные операции или сервисы на странице хранятся в одном месте вместо того, чтобы дублироваться во всех тестах</li>
119 <li>Код тестов легче понять</li>
119 <li>Код тестов легче понять</li>
120 <li>Существует четкое разделение между кодом тестов и кодом, относящимся к html-странице, вроде селекторов и верстки</li>
120 <li>Существует четкое разделение между кодом тестов и кодом, относящимся к html-странице, вроде селекторов и верстки</li>
121 </ul><h2>Selenium</h2>
121 </ul><h2>Selenium</h2>
122 <h2>Правила</h2>
122 <h2>Правила</h2>
123 <ul><li>Сами page object никогда не должны ничего тестировать</li>
123 <ul><li>Сами page object никогда не должны ничего тестировать</li>
124 <li>Page object содержит представление страницы</li>
124 <li>Page object содержит представление страницы</li>
125 <li>Никакой код, связанный с тем, что тестируется, не должен находиться внутри объекта страницы</li>
125 <li>Никакой код, связанный с тем, что тестируется, не должен находиться внутри объекта страницы</li>
126 <li>Исключение: убедитесь, что страница отображена верно</li>
126 <li>Исключение: убедитесь, что страница отображена верно</li>
127 </ul><ul><li><p>Доступные методы представляют операции, возможные на страницы</p>
127 </ul><ul><li><p>Доступные методы представляют операции, возможные на страницы</p>
128 </li>
128 </li>
129 <li><p>Try not to expose the internals of the page</p>
129 <li><p>Try not to expose the internals of the page</p>
130 </li>
130 </li>
131 <li><p>Не создавайте объект для всей страницы, только значимые элементы</p>
131 <li><p>Не создавайте объект для всей страницы, только значимые элементы</p>
132 <ul><li>верхний и нижний колонтитулы, список пользователей, логин и т.Д</li>
132 <ul><li>верхний и нижний колонтитулы, список пользователей, логин и т.Д</li>
133 </ul></li>
133 </ul></li>
134 <li><p>Общедоступные методы представляют услуги, предлагаемые на странице</p>
134 <li><p>Общедоступные методы представляют услуги, предлагаемые на странице</p>
135 </li>
135 </li>
136 <li><p>Старайтесь не показывать внутренности страницы</p>
136 <li><p>Старайтесь не показывать внутренности страницы</p>
137 </li>
137 </li>
138 </ul><p>Если поведение должно отличаться</p>
138 </ul><p>Если поведение должно отличаться</p>
139 <p>Можно наследоваться</p>
139 <p>Можно наследоваться</p>
140 <h2>Минусы e2e</h2>
140 <h2>Минусы e2e</h2>
141 <ul><li>медленные</li>
141 <ul><li>медленные</li>
142 <li>нестабильные</li>
142 <li>нестабильные</li>
143 <li>непредсказуемое поведение</li>
143 <li>непредсказуемое поведение</li>
144 <li>изменение UI ломает тест</li>
144 <li>изменение UI ломает тест</li>
145 <li>нельзя посмотреть строчку где тест упал</li>
145 <li>нельзя посмотреть строчку где тест упал</li>
146 </ul>
146 </ul>