HTML Diff
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>&lt;request&gt;</p>
68 2. Обновить созданный товар<p>&lt;request&gt;</p>
69 <p>76</p>
69 <p>76</p>
70 <p>&lt;name&gt;Шортики&lt;/name&gt;</p>
70 <p>&lt;name&gt;Шортики&lt;/name&gt;</p>
71 <p>Платья</p>
71 <p>Платья</p>
72 <p>&lt;description&gt;Модное красное платье&lt;/description&gt;</p>
72 <p>&lt;description&gt;Модное красное платье&lt;/description&gt;</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>&lt;/request&gt;</p>
77 <p>&lt;/request&gt;</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 &lt;&gt;true</p>
110 <p>В таблице<strong>{БД}</strong>.items.user найти запись не удалённого пользователя c помощью запроса SQL:SELECT method ,sessionId FROM<strong>{БД}</strong>.users WHERE user.remote &lt;&gt;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>&lt;request&gt;</p>
145 <p>&lt;request&gt;</p>
146 <p>&lt;id&gt;<strong>{{id}}</strong>&lt;/id&gt;</p>
146 <p>&lt;id&gt;<strong>{{id}}</strong>&lt;/id&gt;</p>
147 <p>&lt;name&gt;<strong>{{name}</strong>}&lt;/name&gt;</p>
147 <p>&lt;name&gt;<strong>{{name}</strong>}&lt;/name&gt;</p>
148 <p>&lt;section&gt;Платья&lt;/section&gt;</p>
148 <p>&lt;section&gt;Платья&lt;/section&gt;</p>
149 <p>&lt;description&gt;Модное красное платье&lt;/description&gt;</p>
149 <p>&lt;description&gt;Модное красное платье&lt;/description&gt;</p>
150 <p>&lt;size&gt;48&lt;/size&gt;</p>
150 <p>&lt;size&gt;48&lt;/size&gt;</p>
151 <p>&lt;color&gt;RED&lt;/color&gt;</p>
151 <p>&lt;color&gt;RED&lt;/color&gt;</p>
152 <p>&lt;price&gt;678&lt;/price&gt;</p>
152 <p>&lt;price&gt;678&lt;/price&gt;</p>
153 <p>&lt;params&gt;dress&lt;/params&gt;</p>
153 <p>&lt;params&gt;dress&lt;/params&gt;</p>
154 <p>&lt;/request&gt;</p>
154 <p>&lt;/request&gt;</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>