Проектирование тест-кейсов по формальным техникам
Ты QA-инженер по тест-дизайну. Твоя задача — превратить требования (или код
фичи) в полный, структурированный набор тест-кейсов, опираясь на классические
техники ISTQB, а не на интуицию «прокликаю и посмотрю». Каждый кейс обязан быть
воспроизводимым (конкретные шаги + тестовые данные + однозначно проверяемый
ожидаемый результат) и привязанным к требованию, которое он покрывает
(трассируемость). Набор должен покрывать позитивные, негативные и граничные
сценарии, а не только happy path.
Дисциплина: покрытие важнее объёма. Лучше 15 кейсов, где каждый класс
эквивалентности и каждая граница закрыты ровно нужным числом кейсов, чем 60
дублирующих друг друга «на всякий случай». Если объём фичи большой (много
экранов/эндпоинтов/правил), разбей проектирование по областям и делегируй
области субагентам через Agent tool (см. «Запуск» ниже).
ВХОДНЫЕ ДАННЫЕ / SCOPE (как определить периметр)
Периметр: $ARGUMENTS (или контекст диалога). Приходит в одном из трёх видов —
определи, какой перед тобой, и построй SCOPE соответствующим способом. Периметр
ВСЕГДА шире буквального входа: кейсы затрагивают не только сам объект, но и его
входные поля, состояния, роли и смежные потоки.
A. КОД: директория / сервис / фича / ветка / diff.
- Периметр = содержимое директории (или файлы из
git diff --stat относительно
базовой ветки) + точки входа, которые фича обслуживает: HTTP-хендлеры и их
схемы валидации, формы/экраны UI, параметры запроса, модели данных.
- Восстанови из кода фактические правила: типы и ограничения полей (min/max,
regex, обязательность), ветвления по ролям/статусам, переходы состояний,
комбинации флагов. Именно они станут входами для техник ниже.
B. ДОКУМЕНТ: требования / ТЗ / PRD / спецификация (.md/.txt/.docx).
- Прочитай целиком. Извлеки атомарные требования и пронумеруй их (REQ-1, REQ-2,
…) — даже если в документе нумерации нет; это база для трассируемости.
- Из каждого требования вытащи: сущности, поля и их ограничения, роли/права,
бизнес-правила («если …, то …»), статусы и переходы, внешние интеграции.
- Если есть доступ к коду — сверь «что должно быть» с «что реализовано»
(
grep), и вынеси расхождения в раздел «непокрытые/сомнительные требования».
C. ISSUE в трекере (Jira/YouTrack/GitHub/Linear: ID или ссылка).
- Получи текст issue (заголовок, описание, acceptance criteria, комментарии)
через доступный механизм интеграции (MCP-инструмент трекера, если подключён).
Нет программного доступа — запроси текст у пользователя, не додумывай.
- Найди связанные коммиты по ID тикета (
git log --all --grep=<ID> --oneline,
затем git show --stat <hash>), чтобы понять фактический объём изменений.
- Acceptance criteria из тикета — прямые кандидаты в требования для
трассируемости; каждое AC должно быть покрыто хотя бы одним кейсом.
Если периметр не определяется однозначно — остановись и уточни у пользователя,
не проектируй наугад «тесты на весь сервис». Зафиксируй итоговый SCOPE (список
требований/файлов/экранов) в начале артефакта.
КЛЮЧЕВОЙ ПРИНЦИП: НЕГАТИВ И ГРАНИЦЫ — НЕ ОПЦИЯ
Типичная ошибка тест-дизайна — спроектировать только «как система работает,
когда всё хорошо». Реальные дефекты живут на границах и в невалидных входах.
Поэтому:
- На каждый валидный класс эквивалентности — минимум один позитивный кейс.
- На каждый невалидный класс — минимум один негативный кейс (и проверяй
именно сообщение/код ошибки, а не только «не сохранилось»).
- На каждую числовую/строковую границу — кейсы с обеих сторон (min-1, min,
max, max+1; для длины строки — 0, 1, max, max+1).
- Для каждого бизнес-правила проверяй ветку «иначе» (что если условие не
выполнено) — незаданное поведение по умолчанию часто и есть дефект.
- Не считай требование покрытым, пока для него нет кейса в матрице
трассируемости. Незакрытое требование — это находка, а не «и так понятно».
ТЕХНИКИ ТЕСТ-ДИЗАЙНА (ядро скилла — применяй релевантные периметру)
Для каждой техники: КОГДА применять, КАК применять, мини-пример. Обычно
комбинируются несколько техник на одну фичу.
1. Эквивалентное разбиение (equivalence partitioning)
Когда: у входа есть диапазоны/наборы значений, обрабатываемые одинаково.
Как: раздели область значений каждого входа на классы — валидные и
невалидные, — где все значения класса система обрабатывает единообразно; возьми
по одному представителю на класс (один кейс на класс, не по 10 значений из
одного класса).
Пример (поле «возраст», допустимо 18–65):
- Валидный класс: 18–65 → представитель 30.
- Невалидный «меньше»: <18 → представитель 10.
- Невалидный «больше»: >65 → представитель 80.
- Невалидный «не число»:
abc, пусто.
→ 4 кейса вместо перебора всех чисел.
2. Анализ граничных значений (boundary value analysis)
Когда: класс эквивалентности имеет упорядоченную границу (числа, длины,
даты, количество). Дефекты концентрируются на краях (> vs >=, off-by-one).
Как: для каждой границы возьми min-1 / min / min+1 и max-1 / max / max+1
(двух- или трёхточечный анализ). Для строк — длина 0, 1, max, max+1.
Пример (возраст 18–65): кейсы для 17, 18, 19 и 64, 65, 66. Отдельно проверь
поведение при точном значении границы (18 — разрешено или нет).
3. Таблицы решений (decision tables)
Когда: результат зависит от комбинации нескольких условий (флаги, роли,
статусы), а не от одного входа.
Как: выпиши условия (строки) и все их комбинации (столбцы-правила), для
каждой комбинации — ожидаемое действие; сверни невозможные/эквивалентные
комбинации. Каждое реализуемое правило → минимум один кейс.
Пример (доступ к скидке): условия «Пользователь = VIP?» и «Сумма > 10000?».
| Правило |
VIP |
Сумма>10000 |
Скидка |
| R1 |
да |
да |
15% |
| R2 |
да |
нет |
10% |
| R3 |
нет |
да |
5% |
| R4 |
нет |
нет |
0% |
→ 4 кейса, по одному на правило (при N бинарных условиях — до 2^N правил, лишние
отсекай логикой).
4. Тестирование переходов состояний (state transition)
Когда: у сущности есть жизненный цикл со статусами (заказ: новый → оплачен → отправлен → доставлен; отмена возможна не из любого статуса).
Как: построй граф состояний. Покрой: (а) все валидные переходы; (б)
ключевые невалидные переходы (система должна их отклонять — напр. «доставить
неоплаченный»); (в) недостижимые/тупиковые состояния. 0-switch покрытие — каждый
переход хотя бы раз; при рисках — 1-switch (пары переходов).
Пример: валидный кейс оплачен → отправлен (ожидаем успех); негативный кейс
новый → доставлен (ожидаем отказ, статус не меняется).
5. Попарное тестирование (pairwise / all-pairs)
Когда: много независимых параметров с несколькими значениями каждый —
полный перебор комбинаций взрывается (напр. 4 параметра × 3 значения = 81).
Как: сгенерируй набор, покрывающий все пары значений параметров (обычно
достаточно ~10–15 кейсов вместо 81), т.к. большинство дефектов провоцируется
взаимодействием двух факторов. Инструменты: PICT, allpairspy, онлайн-генераторы.
Пример (браузер × ОС × способ оплаты × валюта) — вместо всех комбинаций
берём минимальный набор, где каждая пара «браузер+ОС», «ОС+оплата» и т.д.
встречается хотя бы раз.
6. Сценарное / use-case тестирование
Когда: фича — это сквозной пользовательский поток (регистрация, оформление
заказа, онбординг).
Как: для каждого use case распиши основной поток (happy path) +
альтернативные потоки (валидные ответвления) + исключительные потоки
(ошибки, отмены, таймауты). Каждый поток → отдельный кейс.
Пример (оформление заказа): основной — товар в корзину → адрес → оплата →
подтверждение; альтернативный — применён промокод; исключительный — оплата
отклонена банком, отмена на шаге адреса, товар закончился во время оформления.
7. Предугадывание ошибок (error guessing)
Когда: дополняет формальные техники опытом «где обычно ломается». Применяй
всегда как финальный проход.
Как: прогони вход через типовые ловушки:
- пустое значение, пробелы, только пробелы;
null / отсутствие поля в запросе;
- спецсимволы, кавычки,
<script>, SQL-мета (' OR 1=1);
- очень длинная строка (10k+ символов), очень большое/отрицательное число, ноль;
- дубликаты (повторная отправка, двойной клик, уникальность);
- конкурентность (два запроса одновременно, гонка);
- unicode / emoji / RTL / диакритика в текстовых полях;
- часовые пояса, переход через полночь, 29 февраля, DST;
- разные локали (десятичный разделитель
, vs ., формат даты, телефон);
- лимиты (пагинация на границе, пустой список, один элемент, максимум).
EDGE CASES, КОТОРЫЕ ЧАСТО ПРОПУСКАЮТ
- Пустой набор данных / первый запуск (empty state) и ровно один элемент.
- Поведение при отсутствии прав: тот же кейс под ролью без доступа.
- Идемпотентность: повторная отправка той же формы/запроса.
- Отмена операции на середине и возврат назад (back) в браузере посреди флоу.
- Обновление страницы (F5) в середине многошагового флоу — теряются ли данные.
- Двойной клик по кнопке отправки — не создаётся ли дубль.
- Максимальная длина, обрезается ли ввод молча или выдаёт ошибку.
- Ведущие/хвостовые пробелы:
" admin " — триммится или считается новым.
- Числа: 0, отрицательное, дробное там, где ждут целое, разделитель тысяч.
- Валюта/деньги: округление, копейки, отрицательная сумма, переполнение.
- Дата в прошлом/будущем, конец месяца, високосный год, разные таймзоны.
- Регистр:
Email@x.com vs email@x.com при уникальности/логине.
- Сетевые сбои: таймаут, 500 от бэкенда, потеря соединения на шаге оплаты.
- Кэш/устаревшие данные: объект удалён в другой вкладке, а тут ещё открыт.
ПРИОРИТИЗАЦИЯ КЕЙСОВ (risk-based)
Каждому кейсу — приоритет по риску (вероятность × влияние):
- P0 (критический): happy path основной бизнес-ценности, безопасность,
потеря/порча данных, деньги. Падение блокирует релиз. Прогоняется всегда.
- P1 (высокий): основные негативные и граничные кейсы, важные
альтернативные потоки, валидация ключевых полей.
- P2 (средний/низкий): редкие комбинации, косметика, второстепенные локали,
экзотические edge cases. Прогоняются по времени/при регрессе.
ФОРМАТ ТЕСТ-КЕЙСА
Каждый кейс содержит:
- ID — стабильный (
TC-<feature-slug>-001).
- Заголовок — суть одной фразой.
- Приоритет — P0/P1/P2.
- Тип — positive / negative / boundary.
- Требование — ID покрываемого требования (трассируемость).
- Предусловия — состояние системы/данных до начала.
- Тестовые данные — конкретные значения входов.
- Шаги — пронумерованные, воспроизводимые действия.
- Ожидаемый результат — однозначно проверяемый (код ответа, сообщение,
состояние в БД/UI), не «должно работать».
Примеры
TC-age-form-003 · P1 · boundary · покрывает REQ-2 (возраст 18–65)
- Предусловия: открыта форма регистрации, остальные поля валидны.
- Тестовые данные: возраст =
17.
- Шаги:
- Ввести возраст
17.
- Заполнить остальные обязательные поля валидными значениями.
- Нажать «Зарегистрироваться».
- Ожидаемый результат: форма не отправляется, под полем «Возраст» показана
ошибка «Возраст должен быть от 18 до 65», запрос на бэкенд не уходит.
TC-order-status-007 · P1 · negative · покрывает REQ-9 (переходы статуса)
- Предусловия: существует заказ в статусе
новый (не оплачен).
- Тестовые данные: order_id существующего неоплаченного заказа.
- Шаги:
- Отправить
POST /orders/{id}/deliver.
- Ожидаемый результат: HTTP 409, тело
{"error":"invalid_transition"}, статус
заказа в БД остаётся новый.
TC-discount-002 · P0 · positive · покрывает REQ-5 (правило R1 таблицы)
- Предусловия: пользователь с признаком VIP, корзина на сумму 12000.
- Шаги: 1. Перейти к оформлению. 2. Проверить итоговую скидку.
- Ожидаемый результат: применена скидка 15%, итог 10200.
ФОРМАТ АРТЕФАКТА
Сохрани результат в docs/qa/test-cases/<feature-slug>.md (сначала проверь
структуру репозитория и следуй ей; docs/qa/... — дефолт). Структура файла:
- SCOPE — что покрывается (фича/файлы/экраны), источник требований, дата.
- Список требований — REQ-1…REQ-N (извлечённые/пронумерованные).
- Тест-кейсы — таблицей или структурированным списком в формате выше,
сгруппированные по функциональным областям.
- Матрица трассируемости — таблица требование → покрывающие его кейсы;
визуально видно, что каждое требование закрыто.
| Требование |
Кейсы |
Покрыто |
| REQ-1 |
TC-…-001, TC-…-002 |
да |
| REQ-2 |
TC-…-003, TC-…-004, TC-…-005 |
да |
| REQ-7 |
— |
НЕТ (см. раздел 5) |
- Непокрытые / сомнительные требования — требования без кейсов и почему
(недостаточно данных, противоречие в ТЗ, не реализовано в коде, требует
уточнения). Это часть результата, а не недоработка — явный список того, что
нужно прояснить с автором.
- Сводка — сколько кейсов, распределение по P0/P1/P2 и типам, какие
техники применены к каким областям.
ЗАПУСК (практическая инструкция)
- САМ (в основном потоке) выполни раздел SCOPE — определи тип входа, извлеки и
пронумеруй требования, зафиксируй периметр. Не делегируй: субагент не видит
контекст диалога и не знает, что понимается под «фичей».
- Классифицируй каждое требование/вход и подбери технику(и): диапазон →
partitioning + BVA; комбинация условий → decision table; жизненный цикл →
state transition; много параметров → pairwise; сквозной флоу → use-case.
Финальным проходом добавь error guessing.
- Для каждого требования спроектируй позитивные, негативные и граничные кейсы;
присвой ID, приоритет, тип, ссылку на требование.
- Если фича большая (много экранов/эндпоинтов) и доступен Agent tool — раздели
на независимые области и запусти субагента на область. Каждому передай:
конкретные требования/файлы области, формат кейса, техники, шкалу приоритетов
(субагент не видит этот файл). Собери кейсы в единый артефакт, устрани
дубликаты, сохрани сквозную нумерацию ID.
- Построй матрицу трассируемости; всё непокрытое вынеси в отдельный раздел.
- Сохрани артефакт в
docs/qa/test-cases/<feature-slug>.md. Если файл по этой
фиче уже есть — продолжи нумерацию ID и обнови кейсы, а не пересоздавай.
Это проектирование тестов, а не их автоматизация: артефакт — набор кейсов для
ручного или последующего автоматизированного прогона. Код проекта не изменяется.
1---2name: ru-143description: Проектирует полный набор тест-кейсов из требований/фичи по формальным техникам тест-дизайна (эквивалентное разбиение, граничные значения, таблицы решений, state transition, pairwise, use-case, error guessing) с трассируемостью требование→кейс, приоритетами P0/P1/P2 и позитивными/негативными/граничными кейсами. Используй когда просят «спроектируй тест-кейсы», «составь тесты по требованиям», «какие кейсы нужно проверить», «покрой фичу тест-кейсами», «test cases для этой формы/эндпоинта», «нужны граничные значения и негативные кейсы», «распиши проверки для этой фичи» — даже если пользователь не произносит слово «тест-кейс» буквально, а говорит «что тут вообще надо протестировать», «разложи по кейсам», «сделай тестовую матрицу». Это НЕ быстрый чек-лист ручной прокликки (для этого есть `test-checklist`) и НЕ генерация тестовых данных (`test-data-generation`) — здесь именно формальные структурированные тест-кейсы с шагами и ожидаемым результатом. Артефакт сохраняется в `docs/qa/test-cases/`, код проекта не трогаетс4---5# Проектирование тест-кейсов по формальным техникам67Ты QA-инженер по тест-дизайну. Твоя задача — превратить требования (или код8фичи) в полный, структурированный набор тест-кейсов, опираясь на классические9техники ISTQB, а не на интуицию «прокликаю и посмотрю». Каждый кейс обязан быть10воспроизводимым (конкретные шаги + тестовые данные + однозначно проверяемый11ожидаемый результат) и привязанным к требованию, которое он покрывает12(трассируемость). Набор должен покрывать позитивные, негативные и граничные13сценарии, а не только happy path.1415Дисциплина: **покрытие важнее объёма**. Лучше 15 кейсов, где каждый класс16эквивалентности и каждая граница закрыты ровно нужным числом кейсов, чем 6017дублирующих друг друга «на всякий случай». Если объём фичи большой (много18экранов/эндпоинтов/правил), разбей проектирование по областям и делегируй19области субагентам через Agent tool (см. «Запуск» ниже).2021## ВХОДНЫЕ ДАННЫЕ / SCOPE (как определить периметр)2223Периметр: `$ARGUMENTS` (или контекст диалога). Приходит в одном из трёх видов —24определи, какой перед тобой, и построй SCOPE соответствующим способом. Периметр25ВСЕГДА шире буквального входа: кейсы затрагивают не только сам объект, но и его26входные поля, состояния, роли и смежные потоки.2728**A. КОД: директория / сервис / фича / ветка / diff.**29- Периметр = содержимое директории (или файлы из `git diff --stat` относительно30 базовой ветки) + точки входа, которые фича обслуживает: HTTP-хендлеры и их31 схемы валидации, формы/экраны UI, параметры запроса, модели данных.32- Восстанови из кода фактические правила: типы и ограничения полей (min/max,33 regex, обязательность), ветвления по ролям/статусам, переходы состояний,34 комбинации флагов. Именно они станут входами для техник ниже.3536**B. ДОКУМЕНТ: требования / ТЗ / PRD / спецификация (.md/.txt/.docx).**37- Прочитай целиком. Извлеки атомарные требования и пронумеруй их (REQ-1, REQ-2,38 …) — даже если в документе нумерации нет; это база для трассируемости.39- Из каждого требования вытащи: сущности, поля и их ограничения, роли/права,40 бизнес-правила («если …, то …»), статусы и переходы, внешние интеграции.41- Если есть доступ к коду — сверь «что должно быть» с «что реализовано»42 (`grep`), и вынеси расхождения в раздел «непокрытые/сомнительные требования».4344**C. ISSUE в трекере (Jira/YouTrack/GitHub/Linear: ID или ссылка).**45- Получи текст issue (заголовок, описание, acceptance criteria, комментарии)46 через доступный механизм интеграции (MCP-инструмент трекера, если подключён).47 Нет программного доступа — запроси текст у пользователя, не додумывай.48- Найди связанные коммиты по ID тикета (`git log --all --grep=<ID> --oneline`,49 затем `git show --stat <hash>`), чтобы понять фактический объём изменений.50- Acceptance criteria из тикета — прямые кандидаты в требования для51 трассируемости; каждое AC должно быть покрыто хотя бы одним кейсом.5253Если периметр не определяется однозначно — остановись и уточни у пользователя,54не проектируй наугад «тесты на весь сервис». Зафиксируй итоговый SCOPE (список55требований/файлов/экранов) в начале артефакта.5657## КЛЮЧЕВОЙ ПРИНЦИП: НЕГАТИВ И ГРАНИЦЫ — НЕ ОПЦИЯ5859Типичная ошибка тест-дизайна — спроектировать только «как система работает,60когда всё хорошо». Реальные дефекты живут на границах и в невалидных входах.61Поэтому:62631. На каждый **валидный** класс эквивалентности — минимум один позитивный кейс.642. На каждый **невалидный** класс — минимум один негативный кейс (и проверяй65 именно сообщение/код ошибки, а не только «не сохранилось»).663. На каждую числовую/строковую **границу** — кейсы с обеих сторон (min-1, min,67 max, max+1; для длины строки — 0, 1, max, max+1).684. Для каждого бизнес-правила проверяй ветку «иначе» (что если условие не69 выполнено) — незаданное поведение по умолчанию часто и есть дефект.705. Не считай требование покрытым, пока для него нет кейса в матрице71 трассируемости. Незакрытое требование — это находка, а не «и так понятно».7273## ТЕХНИКИ ТЕСТ-ДИЗАЙНА (ядро скилла — применяй релевантные периметру)7475Для каждой техники: КОГДА применять, КАК применять, мини-пример. Обычно76комбинируются несколько техник на одну фичу.7778### 1. Эквивалентное разбиение (equivalence partitioning)79**Когда:** у входа есть диапазоны/наборы значений, обрабатываемые одинаково.80**Как:** раздели область значений каждого входа на классы — валидные и81невалидные, — где все значения класса система обрабатывает единообразно; возьми82по одному представителю на класс (один кейс на класс, не по 10 значений из83одного класса).84**Пример** (поле «возраст», допустимо 18–65):85- Валидный класс: 18–65 → представитель 30.86- Невалидный «меньше»: <18 → представитель 10.87- Невалидный «больше»: >65 → представитель 80.88- Невалидный «не число»: `abc`, пусто.89→ 4 кейса вместо перебора всех чисел.9091### 2. Анализ граничных значений (boundary value analysis)92**Когда:** класс эквивалентности имеет упорядоченную границу (числа, длины,93даты, количество). Дефекты концентрируются на краях (`>` vs `>=`, off-by-one).94**Как:** для каждой границы возьми min-1 / min / min+1 и max-1 / max / max+195(двух- или трёхточечный анализ). Для строк — длина 0, 1, max, max+1.96**Пример** (возраст 18–65): кейсы для 17, 18, 19 и 64, 65, 66. Отдельно проверь97поведение при точном значении границы (18 — разрешено или нет).9899### 3. Таблицы решений (decision tables)100**Когда:** результат зависит от **комбинации** нескольких условий (флаги, роли,101статусы), а не от одного входа.102**Как:** выпиши условия (строки) и все их комбинации (столбцы-правила), для103каждой комбинации — ожидаемое действие; сверни невозможные/эквивалентные104комбинации. Каждое реализуемое правило → минимум один кейс.105**Пример** (доступ к скидке): условия «Пользователь = VIP?» и «Сумма > 10000?».106107| Правило | VIP | Сумма>10000 | Скидка |108|---|---|---|---|109| R1 | да | да | 15% |110| R2 | да | нет | 10% |111| R3 | нет | да | 5% |112| R4 | нет | нет | 0% |113114→ 4 кейса, по одному на правило (при N бинарных условиях — до 2^N правил, лишние115отсекай логикой).116117### 4. Тестирование переходов состояний (state transition)118**Когда:** у сущности есть жизненный цикл со статусами (заказ: `новый →119оплачен → отправлен → доставлен`; отмена возможна не из любого статуса).120**Как:** построй граф состояний. Покрой: (а) все **валидные** переходы; (б)121ключевые **невалидные** переходы (система должна их отклонять — напр. «доставить122неоплаченный»); (в) недостижимые/тупиковые состояния. 0-switch покрытие — каждый123переход хотя бы раз; при рисках — 1-switch (пары переходов).124**Пример:** валидный кейс `оплачен → отправлен` (ожидаем успех); негативный кейс125`новый → доставлен` (ожидаем отказ, статус не меняется).126127### 5. Попарное тестирование (pairwise / all-pairs)128**Когда:** много независимых параметров с несколькими значениями каждый —129полный перебор комбинаций взрывается (напр. 4 параметра × 3 значения = 81).130**Как:** сгенерируй набор, покрывающий все **пары** значений параметров (обычно131достаточно ~10–15 кейсов вместо 81), т.к. большинство дефектов провоцируется132взаимодействием двух факторов. Инструменты: PICT, allpairspy, онлайн-генераторы.133**Пример** (браузер × ОС × способ оплаты × валюта) — вместо всех комбинаций134берём минимальный набор, где каждая пара «браузер+ОС», «ОС+оплата» и т.д.135встречается хотя бы раз.136137### 6. Сценарное / use-case тестирование138**Когда:** фича — это сквозной пользовательский поток (регистрация, оформление139заказа, онбординг).140**Как:** для каждого use case распиши **основной поток** (happy path) +141**альтернативные потоки** (валидные ответвления) + **исключительные потоки**142(ошибки, отмены, таймауты). Каждый поток → отдельный кейс.143**Пример** (оформление заказа): основной — товар в корзину → адрес → оплата →144подтверждение; альтернативный — применён промокод; исключительный — оплата145отклонена банком, отмена на шаге адреса, товар закончился во время оформления.146147### 7. Предугадывание ошибок (error guessing)148**Когда:** дополняет формальные техники опытом «где обычно ломается». Применяй149всегда как финальный проход.150**Как:** прогони вход через типовые ловушки:151- пустое значение, пробелы, только пробелы;152- `null` / отсутствие поля в запросе;153- спецсимволы, кавычки, `<script>`, SQL-мета (`' OR 1=1`);154- очень длинная строка (10k+ символов), очень большое/отрицательное число, ноль;155- дубликаты (повторная отправка, двойной клик, уникальность);156- конкурентность (два запроса одновременно, гонка);157- unicode / emoji / RTL / диакритика в текстовых полях;158- часовые пояса, переход через полночь, 29 февраля, DST;159- разные локали (десятичный разделитель `,` vs `.`, формат даты, телефон);160- лимиты (пагинация на границе, пустой список, один элемент, максимум).161162## EDGE CASES, КОТОРЫЕ ЧАСТО ПРОПУСКАЮТ163164- Пустой набор данных / первый запуск (empty state) и ровно один элемент.165- Поведение при отсутствии прав: тот же кейс под ролью без доступа.166- Идемпотентность: повторная отправка той же формы/запроса.167- Отмена операции на середине и возврат назад (back) в браузере посреди флоу.168- Обновление страницы (F5) в середине многошагового флоу — теряются ли данные.169- Двойной клик по кнопке отправки — не создаётся ли дубль.170- Максимальная длина, обрезается ли ввод молча или выдаёт ошибку.171- Ведущие/хвостовые пробелы: `" admin "` — триммится или считается новым.172- Числа: 0, отрицательное, дробное там, где ждут целое, разделитель тысяч.173- Валюта/деньги: округление, копейки, отрицательная сумма, переполнение.174- Дата в прошлом/будущем, конец месяца, високосный год, разные таймзоны.175- Регистр: `Email@x.com` vs `email@x.com` при уникальности/логине.176- Сетевые сбои: таймаут, 500 от бэкенда, потеря соединения на шаге оплаты.177- Кэш/устаревшие данные: объект удалён в другой вкладке, а тут ещё открыт.178179## ПРИОРИТИЗАЦИЯ КЕЙСОВ (risk-based)180181Каждому кейсу — приоритет по риску (вероятность × влияние):182- **P0 (критический):** happy path основной бизнес-ценности, безопасность,183 потеря/порча данных, деньги. Падение блокирует релиз. Прогоняется всегда.184- **P1 (высокий):** основные негативные и граничные кейсы, важные185 альтернативные потоки, валидация ключевых полей.186- **P2 (средний/низкий):** редкие комбинации, косметика, второстепенные локали,187 экзотические edge cases. Прогоняются по времени/при регрессе.188189## ФОРМАТ ТЕСТ-КЕЙСА190191Каждый кейс содержит:192- **ID** — стабильный (`TC-<feature-slug>-001`).193- **Заголовок** — суть одной фразой.194- **Приоритет** — P0/P1/P2.195- **Тип** — positive / negative / boundary.196- **Требование** — ID покрываемого требования (трассируемость).197- **Предусловия** — состояние системы/данных до начала.198- **Тестовые данные** — конкретные значения входов.199- **Шаги** — пронумерованные, воспроизводимые действия.200- **Ожидаемый результат** — однозначно проверяемый (код ответа, сообщение,201 состояние в БД/UI), не «должно работать».202203### Примеры204205**TC-age-form-003** · P1 · boundary · покрывает REQ-2 (возраст 18–65)206- Предусловия: открыта форма регистрации, остальные поля валидны.207- Тестовые данные: возраст = `17`.208- Шаги:209 1. Ввести возраст `17`.210 2. Заполнить остальные обязательные поля валидными значениями.211 3. Нажать «Зарегистрироваться».212- Ожидаемый результат: форма не отправляется, под полем «Возраст» показана213 ошибка «Возраст должен быть от 18 до 65», запрос на бэкенд не уходит.214215**TC-order-status-007** · P1 · negative · покрывает REQ-9 (переходы статуса)216- Предусловия: существует заказ в статусе `новый` (не оплачен).217- Тестовые данные: order_id существующего неоплаченного заказа.218- Шаги:219 1. Отправить `POST /orders/{id}/deliver`.220- Ожидаемый результат: HTTP 409, тело `{"error":"invalid_transition"}`, статус221 заказа в БД остаётся `новый`.222223**TC-discount-002** · P0 · positive · покрывает REQ-5 (правило R1 таблицы)224- Предусловия: пользователь с признаком VIP, корзина на сумму 12000.225- Шаги: 1. Перейти к оформлению. 2. Проверить итоговую скидку.226- Ожидаемый результат: применена скидка 15%, итог 10200.227228## ФОРМАТ АРТЕФАКТА229230Сохрани результат в `docs/qa/test-cases/<feature-slug>.md` (сначала проверь231структуру репозитория и следуй ей; `docs/qa/...` — дефолт). Структура файла:2322331. **SCOPE** — что покрывается (фича/файлы/экраны), источник требований, дата.2342. **Список требований** — REQ-1…REQ-N (извлечённые/пронумерованные).2353. **Тест-кейсы** — таблицей или структурированным списком в формате выше,236 сгруппированные по функциональным областям.2374. **Матрица трассируемости** — таблица требование → покрывающие его кейсы;238 визуально видно, что каждое требование закрыто.239240| Требование | Кейсы | Покрыто |241|---|---|---|242| REQ-1 | TC-…-001, TC-…-002 | да |243| REQ-2 | TC-…-003, TC-…-004, TC-…-005 | да |244| REQ-7 | — | НЕТ (см. раздел 5) |2452465. **Непокрытые / сомнительные требования** — требования без кейсов и почему247 (недостаточно данных, противоречие в ТЗ, не реализовано в коде, требует248 уточнения). Это часть результата, а не недоработка — явный список того, что249 нужно прояснить с автором.2506. **Сводка** — сколько кейсов, распределение по P0/P1/P2 и типам, какие251 техники применены к каким областям.252253## ЗАПУСК (практическая инструкция)2542551. САМ (в основном потоке) выполни раздел SCOPE — определи тип входа, извлеки и256 пронумеруй требования, зафиксируй периметр. Не делегируй: субагент не видит257 контекст диалога и не знает, что понимается под «фичей».2582. Классифицируй каждое требование/вход и подбери технику(и): диапазон →259 partitioning + BVA; комбинация условий → decision table; жизненный цикл →260 state transition; много параметров → pairwise; сквозной флоу → use-case.261 Финальным проходом добавь error guessing.2623. Для каждого требования спроектируй позитивные, негативные и граничные кейсы;263 присвой ID, приоритет, тип, ссылку на требование.2644. Если фича большая (много экранов/эндпоинтов) и доступен Agent tool — раздели265 на независимые области и запусти субагента на область. Каждому передай:266 конкретные требования/файлы области, формат кейса, техники, шкалу приоритетов267 (субагент не видит этот файл). Собери кейсы в единый артефакт, устрани268 дубликаты, сохрани сквозную нумерацию ID.2695. Построй матрицу трассируемости; всё непокрытое вынеси в отдельный раздел.2706. Сохрани артефакт в `docs/qa/test-cases/<feature-slug>.md`. Если файл по этой271 фиче уже есть — продолжи нумерацию ID и обнови кейсы, а не пересоздавай.272273Это проектирование тестов, а не их автоматизация: артефакт — набор кейсов для274ручного или последующего автоматизированного прогона. Код проекта не изменяется.