0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>22 июн 2023</li>
2
<ul><li>22 июн 2023</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><h2>Почему и как нужно адаптировать тест-кейсы перед автоматизацией тестирования</h2>
4
</ul><h2>Почему и как нужно адаптировать тест-кейсы перед автоматизацией тестирования</h2>
5
<p>Или как сохранить деньги, время и нервы, ускорив при этом выпуск новых фич.</p>
5
<p>Или как сохранить деньги, время и нервы, ускорив при этом выпуск новых фич.</p>
6
<p>Фото: Martin Barraud / Getty Images</p>
6
<p>Фото: Martin Barraud / Getty Images</p>
7
<p>Компании ежегодно увеличивают затраты на обслуживание IT-инфраструктуры и инвестируют в сотрудников. Что неудивительно: ведь ожидания потребителей от сервисов постоянно растут и все новинки нужно тщательно тестировать.</p>
7
<p>Компании ежегодно увеличивают затраты на обслуживание IT-инфраструктуры и инвестируют в сотрудников. Что неудивительно: ведь ожидания потребителей от сервисов постоянно растут и все новинки нужно тщательно тестировать.</p>
8
<p>И здесь на помощь приходит автоматизация, важную роль в которой играют тест-кейсы. Анастасия Леонтьева из SimbirSoft рассказала, как адаптировать их перед автоматизацией, и поделилась примером подготовленного кейса.</p>
8
<p>И здесь на помощь приходит автоматизация, важную роль в которой играют тест-кейсы. Анастасия Леонтьева из SimbirSoft рассказала, как адаптировать их перед автоматизацией, и поделилась примером подготовленного кейса.</p>
9
<p>Руководитель направления тестирования и обеспечения качества в <a>SimbirSoft</a>. Имеет степень MBA, Six Sigma Yellow Belt, опыт работы в IT более шести лет.</p>
9
<p>Руководитель направления тестирования и обеспечения качества в <a>SimbirSoft</a>. Имеет степень MBA, Six Sigma Yellow Belt, опыт работы в IT более шести лет.</p>
10
<p>Автоматизация тестирования может повысить скорость проверки качества продукта, что оборачивается для команды и бизнеса следующими выгодами:</p>
10
<p>Автоматизация тестирования может повысить скорость проверки качества продукта, что оборачивается для команды и бизнеса следующими выгодами:</p>
11
<ul><li><strong>Снижаются затраты на тестирование.</strong></li>
11
<ul><li><strong>Снижаются затраты на тестирование.</strong></li>
12
<li><strong>Снижается вероятность пропуска ошибки из-за человеческого фактора.</strong></li>
12
<li><strong>Снижается вероятность пропуска ошибки из-за человеческого фактора.</strong></li>
13
<li><strong>Увеличивается скорость доставки новых фич.</strong></li>
13
<li><strong>Увеличивается скорость доставки новых фич.</strong></li>
14
</ul><p>Согласно<a>исследованию practitest.com</a>, более 45% респондентов утверждают, что автоматизация снизила их затраты на тестирование в два раза. Эта статистика<a>подтверждается</a>и нашей практикой. Однако автоматизировать следует тест-кейсы только по той функциональности, в которой не планируется глобальных изменений. Иначе есть риск, наоборот, повысить затраты - так как придётся переписывать автотесты.</p>
14
</ul><p>Согласно<a>исследованию practitest.com</a>, более 45% респондентов утверждают, что автоматизация снизила их затраты на тестирование в два раза. Эта статистика<a>подтверждается</a>и нашей практикой. Однако автоматизировать следует тест-кейсы только по той функциональности, в которой не планируется глобальных изменений. Иначе есть риск, наоборот, повысить затраты - так как придётся переписывать автотесты.</p>
15
<p>Важно помнить, что автотесты запускаются на основе проведённых до этого ручных тестов с проверенными сценариями (чек-листы, пользовательские сценарии и так далее). На основе сценариев, покрытых кодом, в будущем можно будет проводить нагрузочное тестирование. Подробная и адаптивная тестовая документация позволит сократить время на погружение в задачу нового специалиста и увеличить эффективность тестирования в целом.</p>
15
<p>Важно помнить, что автотесты запускаются на основе проведённых до этого ручных тестов с проверенными сценариями (чек-листы, пользовательские сценарии и так далее). На основе сценариев, покрытых кодом, в будущем можно будет проводить нагрузочное тестирование. Подробная и адаптивная тестовая документация позволит сократить время на погружение в задачу нового специалиста и увеличить эффективность тестирования в целом.</p>
16
<p>Представим, что к действующему долгосрочному проекту подключается SDET‑специалист. До того как начнётся написание автотестов, у него могут возникнуть вопросы к QA-инженерам: про объём тестов для автоматизации, приоритеты выбора проверок, набор доступов и так далее.</p>
16
<p>Представим, что к действующему долгосрочному проекту подключается SDET‑специалист. До того как начнётся написание автотестов, у него могут возникнуть вопросы к QA-инженерам: про объём тестов для автоматизации, приоритеты выбора проверок, набор доступов и так далее.</p>
17
<p>При этом QA-инженер может не обладать навыками автоматизации и опытом проектирования<strong></strong>соответствующих тест-кейсов. Представления о построении качественных кейсов, адаптированных для автоматизации, в таком случае могут различаться.</p>
17
<p>При этом QA-инженер может не обладать навыками автоматизации и опытом проектирования<strong></strong>соответствующих тест-кейсов. Представления о построении качественных кейсов, адаптированных для автоматизации, в таком случае могут различаться.</p>
18
<p>Поэтому при подготовке тест-кейса для автоматизации важно проработать следующие моменты:</p>
18
<p>Поэтому при подготовке тест-кейса для автоматизации важно проработать следующие моменты:</p>
19
<p><strong>1.</strong>Последовательно, полно и понятно расписать тест-кейсы в рамках согласованной структуры. В этом случае новый специалист, только что пришедший в команду, без дополнительных вопросов сможет разобраться, какую именно функциональность необходимо проверить и каким образом.</p>
19
<p><strong>1.</strong>Последовательно, полно и понятно расписать тест-кейсы в рамках согласованной структуры. В этом случае новый специалист, только что пришедший в команду, без дополнительных вопросов сможет разобраться, какую именно функциональность необходимо проверить и каким образом.</p>
20
<p><strong>2.</strong>Подробно указывать путь "до места назначения": если нужно протестировать некую форму, важно расписать все шаги до её открытия. Часть описания можно вынести в предусловие.</p>
20
<p><strong>2.</strong>Подробно указывать путь "до места назначения": если нужно протестировать некую форму, важно расписать все шаги до её открытия. Часть описания можно вынести в предусловие.</p>
21
<p><strong>3.</strong>Рационально подходить к процессу передачи тест-кейсов под автоматизацию. Нужно чётко понимать, что можно реализовать, а что нет. Если же возникли вопросы, то лучше заранее проконсультироваться со SDET-специалистом.</p>
21
<p><strong>3.</strong>Рационально подходить к процессу передачи тест-кейсов под автоматизацию. Нужно чётко понимать, что можно реализовать, а что нет. Если же возникли вопросы, то лучше заранее проконсультироваться со SDET-специалистом.</p>
22
<em>Кадр: фильм "Звёздные войны: Эпизод 3 - Месть ситхов" / Lucasfilm Ltd.</em><p><strong>4.</strong>Включить в тест-кейс все необходимые данные. А именно: информацию об окружении, специфике тестирования на разных платформах, параметры настройки, а также необходимое время для применения в системе тех или иных настроек, если это требуется.</p>
22
<em>Кадр: фильм "Звёздные войны: Эпизод 3 - Месть ситхов" / Lucasfilm Ltd.</em><p><strong>4.</strong>Включить в тест-кейс все необходимые данные. А именно: информацию об окружении, специфике тестирования на разных платформах, параметры настройки, а также необходимое время для применения в системе тех или иных настроек, если это требуется.</p>
23
<p><strong>5.</strong>Если для выполнения кейса нужно определённое состояние системы или если кейс меняет его, напишите, как этого состояния достичь и что нужно сделать после проведения теста. Например, если производятся манипуляции над сущностью, должно быть понятно, где эту сущность взять и как потом вернуть на место, чтобы соблюсти идемпотентность.</p>
23
<p><strong>5.</strong>Если для выполнения кейса нужно определённое состояние системы или если кейс меняет его, напишите, как этого состояния достичь и что нужно сделать после проведения теста. Например, если производятся манипуляции над сущностью, должно быть понятно, где эту сущность взять и как потом вернуть на место, чтобы соблюсти идемпотентность.</p>
24
<p><strong>6</strong>. Обращать внимание на тестовые данные. Если, например, требуется авторизация и учётные записи имеют разные уровни доступа, обязательно нужно прикрепить информацию о необходимом уровне доступа или сразу указать данные учёток, в которых уже есть необходимые сведения (документы, поля и прочее).</p>
24
<p><strong>6</strong>. Обращать внимание на тестовые данные. Если, например, требуется авторизация и учётные записи имеют разные уровни доступа, обязательно нужно прикрепить информацию о необходимом уровне доступа или сразу указать данные учёток, в которых уже есть необходимые сведения (документы, поля и прочее).</p>
25
<p><strong>7.</strong>Отражать в кейсах тестовые сценарии использования системы. То есть последовательность запросов и ответов API, в которой заложен путь пользователя, а также чётко прописать ожидаемый результат.</p>
25
<p><strong>7.</strong>Отражать в кейсах тестовые сценарии использования системы. То есть последовательность запросов и ответов API, в которой заложен путь пользователя, а также чётко прописать ожидаемый результат.</p>
26
<p><strong>8.</strong>Подробно расписать ожидаемый результат. Он должен быть точным и окончательным: один кейс - один результат. В этом поможет подробное описание и хорошие тестовые данные. Если возможен другой результат (сразу несколько изменений системы), необходимо вынести его в другой кейс. В ожидаемом результате важно точно указать, к чему привязаться автоматизатору, например к названию страницы или названию формы/кнопки.</p>
26
<p><strong>8.</strong>Подробно расписать ожидаемый результат. Он должен быть точным и окончательным: один кейс - один результат. В этом поможет подробное описание и хорошие тестовые данные. Если возможен другой результат (сразу несколько изменений системы), необходимо вынести его в другой кейс. В ожидаемом результате важно точно указать, к чему привязаться автоматизатору, например к названию страницы или названию формы/кнопки.</p>
27
<p><strong>9.</strong>Если рассматривать мобильную UI-автоматизацию, в тест-кейсе нужно включить моки и скриншоты для snapshot-тестов.</p>
27
<p><strong>9.</strong>Если рассматривать мобильную UI-автоматизацию, в тест-кейсе нужно включить моки и скриншоты для snapshot-тестов.</p>
28
<p>1<strong>0.</strong>Чётко обозначить в тест-кейсе приоритетные проверки, критичные для корректной и стабильной работы системы.</p>
28
<p>1<strong>0.</strong>Чётко обозначить в тест-кейсе приоритетные проверки, критичные для корректной и стабильной работы системы.</p>
29
<p>Лишние действия, уточнения и разногласия специалистов, участвующих в тестировании одной фичи (или смежных, взаимозависимых), как правило, приводят к потере времени. В дальнейшем это может отразиться на сроках релиза.</p>
29
<p>Лишние действия, уточнения и разногласия специалистов, участвующих в тестировании одной фичи (или смежных, взаимозависимых), как правило, приводят к потере времени. В дальнейшем это может отразиться на сроках релиза.</p>
30
<p>Чтобы прийти к совместному решению, необходимо определить правила взаимодействия, зафиксировать их и продемонстрировать команде.</p>
30
<p>Чтобы прийти к совместному решению, необходимо определить правила взаимодействия, зафиксировать их и продемонстрировать команде.</p>
31
<p>Давайте на примере разберём, как можно улучшить кейсы под автоматизацию. Возьмём интернет-магазин, у которого есть API для совершения CRUD-операций с карточкой товара:</p>
31
<p>Давайте на примере разберём, как можно улучшить кейсы под автоматизацию. Возьмём интернет-магазин, у которого есть API для совершения CRUD-операций с карточкой товара:</p>
32
<ul><li>Создание.</li>
32
<ul><li>Создание.</li>
33
<li>Просмотр.</li>
33
<li>Просмотр.</li>
34
<li>Редактирование.</li>
34
<li>Редактирование.</li>
35
<li>Удаление.</li>
35
<li>Удаление.</li>
36
</ul><p>Мы будем использовать открытый API<a>shop.bugred.ru</a>. Предварительно в нём необходимо будет авторизоваться. Это можно вынести в предусловие, так как оно не требует описания шагов или тела запроса, а лишь указывает на необходимость того или иного действия перед выполнением шагов. Ссылку на документацию, а также доступы можно найти на главной странице.</p>
36
</ul><p>Мы будем использовать открытый API<a>shop.bugred.ru</a>. Предварительно в нём необходимо будет авторизоваться. Это можно вынести в предусловие, так как оно не требует описания шагов или тела запроса, а лишь указывает на необходимость того или иного действия перед выполнением шагов. Ссылку на документацию, а также доступы можно найти на главной странице.</p>
37
<p>Несколько допущений в рамках нашего тест-кейса:</p>
37
<p>Несколько допущений в рамках нашего тест-кейса:</p>
38
<ul><li>Мы будем рассматривать только взаимодействие через API.</li>
38
<ul><li>Мы будем рассматривать только взаимодействие через API.</li>
39
<li>В базу данных вынесены настройки, позволяющие включать или отключать возможность создания товара пользователем.</li>
39
<li>В базу данных вынесены настройки, позволяющие включать или отключать возможность создания товара пользователем.</li>
40
<li>В системе может быть несколько тестовых сред со своей базой данных.</li>
40
<li>В системе может быть несколько тестовых сред со своей базой данных.</li>
41
</ul><p>А вот, собственно, и сценарий: пользователь (например, менеджер) заходит в административную панель магазина, создаёт товар, обновляет информацию о нём (правит цвет, размер и так далее), проверяет, что данные изменились, и потом удаляет товар.</p>
41
</ul><p>А вот, собственно, и сценарий: пользователь (например, менеджер) заходит в административную панель магазина, создаёт товар, обновляет информацию о нём (правит цвет, размер и так далее), проверяет, что данные изменились, и потом удаляет товар.</p>
42
<p><strong>Наименование:</strong>"Проверка удаления созданного товара".</p>
42
<p><strong>Наименование:</strong>"Проверка удаления созданного товара".</p>
43
<p><strong>Предусловия теста:</strong></p>
43
<p><strong>Предусловия теста:</strong></p>
44
<ul><li>Пользователь авторизован.</li>
44
<ul><li>Пользователь авторизован.</li>
45
<li>Значение ITEMS_CREATE.ENABLE равняется true</li>
45
<li>Значение ITEMS_CREATE.ENABLE равняется true</li>
46
</ul><strong>Шаги</strong><strong>Ожидаемый результат</strong>1.Создать товар в магазине<p>{</p>
46
</ul><strong>Шаги</strong><strong>Ожидаемый результат</strong>1.Создать товар в магазине<p>{</p>
47
<p>"name": "Шортики",</p>
47
<p>"name": "Шортики",</p>
48
<p>"section": "Платья",</p>
48
<p>"section": "Платья",</p>
49
<p>"description": "Модное платье из новой коллекции!",</p>
49
<p>"description": "Модное платье из новой коллекции!",</p>
50
<p>"color": "RED",</p>
50
<p>"color": "RED",</p>
51
<p>"size": 44,</p>
51
<p>"size": 44,</p>
52
<p>"price": 666,</p>
52
<p>"price": 666,</p>
53
<p>"params": "dress"</p>
53
<p>"params": "dress"</p>
54
<p>}</p>
54
<p>}</p>
55
Товар создан. Получить код<strong>200</strong><p>{</p>
55
Товар создан. Получить код<strong>200</strong><p>{</p>
56
<p>"method": "/items/create",</p>
56
<p>"method": "/items/create",</p>
57
<p>"status": "ok",</p>
57
<p>"status": "ok",</p>
58
<p>"result": {</p>
58
<p>"result": {</p>
59
<p>"id": "76",</p>
59
<p>"id": "76",</p>
60
<p>"name": "Шортики",</p>
60
<p>"name": "Шортики",</p>
61
<p>"section": "Платья",</p>
61
<p>"section": "Платья",</p>
62
<p>"description": "Модное платье из новой коллекции!",</p>
62
<p>"description": "Модное платье из новой коллекции!",</p>
63
<p>"color": "RED",</p>
63
<p>"color": "RED",</p>
64
<p>"price": 666,</p>
64
<p>"price": 666,</p>
65
<p>"params": "dress"</p>
65
<p>"params": "dress"</p>
66
<p>}</p>
66
<p>}</p>
67
<p>}</p>
67
<p>}</p>
68
2. Обновить созданный товар<p><request></p>
68
2. Обновить созданный товар<p><request></p>
69
<p>76</p>
69
<p>76</p>
70
<p><name>Шортики</name></p>
70
<p><name>Шортики</name></p>
71
<p>Платья</p>
71
<p>Платья</p>
72
<p><description>Модное красное платье</description></p>
72
<p><description>Модное красное платье</description></p>
73
<p>48</p>
73
<p>48</p>
74
<p>RED</p>
74
<p>RED</p>
75
<p>678</p>
75
<p>678</p>
76
<p>dress</p>
76
<p>dress</p>
77
<p></request></p>
77
<p></request></p>
78
Товар обновлён. Получить код<strong>200</strong><p>{</p>
78
Товар обновлён. Получить код<strong>200</strong><p>{</p>
79
<p>"method": "/items/update",</p>
79
<p>"method": "/items/update",</p>
80
<p>"status": "ok",</p>
80
<p>"status": "ok",</p>
81
<p>"result": "Товар обновлён!"</p>
81
<p>"result": "Товар обновлён!"</p>
82
<p>}</p>
82
<p>}</p>
83
3. Получить данные о товаре<p>{</p>
83
3. Получить данные о товаре<p>{</p>
84
<p>"id": 76</p>
84
<p>"id": 76</p>
85
<p>}"</p>
85
<p>}"</p>
86
Товар найден. Получить код<strong>200</strong><p>{</p>
86
Товар найден. Получить код<strong>200</strong><p>{</p>
87
<p>"method": "/items/update",</p>
87
<p>"method": "/items/update",</p>
88
<p>"status": "ok",</p>
88
<p>"status": "ok",</p>
89
<p>"result": {</p>
89
<p>"result": {</p>
90
<p>"id": "76",</p>
90
<p>"id": "76",</p>
91
<p>"name": "Шортики",</p>
91
<p>"name": "Шортики",</p>
92
<p>"section": "Платья",</p>
92
<p>"section": "Платья",</p>
93
<p>"description": "Модное платье",</p>
93
<p>"description": "Модное платье",</p>
94
<p>"color": "RED",</p>
94
<p>"color": "RED",</p>
95
<p>"size": "48",</p>
95
<p>"size": "48",</p>
96
<p>"price": 666,</p>
96
<p>"price": 666,</p>
97
<p>"params": " ",</p>
97
<p>"params": " ",</p>
98
<p>"photo": "http://shop.bugred.ruhttps://via.place.com/300x300"</p>
98
<p>"photo": "http://shop.bugred.ruhttps://via.place.com/300x300"</p>
99
<p>}</p>
99
<p>}</p>
100
<p>}</p>
100
<p>}</p>
101
4. Удалить товар из БД DELETE FROM items WHERE items.id = 76Запись удалена<p>Теперь скорректируем наш кейс, учитывая вышеописанные рекомендации.</p>
101
4. Удалить товар из БД DELETE FROM items WHERE items.id = 76Запись удалена<p>Теперь скорректируем наш кейс, учитывая вышеописанные рекомендации.</p>
102
<p><strong>Наименование:</strong>"Проверка удаления созданного товара".</p>
102
<p><strong>Наименование:</strong>"Проверка удаления созданного товара".</p>
103
<strong>Предусловия</strong><strong>Ожидаемый результат</strong>1. Тестовые базы:<p>БД Preprod: preprod.shop_bugred_r_db</p>
103
<strong>Предусловия</strong><strong>Ожидаемый результат</strong>1. Тестовые базы:<p>БД Preprod: preprod.shop_bugred_r_db</p>
104
<p>БД Test: test.shop_bugred_r_db</p>
104
<p>БД Test: test.shop_bugred_r_db</p>
105
<p>Выполнить SQL-запрос:</p>
105
<p>Выполнить SQL-запрос:</p>
106
<p>UPDATE<strong>{БД}</strong>.SETTINGS_CUSTOMIZE SET ITEMS_CREATE.ENABLE=true</p>
106
<p>UPDATE<strong>{БД}</strong>.SETTINGS_CUSTOMIZE SET ITEMS_CREATE.ENABLE=true</p>
107
<p>Время переключения настроек: от 10 минут</p>
107
<p>Время переключения настроек: от 10 минут</p>
108
В таблице<strong>{БД}</strong>.SETTINGS_CUSTOMIZE обновилось значение ITEMS_CREATE.ENABLE2. Подготовить<strong>тестового клиента</strong><p>БД Preprod: preprod.shop_bugred_r_db</p>
108
В таблице<strong>{БД}</strong>.SETTINGS_CUSTOMIZE обновилось значение ITEMS_CREATE.ENABLE2. Подготовить<strong>тестового клиента</strong><p>БД Preprod: preprod.shop_bugred_r_db</p>
109
<p>БД Test: test.shop_bugred_r_db</p>
109
<p>БД Test: test.shop_bugred_r_db</p>
110
<p>В таблице<strong>{БД}</strong>.items.user найти запись не удалённого пользователя c помощью запроса SQL:SELECT method ,sessionId FROM<strong>{БД}</strong>.users WHERE user.remote <>true</p>
110
<p>В таблице<strong>{БД}</strong>.items.user найти запись не удалённого пользователя c помощью запроса SQL:SELECT method ,sessionId FROM<strong>{БД}</strong>.users WHERE user.remote <>true</p>
111
Запись найдена. Значение<strong>method</strong>записать в переменную<strong>{{method}}</strong>,<p>значение<strong>sessionId</strong>записать в переменную<strong>{{sessionId}}</strong></p>
111
Запись найдена. Значение<strong>method</strong>записать в переменную<strong>{{method}}</strong>,<p>значение<strong>sessionId</strong>записать в переменную<strong>{{sessionId}}</strong></p>
112
3. Получить<strong>токен</strong>выполнив метод GET api/v1.0/shop/test/auth/token<p>В параметрах указать:</p>
112
3. Получить<strong>токен</strong>выполнив метод GET api/v1.0/shop/test/auth/token<p>В параметрах указать:</p>
113
<p>method =<strong>{{method}}</strong>,sessionId =<strong>{{sessionId}}</strong></p>
113
<p>method =<strong>{{method}}</strong>,sessionId =<strong>{{sessionId}}</strong></p>
114
Получить код<strong>200</strong>и<strong>Body</strong>:<p>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG</p>
114
Получить код<strong>200</strong>и<strong>Body</strong>:<p>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG</p>
115
<p>Получить из ответа одну переменную:<strong>{{Token}}</strong></p>
115
<p>Получить из ответа одну переменную:<strong>{{Token}}</strong></p>
116
<strong>Шаги</strong><strong>Ожидаемый результат</strong>1. Выполнить POST-запрос http://shop.bugred.ru/api/items/create/ c параметрами:<p>Header:Content-Type:application/json</p>
116
<strong>Шаги</strong><strong>Ожидаемый результат</strong>1. Выполнить POST-запрос http://shop.bugred.ru/api/items/create/ c параметрами:<p>Header:Content-Type:application/json</p>
117
<p><strong>Authorization</strong>: Bearer<strong>{{Token}}</strong></p>
117
<p><strong>Authorization</strong>: Bearer<strong>{{Token}}</strong></p>
118
<p>Передать тело запроса:</p>
118
<p>Передать тело запроса:</p>
119
<p>{</p>
119
<p>{</p>
120
<p>"name": "Шортики",</p>
120
<p>"name": "Шортики",</p>
121
<p>"section": "Платья",</p>
121
<p>"section": "Платья",</p>
122
<p>"description":"Модное платье из новой коллекции!",</p>
122
<p>"description":"Модное платье из новой коллекции!",</p>
123
<p>"color":"RED",</p>
123
<p>"color":"RED",</p>
124
<p>"size": 44,</p>
124
<p>"size": 44,</p>
125
<p>"price": 666,</p>
125
<p>"price": 666,</p>
126
<p>"params":"dress"</p>
126
<p>"params":"dress"</p>
127
<p>}</p>
127
<p>}</p>
128
Товар создан. Получить код<strong>200</strong>и тело ответа:<p>{</p>
128
Товар создан. Получить код<strong>200</strong>и тело ответа:<p>{</p>
129
<p>"method": "/items/create",</p>
129
<p>"method": "/items/create",</p>
130
<p>"status": "ok",</p>
130
<p>"status": "ok",</p>
131
<p>"result": {</p>
131
<p>"result": {</p>
132
<p>"id": "76",</p>
132
<p>"id": "76",</p>
133
<p>"name": "Шортики",</p>
133
<p>"name": "Шортики",</p>
134
<p>"section": "Платья",</p>
134
<p>"section": "Платья",</p>
135
<p>"description": "Модное платье из новой коллекции!",</p>
135
<p>"description": "Модное платье из новой коллекции!",</p>
136
<p>"color": "RED",</p>
136
<p>"color": "RED",</p>
137
<p>"price": 666,</p>
137
<p>"price": 666,</p>
138
<p>"params": "dress"</p>
138
<p>"params": "dress"</p>
139
<p>}</p>
139
<p>}</p>
140
<p>}</p>
140
<p>}</p>
141
<p>Проверить, что выделенные поля присутствуют в ответе. Получить из ответа две переменные:<strong>{{id}}</strong>и<strong>{{name}}</strong></p>
141
<p>Проверить, что выделенные поля присутствуют в ответе. Получить из ответа две переменные:<strong>{{id}}</strong>и<strong>{{name}}</strong></p>
142
2. Выполнить POST-запрос http://shop.bugred.ru/api/items/update/ c параметрами:<p>Header:Content-Type:application/json</p>
142
2. Выполнить POST-запрос http://shop.bugred.ru/api/items/update/ c параметрами:<p>Header:Content-Type:application/json</p>
143
<p><strong>Authorization</strong>: Bearer<strong>{{Token}}</strong></p>
143
<p><strong>Authorization</strong>: Bearer<strong>{{Token}}</strong></p>
144
<p>Передать тело запроса:</p>
144
<p>Передать тело запроса:</p>
145
<p><request></p>
145
<p><request></p>
146
<p><id><strong>{{id}}</strong></id></p>
146
<p><id><strong>{{id}}</strong></id></p>
147
<p><name><strong>{{name}</strong>}</name></p>
147
<p><name><strong>{{name}</strong>}</name></p>
148
<p><section>Платья</section></p>
148
<p><section>Платья</section></p>
149
<p><description>Модное красное платье</description></p>
149
<p><description>Модное красное платье</description></p>
150
<p><size>48</size></p>
150
<p><size>48</size></p>
151
<p><color>RED</color></p>
151
<p><color>RED</color></p>
152
<p><price>678</price></p>
152
<p><price>678</price></p>
153
<p><params>dress</params></p>
153
<p><params>dress</params></p>
154
<p></request></p>
154
<p></request></p>
155
Товар обновлен. Получить код<strong>200</strong>и тело ответа:<p>{</p>
155
Товар обновлен. Получить код<strong>200</strong>и тело ответа:<p>{</p>
156
<p>"method": "/items/update",</p>
156
<p>"method": "/items/update",</p>
157
<p>"status": "ok",</p>
157
<p>"status": "ok",</p>
158
<p>"result": "Товар обновлён!"</p>
158
<p>"result": "Товар обновлён!"</p>
159
<p>}</p>
159
<p>}</p>
160
<p>Проверить значение выделенных полей</p>
160
<p>Проверить значение выделенных полей</p>
161
3. Выполнить запрос POST http://shop.bugred.ru/api/items/update/ c параметрами:<p>Header:Content-Type:application/json</p>
161
3. Выполнить запрос POST http://shop.bugred.ru/api/items/update/ c параметрами:<p>Header:Content-Type:application/json</p>
162
<p><strong>Authorization</strong>: Bearer<strong>{{Token}}</strong></p>
162
<p><strong>Authorization</strong>: Bearer<strong>{{Token}}</strong></p>
163
<p>Передать тело запроса:</p>
163
<p>Передать тело запроса:</p>
164
<p>{</p>
164
<p>{</p>
165
<p>"id":<strong>{{id}}</strong></p>
165
<p>"id":<strong>{{id}}</strong></p>
166
<p>}</p>
166
<p>}</p>
167
Товар найден. Получить код<strong>200</strong>и тело ответа:<p>{</p>
167
Товар найден. Получить код<strong>200</strong>и тело ответа:<p>{</p>
168
<p>"method": "/items/update",</p>
168
<p>"method": "/items/update",</p>
169
<p>"status": "ok",</p>
169
<p>"status": "ok",</p>
170
<p>"result": {</p>
170
<p>"result": {</p>
171
<p>"id": "76"</p>
171
<p>"id": "76"</p>
172
<p>"name": "Шортики",</p>
172
<p>"name": "Шортики",</p>
173
<p>"section": "Платья",</p>
173
<p>"section": "Платья",</p>
174
<p>"description": "Модное платье",</p>
174
<p>"description": "Модное платье",</p>
175
<p>"color": "RED",</p>
175
<p>"color": "RED",</p>
176
<p>"size": "48",</p>
176
<p>"size": "48",</p>
177
<p>"price": 666,</p>
177
<p>"price": 666,</p>
178
<p>"params": " ",</p>
178
<p>"params": " ",</p>
179
<p>"photo": "http://shop.bugred.ruhttps://via.placeholder.com/300x300"</p>
179
<p>"photo": "http://shop.bugred.ruhttps://via.placeholder.com/300x300"</p>
180
<p>}</p>
180
<p>}</p>
181
<p>}</p>
181
<p>}</p>
182
<p>Проверить<strong>значение выделенных полей</strong>(пояснить, что за значение ожидается)</p>
182
<p>Проверить<strong>значение выделенных полей</strong>(пояснить, что за значение ожидается)</p>
183
4. Выполнить SQL-запрос:DELETE FROM items WHERE items.id =<strong>{{id}}</strong>Товар удалён<strong>Постусловия</strong><strong>Ожидаемый результат</strong>Вернуть<strong>первоначальные</strong>настройки в БД. Выполнить SQL-запрос:<p>UPDATE {БД}.SETTINGS_CUSTOMIZE SET ITEMS_CREATE.ENABLE=false</p>
183
4. Выполнить SQL-запрос:DELETE FROM items WHERE items.id =<strong>{{id}}</strong>Товар удалён<strong>Постусловия</strong><strong>Ожидаемый результат</strong>Вернуть<strong>первоначальные</strong>настройки в БД. Выполнить SQL-запрос:<p>UPDATE {БД}.SETTINGS_CUSTOMIZE SET ITEMS_CREATE.ENABLE=false</p>
184
В таблице<strong>{БД}</strong>.SETTINGS_CUSTOMIZE обновилось значение ITEMS_CREATE.ENABLE<p>После правок тест-кейс стал выглядеть более продуманным, понятным, структурированным. В нём учтены ожидания SDET-специалиста, которые до этого требовали бы излишней коммуникации между ним и QA. Если в инструментах хранения тестовой документации добавить теги, приоритетность и статус (например, требует корректировки, ожидает автоматизации, автоматизирован и так далее), это также сократит количество вопросов к QA-специалисту.</p>
184
В таблице<strong>{БД}</strong>.SETTINGS_CUSTOMIZE обновилось значение ITEMS_CREATE.ENABLE<p>После правок тест-кейс стал выглядеть более продуманным, понятным, структурированным. В нём учтены ожидания SDET-специалиста, которые до этого требовали бы излишней коммуникации между ним и QA. Если в инструментах хранения тестовой документации добавить теги, приоритетность и статус (например, требует корректировки, ожидает автоматизации, автоматизирован и так далее), это также сократит количество вопросов к QA-специалисту.</p>
185
<p>Проверки после каждого шага уместно использовать только при автоматизации длинных пользовательских Е2Е-сценариев, когда в один тест приходится вмещать большое количество проверок. Иначе проверки будут дублироваться, что приведёт к увеличению времени прохождения автотеста.</p>
185
<p>Проверки после каждого шага уместно использовать только при автоматизации длинных пользовательских Е2Е-сценариев, когда в один тест приходится вмещать большое количество проверок. Иначе проверки будут дублироваться, что приведёт к увеличению времени прохождения автотеста.</p>
186
<p>Каждый запрос к API или БД, скорее всего, будет написан и представлен в коде проекта автотестов как отдельный метод с передаваемыми в него параметрами. Этот метод будет использоваться в кейсах. Тело запроса будет описано всего в одном месте, благодаря чему очень удобно вносить правки в код.</p>
186
<p>Каждый запрос к API или БД, скорее всего, будет написан и представлен в коде проекта автотестов как отдельный метод с передаваемыми в него параметрами. Этот метод будет использоваться в кейсах. Тело запроса будет описано всего в одном месте, благодаря чему очень удобно вносить правки в код.</p>
187
<p>Такая же логика действует и в ручных кейсах. Если мы напишем 20 кейсов, в каждом из которых будем создавать товар и полностью описывать API-запрос, то вносить правки нужно будет в 20 кейсах. Куда удобнее сделать один кейс для создания записи, где будет описан соответствующий API-запрос, а в остальных - просто ссылаться на этот кейс. Таким образом, поддерживать ручные кейсы тоже будет просто.</p>
187
<p>Такая же логика действует и в ручных кейсах. Если мы напишем 20 кейсов, в каждом из которых будем создавать товар и полностью описывать API-запрос, то вносить правки нужно будет в 20 кейсах. Куда удобнее сделать один кейс для создания записи, где будет описан соответствующий API-запрос, а в остальных - просто ссылаться на этот кейс. Таким образом, поддерживать ручные кейсы тоже будет просто.</p>
188
<p>В рамках написания автотеста можно придерживаться правила: автотест должен сам создать себе необходимые тестовые данные.</p>
188
<p>В рамках написания автотеста можно придерживаться правила: автотест должен сам создать себе необходимые тестовые данные.</p>
189
<p><strong>Пример.</strong>Допустим, в рамках теста нужно создать "маршрут", а в него добавить "автобус" из тех, что уже заведены в системе. Здесь предлагаю сначала создать "автобус", чтобы при создании "маршрута" выбрать его из списка. В этом случае создание "автобуса" как предусловие в тест-кейсах не описывается, поскольку автотест каждый раз будет сам готовить себе тестовую среду, создавая "автобус". А значит, даже на чистой базе данных без созданных "автобусов" будет отрабатывать корректно.</p>
189
<p><strong>Пример.</strong>Допустим, в рамках теста нужно создать "маршрут", а в него добавить "автобус" из тех, что уже заведены в системе. Здесь предлагаю сначала создать "автобус", чтобы при создании "маршрута" выбрать его из списка. В этом случае создание "автобуса" как предусловие в тест-кейсах не описывается, поскольку автотест каждый раз будет сам готовить себе тестовую среду, создавая "автобус". А значит, даже на чистой базе данных без созданных "автобусов" будет отрабатывать корректно.</p>
190
<p>И последнее наблюдение. Явно указывать значения полей в тест-кейсе, с одной стороны, очень удобно: это сокращает время на разработку и снижает риск пропуска ошибки. С другой стороны, это может привести к <strong>эффекту пестицида</strong> - когда ошибки в тестовых сценариях, при регулярном их выполнении, перестают находиться. Исходя из нашей практики, можно не указывать конкретные значения полей, при этом кратко указав допустимые. Что касается автотестов, то в вышеприведённом примере как минимум поля name и description будут генерироваться автотестом, указанные значения не будут использоваться постоянно.</p>
190
<p>И последнее наблюдение. Явно указывать значения полей в тест-кейсе, с одной стороны, очень удобно: это сокращает время на разработку и снижает риск пропуска ошибки. С другой стороны, это может привести к <strong>эффекту пестицида</strong> - когда ошибки в тестовых сценариях, при регулярном их выполнении, перестают находиться. Исходя из нашей практики, можно не указывать конкретные значения полей, при этом кратко указав допустимые. Что касается автотестов, то в вышеприведённом примере как минимум поля name и description будут генерироваться автотестом, указанные значения не будут использоваться постоянно.</p>
191
<p><strong>Лайфхак:</strong><em>на автоматизацию можно передать коллекции, которые QA-инженер написал сам, например, в Postman. Но перед этим важно создать кейс с шагами, условиями, настройками и приложить коллекцию.</em></p>
191
<p><strong>Лайфхак:</strong><em>на автоматизацию можно передать коллекции, которые QA-инженер написал сам, например, в Postman. Но перед этим важно создать кейс с шагами, условиями, настройками и приложить коллекцию.</em></p>
192
<em>Кадр: сериал "Парки и зоны отдыха" / NBC</em><p>У адаптации тест-кейсов под автоматизацию есть ряд преимуществ:</p>
192
<em>Кадр: сериал "Парки и зоны отдыха" / NBC</em><p>У адаптации тест-кейсов под автоматизацию есть ряд преимуществ:</p>
193
<ul><li>На автоматизацию SDET-специалисту попадают более читабельные кейсы, в которых обозначена цель проверки, информация об окружении, настройках, тестовых данных и прочее. Это экономит время разработчиков на написание кода.</li>
193
<ul><li>На автоматизацию SDET-специалисту попадают более читабельные кейсы, в которых обозначена цель проверки, информация об окружении, настройках, тестовых данных и прочее. Это экономит время разработчиков на написание кода.</li>
194
<li>В процессе адаптации QA-инженер обновляет версии кейсов и поддерживает их в актуальном состоянии.</li>
194
<li>В процессе адаптации QA-инженер обновляет версии кейсов и поддерживает их в актуальном состоянии.</li>
195
<li>Специалистам нужно меньше времени на коммуникацию.</li>
195
<li>Специалистам нужно меньше времени на коммуникацию.</li>
196
<li>Повышение качества тестирования и производительности команды, благодаря единому взгляду QA и SDET на процесс выстраивания автоматизации на основе тестовых сценариев.</li>
196
<li>Повышение качества тестирования и производительности команды, благодаря единому взгляду QA и SDET на процесс выстраивания автоматизации на основе тестовых сценариев.</li>
197
</ul><p>В этой статье мы поделились собственными рекомендациями и наблюдениями по адаптации тест-кейсов под автоматизацию. Надеемся, наш опыт был вам полезен.</p>
197
</ul><p>В этой статье мы поделились собственными рекомендациями и наблюдениями по адаптации тест-кейсов под автоматизацию. Надеемся, наш опыт был вам полезен.</p>
198
<p>Оптимизировать затраты на IT-разработку можно и <a>другими способами</a>, например с помощью аудита и услуг на аутсорсе. Но это - тема для новой статьи.</p>
198
<p>Оптимизировать затраты на IT-разработку можно и <a>другими способами</a>, например с помощью аудита и услуг на аутсорсе. Но это - тема для новой статьи.</p>
199
<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>
199
<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>