← К публикациям

Что выводится из сценария использования: требования, тесты и бизнес-правила

Как собирать требования от задач пользователя, выводить из сценария функциональные требования и тесты и хранить бизнес-правила отдельно — на примере записи на встречу.

Тёмная карточка сценария с ветвлениями соединена с колонкой требований и колонкой тестов, где одно место пустое, а отдельный блок правил подключён пунктиром

Сценарий использования стоит в центре постановки. Из его шагов получаются функциональные требования, из ветвей и гарантий — тесты, а правила, от которых зависит поведение, живут рядом в отдельном списке.

Эта статья — практическое продолжение двух материалов. В статье «Как превратить бизнес-требования в функциональные» (черновик) путь идёт от бизнес-цели к пользовательским сценариям. В статье «Use case — новый исходник программы» я доказываю, что в агентной разработке сценарий становится главным редактируемым документом. Здесь — что с ним делать дальше: как получить из сценария требования и тесты и где держать бизнес-правила.

Все три приёма описаны у Карла Вигерса и Джой Битти в книге «Разработка требований к программному обеспечению». Я показываю их на одной реальной функции — записи на онлайн-встречу на моём сайте. Её спецификация, конфигурация и тесты лежат в репозитории сайта рядом с кодом.

Что понадобится:

  • одна пользовательская цель, которую вы собираетесь реализовать или менять;
  • люди, которые знают, как она должна работать, — или вы сами в этой роли;
  • репозиторий, где рядом с кодом можно хранить текстовые документы.

Шаг 1. Спросить о задачах, а не о функциях

Вигерс и Битти различают два способа собирать требования. Можно спросить, какие функции нужны в системе, и получить список. Можно спросить, какие задачи люди решают с её помощью, и получить сценарии. Первый способ авторы называют ориентированным на продукт, второй — ориентированным на использование, и советуют второй.

Для записи на встречу список функций выглядит так: календарь свободного времени, выбор длительности, форма с именем и email, приглашение в календарь, уведомление в Telegram. Каждый пункт разумен. Но в списке нет ответа на вопросы, из-за которых такие функции ломаются в работе: что если слот заняли, пока посетитель заполнял форму? Что если посетитель нажал кнопку дважды? Можно ли перенести встречу, не создав вторую?

Список задач выглядит иначе:

Кто Чего хочет добиться
Посетитель сайта Записаться на встречу в удобное время
Посетитель сайта Отменить или перенести встречу
Владелец календаря Узнать о новой записи и подготовиться к ней
Владелец календаря Изменить часы, когда к нему можно записаться

Из каждой строки получается сценарий. А вопросы о занятом слоте и повторном нажатии появляются сами, когда вы проходите сценарий по шагам и спрашиваете: «А что, если здесь пойдёт иначе?»

Второй эффект — лишнее видно сразу. Функцию, которая не служит ни одной строке таблицы, либо обосновывают новой задачей, либо не делают. Для агента это особенно полезно: он охотно добавит «удобную» возможность, о которой никто не просил.

Результат шага: таблица участников и их целей. Её не нужно делать полной с первого раза, важно, чтобы каждая цель была результатом для участника, а не действием в интерфейсе.

Шаг 2. Написать сценарий для выбранной цели

Как писать сам сценарий — основной путь, ветви, гарантии — подробно разобрано в статье «Use cases, user stories и BDD для AI-агента» (черновик). Здесь нужен готовый результат. Шаблон паспорта сценария с полным набором полей — UC-XXX.md в моём шаблоне Memory Bank. Для цели «Записаться на встречу» сценарий выглядит так (сокращённая переработка реальной спецификации):

## UC-BOOK-01. Записаться на онлайн-встречу

Основной участник: посетитель сайта
Вспомогательные: Google Calendar, Яндекс Телемост, Telegram

Гарантия успеха:
G1. В календаре создано одно событие с уникальной комнатой Телемоста.
G2. Посетитель видит подтверждение и ссылку для отмены или переноса.

Минимальная гарантия:
G3. Посетитель не видит сообщения об успехе, если событие не создано.
G4. Повтор того же запроса не создаёт вторую встречу.

Основной сценарий:
1. Система показывает свободные слоты в часовом поясе посетителя.
2. Посетитель выбирает длительность и время.
3. Посетитель указывает имя, email, тему и даёт согласие.
4. Система повторно проверяет слот и создаёт событие.
5. Система показывает подтверждение и уведомляет владельца календаря.

Расширения:
2a. Посетитель меняет часовой пояс: меняется только отображение.
4a. Слот заняли, пока посетитель заполнял форму: система сообщает
    об этом и возвращает к выбору слота.
4b. Календарь недоступен: событие не создаётся, посетитель видит ошибку.
5a. Telegram недоступен: запись успешна, уведомление уйдёт позже.

Правила: BR-01 … BR-06.

Обратите внимание на последнюю строку. В сценарии нет ни часов работы, ни длительностей, ни горизонта записи. Шаг 1 говорит «свободные слоты», а что считается свободным слотом — определяют правила. Почему так, — в шаге 5.

Шаг 3. Вывести функциональные требования

Функциональное требование описывает, что система должна делать. Вигерс и Битти рассматривают сценарий как источник, из которого аналитик выводит функциональные требования: сам сценарий описывает взаимодействие, а требования — поведение системы, которое это взаимодействие обеспечивает.

Практическое правило вывода:

  • каждый шаг, где действует система, даёт одно или несколько требований;
  • каждое расширение даёт требование к поведению в особой ситуации;
  • каждая гарантия даёт требование, которое должно выполняться при любом исходе.
Откуда Функциональное требование
Шаг 1 FR‑1. Система вычисляет свободные слоты по правилам BR-01…BR-06 и занятости всех подключённых календарей и показывает их во времени посетителя.
Шаг 4 FR‑2. Перед созданием события система заново проверяет занятость слота в календаре.
Шаг 4, G1 FR‑3. Для каждой записи система создаёт новую комнату Телемоста.
4a FR‑4. Если слот занят, система отклоняет запись с отдельным кодом ошибки и не создаёт событие.
G4 FR‑5. Запрос записи несёт идентификатор; повтор с тем же идентификатором возвращает прежний результат.
5a FR‑6. Уведомление ставится в очередь и повторяется при временной ошибке; сбой уведомления не отменяет запись.

Нужно ли вести такой список отдельно, если есть сценарий? Моё мнение: для одной небольшой функции — не обязательно, агенту хватает сценария и правил. Список становится полезен, когда одно и то же поведение нужно нескольким сценариям. FR-1 работает и для записи, и для переноса встречи; если описать его внутри каждого сценария, описания со временем разойдутся.

Выводить требования стоит и тогда, когда вы их не храните. Проход по таблице выше — быстрый способ найти шаг, на котором система что-то делает, но в сценарии не сказано, что именно.

Результат шага: требования, у каждого из которых есть источник в сценарии. Требование без источника — сигнал: либо пропущен шаг или ветвь, либо требование лишнее.

Шаг 4. Вывести тесты

Вигерс и Битти предлагают выводить тесты из тех же сценариев, что и требования, — и сравнивать одно с другим. Если по сценарию получился тест, для которого нет требования, пропущено требование. Если есть требование, которое не проверяет ни один тест, пропущен тест или требование лишнее.

Правило вывода тестов:

  • основной сценарий даёт один сквозной тест успешного пути;
  • каждое расширение — минимум один тест;
  • каждая минимальная гарантия — тест, который создаёт сбой и проверяет, что гарантия выдержала;
  • каждое правило — тесты на границах: последний допустимый и первый недопустимый случай.

Вот как это выглядит на реальных тестах записи на встречу. Названия тестов взяты из репозитория, связь со сценарием я провёл вручную:

Что в сценарии Тест в репозитории
Основной путь, G1 creates one Calendar event with attendee, a unique Telemost room and an email update request
G1 creates a different Telemost room for every new booking
G4 repeating the same request is idempotent
4a serializes overlapping requests and rejects the loser
4a serializes overlapping requests across two service instances
5a notification delivery clears PII and failed delivery is retryable
Правило «не день в день» starts booking on the next schedule date while allowing tomorrow less than 24 hours ahead
Правило о рабочих днях closes Wednesday, Friday and weekends

Таблица сразу показывает и пробелы. Для расширения 4b — календарь недоступен — отдельного теста в этом списке нет. Поведение описано в спецификации, но закреплено слабее остального. Именно такие места агент при следующей правке может изменить, не заметив.

Честное ограничение: в моём репозитории тесты не ссылаются на идентификаторы сценария, связь пришлось восстанавливать по названиям. Если добавить идентификатор в название теста — 4a: serializes overlapping requests… — проверку покрытия можно отдать скрипту или агенту: найти ветви без тестов и тесты без ветвей.

Результат шага: список тестов, где у каждого есть источник в сценарии или правиле, и список ветвей, для которых теста пока нет.

Шаг 5. Вынести бизнес-правила отдельно

Бизнес-правило — ограничение предметной области, которое определяет поведение системы: когда можно записаться, сколько длится встреча, что считать дублем. Вигерс и Битти советуют хранить правила отдельно от сценариев и требований, а в сценариях на них ссылаться.

Причин три, и все три видны на записи на встречу.

Правило нужно нескольким сценариям. «Записаться можно не раньше следующего дня» действует при записи, при переносе и при показе календаря. Если вписать его в шаг сценария записи, при переносе его забудут или сформулируют чуть иначе.

Правило меняется по другим причинам и чаще. За первые три недели после запуска я поменял четыре правила: длительность 45 минут заменил на 60, горизонт записи сократил с 30 до 14 дней, шаг начала встречи увеличил с 15 минут до часа, добавил закрытые праздники. Шаги сценария записи от этого не изменились. Если правила перемешаны со сценарием, каждая такая правка — повод трогать документ, в котором легко задеть лишнее.

Правилу нужна точность на границах. Вот как правило «не день в день» сформулировано в спецификации:

Записаться в текущий московский календарный день нельзя, даже если до слота остаётся больше четырёх часов. Слоты следующего дня доступны сразу после московской полуночи: это календарное ограничение, а не плавающий интервал в 24 часа.

Короткая версия «запись минимум за сутки» допускает два разных поведения. Агент выбрал бы одно из них и написал бы для него аккуратные тесты. Отдельно записанное правило оставляет место для такой точности, в шаге сценария её обычно не пишут.

Формат каталога правил может быть простым:

ID Правило Где используется
BR‑01 Расписание считается в часовом поясе Europe/Moscow. Встреча целиком помещается в рабочие часы: пн, вт, чт с 09:00 до 17:00. Запись, перенос, календарь
BR‑02 Длительность — 15, 30 или 60 минут; начало — в ровный час. Запись, перенос
BR‑03 Между встречами не меньше 15 минут. Расчёт слотов
BR‑04 Не раньше следующего календарного дня по Москве и не раньше чем через 4 часа. Запись, перенос, календарь
BR‑05 Не дальше 14 дней вперёд. Запись, перенос, календарь
BR‑06 Государственные праздники закрыты целиком. Расчёт слотов

В коде правилу тоже нужно одно место. На сайте почти все эти правила — значения в файле конфигурации config/booking.mjs: рабочие дни, длительности, шаг, буфер, горизонт. Сменить значение правила — значит поправить строку конфигурации и тест на его границе; сценарий при этом не трогается. Так отдельное хранение правил в документе продолжается в отдельном хранении в коде.

Результат шага: каталог правил с идентификаторами, ссылки на них из сценариев и одно место в коде для каждого правила.

Шаг 6. Передать это агенту и проверить

Агенту я передаю не одно из этих представлений, а все вместе:

  • сценарий с идентификаторами шагов, ветвей и гарантий;
  • каталог правил;
  • функциональные требования, если их несколько сценариев используют общими;
  • команды запуска тестов.

До того как агент начнёт писать код, полезно попросить его о сверке:

Сопоставь сценарий [ID сценария, например UC-BOOK-01], правила [ID правил, например BR-01…BR-06] и существующие тесты. Перечисли: ветви и гарантии без тестов; тесты, которые не относятся ни к одной ветви или правилу; места, где правило записано внутри шага сценария или продублировано в коде. Код пока не меняй.

Вы → агент

Результат этой сверки проверяется глазами: агент должен назвать конкретные ветви и тесты, а не общие рекомендации. После реализации та же сверка повторяется — и её результатом должен стать пустой список пробелов или список, который вы сознательно оставили на потом.

Работа закончена, когда цепочку можно пройти в обе стороны. От ветви сценария — к требованию и тесту. От упавшего теста — к ветви или правилу, которые он защищает.

Где это не работает

Сценарий в центре хорош для функций, где есть участник с целью и взаимодействие по шагам. Для системы, где главное — расчёты по сложным правилам, например тарификация или налоговые начисления, центром становится каталог правил и таблицы примеров, а сценарий остаётся тонкой обёрткой.

Нефункциональные требования — производительность, защита данных, доступность — из сценария не выводятся. Их записывают отдельно, и тесты для них проектируют отдельно.

Полный вывод требований и тестов дорог. Для справочника или простой формы хватит сценария из трёх шагов и пары тестов. Подробный проход окупается там, где ошибка стоит денег, доступа или данных: платежи, интеграции, удаление, запись к людям в календарь.

Термины

  • Сценарий использования (use case) — описание того, как участник достигает цели с помощью системы: основной путь, ветви и гарантии.
  • Расширение — ветвь сценария от конкретного шага: другой вариант, ошибка или отмена.
  • Гарантия — то, что система обеспечивает после сценария: при успехе или при любом исходе.
  • Функциональное требование (FR) — описание того, что система должна делать; здесь — поведение, выведенное из шагов, ветвей и гарантий сценария.
  • Бизнес-правило (BR) — ограничение предметной области, которое определяет поведение системы и может использоваться несколькими сценариями.
  • Трассировка — связь между сценарием, требованием, правилом и тестом, по которой можно пройти в обе стороны.
  • Идемпотентность — свойство операции: повтор того же запроса даёт тот же результат и не создаёт дубль.
  • Coding-агент — AI-инструмент, который сам читает репозиторий, меняет файлы и запускает проверки.

Источники

  1. Карл Вигерс, Джой Битти — «Разработка требований к программному обеспечению. Практические приёмы сбора требований и управления ими при разработке программных продуктов», 3-е изд., дополненное. БХВ, 2025 — подход, ориентированный на использование, вывод функциональных требований и тестов из сценариев, отдельное хранение бизнес-правил.
  2. Анастасия Солдатова — «Use Case: как описывать эффективные сценарии использования. Part 1», Хабр, 2025 — состав сценария и его ограничения, включая нефункциональные требования.
  3. Академия MediaSoft — «Use case: что это, из чего состоит и как избежать ошибок при написании», 2024 — шаблон сценария и типичные ошибки при его написании.
  4. Шаблон паспорта сценария UC-XXX.md из репозитория dapi/memory-bank — поля паспорта и идентификаторы для трассировки.
  5. Спецификация записи на встречу на pismenny.ru, конфигурация и тесты в репозитории сайта — источник сквозного примера: сценарий, правила доступности и названия тестов.
  6. «Use case — новый исходник программы», «Как превратить бизнес-требования в функциональные» и «Use cases, user stories и BDD для AI-агента» — соседние материалы: зачем сценарий в центре, откуда он берётся и как его писать.

Хотите внедрить это у себя?

Помогаю командам перейти на агентную разработку: как советник, через обучение команды или внедрение изменений с проверкой эффекта по данным. Короткие заметки между статьями выходят в Telegram-канале.

Работать со мной или канал «Жизнь стартапа в стране ИИ»