Тест-кейсы: Переменные для ВР3¶
Источник: актуальная QA-документация проекта «Переменные для ВР3», редакция от 20.08.2026.
Область проверки¶
Проверяются создание, редактирование и удаление переменных, настройки десяти типов, значения по умолчанию, привязки к этапам из двух точек входа, порядок и поведение на исполнении, права, изоляция данных, надежность, производительность и архитектурные ограничения ВР-10.
Общие предусловия и данные¶
- Доступно тестовое окружение BP Platform с актуальной сборкой и средствами просмотра сетевых запросов/логов.
- Авторизован
Архитекторс правом редактирования БП. - Создан черновик
БП Переменные Ас этапами1. Заполнение,2. Согласование,3. Утверждение. - Создан черновик
БП Переменные Бдля проверки изоляции; его данные не принадлежатБП Переменные А. - Создан опубликованный
БП Опубликованный. - Доступен пользователь
Наблюдательбез права редактирования. - В справочной системе есть категории
Финансы,Документыи справочникиСтатьи учета,Типы документовс тестовыми значениями. - В системе объектов учёта есть категории
Контрагенты,Договоры, системный объектВсе контрагентыи пользовательские наборыБлагонадежные,Новые. - Подготовлены безопасные файлы каждого разрешенного расширения, файл
sample.exe, файл с подмененным расширением, тестовый вредоносный образец, наборы суммарным размером ровно и более 100 МБ. - Для замеров используются согласованный профиль нагрузки, стабильная сеть и синхронизированные часы. Время backend и frontend фиксируется раздельно.
UI и CRUD¶
Основание: BR-REQ-012–015, BR-REQ-020, FR-VAR-001–005, FR-VAR-007, FR-SEC-001, макеты.
| ID | Название | Предусловия | Шаги | Ожидаемый результат |
|---|---|---|---|---|
| VAR-UI-001 | Список переменных и состояния фильтра | В БП Переменные А есть поле и две переменные |
1. Открыть Настройка полей и переменных.2. Переключить Все, Поля, Переменные.3. Выполнить поиск по имени переменной. 4. Открыть меню строки. |
Счетчик соответствует строкам; фильтр Переменные не показывает поля; поиск фильтрует список; для переменной видны название, описание, тип/формат, число действий, источник/группа и значение по умолчанию согласно утвержденному UI; меню содержит операции редактирования, настройки этапов и удаления в черновике. |
| VAR-UI-002 | Открытие формы создания переменной | Открыт список переменных черновика | Нажать кнопку + и выбрать/оставить тип сущности Переменная. |
Открыта форма добавления; доступны обязательные Название и Тип/Формат, необязательное Описание, динамическое Значение по умолчанию, настройки типа, Сохранить и Отмена; фокус установлен внутрь формы. |
| VAR-UI-003 | Отмена создания | Открыта пустая форма создания | 1. Заполнить несколько полей. 2. Нажать Отмена или закрыть форму.3. При наличии подтверждения подтвердить выход. 4. Повторно открыть список. |
Новая переменная не создана; счетчик и список не изменены; черновые значения не подставляются при новом открытии. |
| VAR-CRUD-001 | Создание валидной переменной | Открыта форма создания в БП Переменные А |
1. Ввести уникальное имя Комментарий QA.2. Выбрать Строка.3. Задать описание, допустимые настройки и default value. 4. Сохранить. 5. Повторно открыть переменную. |
Сохранена одна переменная текущего БП; форма закрыта; список и счетчик обновлены; все введенные значения сохраняются и предзаполняются без искажений. |
| VAR-CRUD-002 | Обязательность имени и типа | Открыта форма создания | 1. Оставить имя пустым и попытаться сохранить. 2. Ввести имя, очистить обязательный тип доступным способом и повторить. |
Сохранение заблокировано; у каждого незаполненного обязательного поля показана понятная ошибка; запись не создается. |
| VAR-CRUD-003 | Уникальность имени внутри БП | В БП Переменные А есть Город |
Создать вторую переменную с именем Город, затем повторить через прямой запрос к сервису, если API доступен. |
Обе попытки отклонены бизнес-валидацией; в БП остается одна переменная Город; частичная запись отсутствует. |
| VAR-CRUD-004 | Одинаковое имя в разных БП | В БП Переменные А есть Город |
В БП Переменные Б создать переменную Город. |
Создание разрешено; у переменных разные идентификаторы и businessProcessId; они видны только в своих БП. |
| VAR-CRUD-005 | Границы описания переменной | Подготовлены строки длиной 499, 500 и 501 символ | Последовательно сохранить переменные с каждым описанием и проверить счетчик символов. | 499 и 500 символов сохраняются полностью; 501-й символ не принимается либо сохранение блокируется с ошибкой; лимит интерфейса равен 500, несмотря на 0/250 в старом макете. |
| VAR-CRUD-006 | Редактирование с предзаполнением | Есть переменная Город с описанием, настройками и default value |
1. В меню строки выбрать Редактировать.2. Сверить поля. 3. Изменить имя на уникальное, описание и default value. 4. Сохранить и открыть повторно. |
Исходные значения предзаполнены; измененные значения сохранены; неизмененные настройки не потеряны; updatedAt обновлен, новая запись не создана. |
| VAR-CRUD-007 | Отмена редактирования | Открыто редактирование существующей переменной | Изменить все доступные поля, нажать Отмена, повторно открыть переменную. |
Сохраненные данные остались исходными; список и привязки не изменились. |
| VAR-CRUD-008 | Общая валидация значения по умолчанию | Открыта форма переменной с ограничениями типа | Указать default value другого типа или нарушающий текущие ограничения и сохранить. | Сохранение заблокировано; ошибка привязана к default value и объясняет несоответствие; после исправления допустимое значение сохраняется. |
| VAR-CRUD-009 | Отмена удаления неиспользуемой переменной | Переменная Временная не привязана к этапам |
1. Выбрать Удалить.2. Проверить текст с именем и типом. 3. Нажать Отмена. |
Показан предусмотренный боттомбар подтверждения; после отмены переменная и ее данные сохранены. |
| VAR-CRUD-010 | Подтверждение удаления неиспользуемой переменной | Переменная Временная не привязана к этапам |
1. Выбрать Удалить.2. Нажать Подтвердить.3. Обновить страницу и выполнить поиск. |
Переменная удалена; показан алерт Переменная удалена из бизнес-процесса; строка и запись detail больше недоступны; остальные переменные не затронуты. |
| VAR-CRUD-011 | Удаление используемой переменной и каскад | Город привязан к двум этапам |
1. Начать удаление и подтвердить первый вопрос. 2. Проверить список этапов в предупреждении. 3. Нажать Отмена и убедиться в сохранности.4. Повторить и нажать Да.5. Проверить оба этапа. |
До финального подтверждения данные не меняются; предупреждение перечисляет оба этапа и потерю привязок; после Да переменная и только ее привязки удалены атомарно; счетчики этапов обновлены; показан алерт успеха. |
| VAR-CRUD-012 | Обработка удаленной/устаревшей переменной | Пользователь A открыл настройку этапов; пользователь B удалил переменную | Пользователь A пытается загрузить/сохранить изменения. | Показана понятная контролируемая ошибка; форма не падает и не показывает debug/HTML; удаленная переменная не восстанавливается и не создает orphan-привязку. |
| VAR-CRUD-013 | Блокировка изменений опубликованного БП | Открыт БП Опубликованный под Архитектором |
Проверить список, меню, кнопки +, редактирования, удаления, настройки этапов и Настроить; попытаться повторить операции прямыми запросами. |
Все операции изменения скрыты/заблокированы; backend также отклоняет их; данные опубликованного БП не изменяются, чтение остается доступным по правам. |
Тип Строка¶
Основание: BR-REQ-002, FR-TYPE-001.
| ID | Название | Предусловия | Шаги | Ожидаемый результат |
|---|---|---|---|---|
| VAR-STR-001 | Строка без ограничения длины | Открыта форма, выбран Строка |
Выбрать Неограниченное, сохранить и открыть повторно. |
Переменная сохранена; в settings.maxLength отсутствует лимит/хранится null; поле исполнения не применяет пользовательский лимит длины. |
| VAR-STR-002 | Строка с положительным лимитом и default value | Выбран Строка |
Задать До 10 символов; проверить default value длиной 10 и 11; затем проверить ввод на исполнении. |
Значение длиной 10 сохраняется и принимается; 11 — отклоняется при настройке и исполнении; граница применяется единообразно. |
| VAR-STR-003 | Невалидный лимит строки | Выбран режим До N символов |
Последовательно ввести пустое значение, 0, отрицательное, дробное и нечисловое значение. | Каждый невалидный вариант отклонен; требуется целое положительное N; переменная не сохраняется с некорректным maxLength. |
Тип Число¶
Основание: BR-REQ-003, FR-TYPE-002.
| ID | Название | Предусловия | Шаги | Ожидаемый результат |
|---|---|---|---|---|
| VAR-NUM-001 | Добавление допустимых операций и запрет повтора | Выбран Число |
Через + добавить Больше, Меньше, Не больше, Не меньше; попытаться второй раз добавить уже использованный вид. |
Доступны ровно четыре операции; сохраненные строки содержат числовые значения; одна операция каждого вида используется не более одного раза; дубль недоступен или отклонен. |
| VAR-NUM-002 | Противоречивые числовые ограничения | Выбран Число |
Попытаться сохранить Больше 5 + Меньше 3, затем Больше 5 + Не больше 5. |
Оба набора отклонены как пустой диапазон; показана понятная ошибка; ни один набор частично не сохраняется. |
| VAR-NUM-003 | Границы диапазона и default value | Выбран Число |
Сохранить Не меньше 5 + Не больше 5 с default 5; проверить 4.99 и 5 на исполнении; затем проверить исключающую границу Больше 5. |
Равенство 5 допустимо для включающих границ; 4.99 отклоняется; для Больше 5 значение 5 отклоняется; default value проверяется теми же правилами. |
Тип Список¶
Основание: BR-REQ-004, FR-TYPE-003, UC-001.
| ID | Название | Предусловия | Шаги | Ожидаемый результат |
|---|---|---|---|---|
| VAR-LIST-001 | Добавление и удаление вариантов списка | Выбран Список |
Добавить Москва, Санкт-Петербург, Казань; удалить Казань; добавить ее снова; сохранить. |
Кнопка добавляет отдельное текстовое поле, × удаляет выбранный вариант; порядок и тексты сохранены в settings.options; произвольный вариант не добавляется на исполнении. |
| VAR-LIST-002 | Количество ответов и default value | Есть три варианта | Задать Количество возможных ответов = 1, выбрать Москва по умолчанию и сохранить; на исполнении попытаться выбрать два значения. |
Минимум 1 принимается; default value входит в варианты; на исполнении доступен выбор не более одного значения. |
| VAR-LIST-003 | Невалидное количество и значение вне списка | Есть варианты списка | Попытаться сохранить количество 0, отрицательное, дробное и пустое; затем указать default value, которого нет в options. | Требуется целое значение не менее 1; default value вне списка отклоняется; запись не сохраняется частично. |
Тип Флаг¶
Основание: BR-REQ-005, FR-TYPE-004.
| ID | Название | Предусловия | Шаги | Ожидаемый результат |
|---|---|---|---|---|
| VAR-FLAG-001 | Предустановленные пары флага | Выбран Флаг |
Последовательно выбрать Да/Нет, 1/0, Есть/Нет, сохранить и проверить отображение/default value. |
Каждая пара сохраняет правильные true/false labels и preset; default value выбирается только из активной пары; на исполнении показана выбранная пара. |
| VAR-FLAG-002 | Пользовательская пара флага | Выбран Флаг |
Выбрать Настроить; оставить одно поле пустым; затем заполнить Согласен и Не согласен, выбрать default и сохранить. |
При неполной паре сохранение отклонено; два значения сохраняются раздельно и отображаются на исполнении; default принадлежит пользовательской паре. |
Типы Ссылка, Дата, Дата и время¶
Основание: BR-REQ-006–008, FR-TYPE-008–010, UC-004.
| ID | Название | Предусловия | Шаги | Ожидаемый результат |
|---|---|---|---|---|
| VAR-LINK-001 | Валидация URL | Выбран Ссылка |
Проверить согласованные валидные URL (https://example.org/path?q=1) и невалидные строки (example, пробелы, поврежденная схема) как default и на исполнении. |
Валидный URL сохраняется без искажения; невалидный блокируется понятной ошибкой; одно правило действует в настройке и исполнении. |
| VAR-DATE-001 | Дата через календарь | Выбран Дата |
Выбрать 15.08.2026, сохранить, открыть повторно и проверить исполнение. | Дата выбирается календарем, хранится как дата без времени и отображается в согласованном формате DD.MM.YYYY; default подставляется на исполнении. |
| VAR-DATETIME-001 | Дата и время с точностью до минут | Выбран Дата и время |
Выбрать 15.08.2026 14:30, сохранить и открыть повторно. | Дата и время выбираются компонентами и представлены единым значением; сохраняются минуты; отображение соответствует DD.MM.YYYY HH:mm; секунды не требуются. |
| VAR-DATETIME-002 | Валидация и изменение даты-времени на исполнении | Есть переменная с default 15.08.2026 14:30 и редактируемым действием | Ввести невозможную дату/время, затем выбрать валидное значение 16.08.2026 09:05 и завершить этап. | Невалидное значение отклонено; валидное заменяет default с точностью до минут и сохраняется после повторного открытия экземпляра. |
Тип Файл¶
Основание: BR-REQ-009, FR-TYPE-007, NFR-SCALE-004, NFR-SEC-003.
| ID | Название | Предусловия | Шаги | Ожидаемый результат |
|---|---|---|---|---|
| VAR-FILE-001 | Выбор разрешенных форматов | Выбран Файл |
Открыть выбор форматов; выбрать PDF, DOC, DOCX, JPEG, PNG, XLS, XLSX; попытаться указать другой формат. | Список содержит ровно семь разрешенных расширений; выбранные значения сохраняются без дублей; иной формат нельзя добавить. |
| VAR-FILE-002 | Количество файлов и default value | Выбран Файл, разрешены PDF/PNG |
Проверить maxFiles 1 и 3, а также 0, отрицательное, дробное и пустое; загрузить default files до и сверх лимита. |
Принимается целое значение не менее 1; количество файлов не превышает maxFiles; превышение блокируется без потери уже допустимых файлов. |
| VAR-FILE-003 | Проверка содержимого, размера и вредоносного файла | Настроены разрешенные форматы | Загрузить разрешенный файл, sample.exe, файл с подмененным расширением, вредоносный образец, набор более 100 МБ. |
Разрешенный безопасный файл принимается; запрещенное/подмененное/вредоносное содержимое отклоняется; набор сверх 100 МБ отклоняется; пользователь получает безопасное сообщение без раскрытия внутренних путей. |
Тип Справочник¶
Основание: BR-REQ-010, FR-TYPE-005, UC-002.
| ID | Название | Предусловия | Шаги | Ожидаемый результат |
|---|---|---|---|---|
| VAR-DIR-001 | Обязательность и фильтрация справочника | Выбран Справочник |
Попытаться сохранить без категории/справочника; выбрать Финансы; проверить список и выбрать Статьи учета; сменить категорию на Документы. |
Оба поля обязательны; второй селект содержит только справочники активной категории; после смены категории несовместимый directoryId очищается; сохранить чужую комбинацию запросом нельзя. |
| VAR-DIR-002 | Количество ответов и default value справочника | Выбран Статьи учета |
Проверить maxSelections 1 и 3, невалидные 0/дробное; выбрать значение справочника по умолчанию и значение из другого справочника. | Принимается целое значение не менее 1; default из выбранного справочника сохраняется; чужое значение отклоняется; лимит действует на исполнении. |
Тип Объект учёта¶
Основание: BR-REQ-011, FR-TYPE-006, UC-003.
| ID | Название | Предусловия | Шаги | Ожидаемый результат |
|---|---|---|---|---|
| VAR-OBJECT-001 | Фильтрация и системный объект учёта | Выбран Объект учёта |
Выбрать Контрагенты; открыть селект объектов; выбрать Все контрагенты, затем Благонадежные. |
Поля категории и объекта обязательны; селект отфильтрован по категории и содержит системный объект всех значений и пользовательские объекты; каждый допустимый выбор сохраняется. |
| VAR-OBJECT-002 | Смена категории очищает несовместимый объект | Выбран объект Благонадежные категории Контрагенты |
Сменить категорию на Договоры; попытаться сохранить старый objectId через UI и прямой запрос. |
Старый выбор очищен; показываются только объекты Договоры; backend отклоняет несовместимую пару category/object; исходные данные не подменяются. |
| VAR-OBJECT-003 | Количество ответов и default value объекта | Выбран объект учета Благонадежные |
Проверить maxSelections 1 и 5, невалидные 0/дробное; выбрать допустимого контрагента и объект другой категории как default. | Принимается целое значение не менее 1; допустимый default сохраняется; объект вне выбранного набора/категории отклоняется; лимит применяется на исполнении. |
Привязка из списка переменных¶
Основание: BR-REQ-001, BR-REQ-016–017, FR-ASSIGN-001–007, UC-005–006.
| ID | Название | Предусловия | Шаги | Ожидаемый результат |
|---|---|---|---|---|
| VAR-ASSIGN-001 | Оверлей и таблица привязок | Город привязан к Заполнение |
В меню Город выбрать управление этапами и проверить экран. |
Заголовок содержит имя Город; таблица показывает фактический счетчик и колонки Этап, Действие, Описание действия, Опции; этап только для чтения в строке; доступны добавление, Сохранить все и Отмена. |
| VAR-ASSIGN-002 | Добавление этапа и состав селекта | Город уже привязан к Согласование; этапы созданы не в порядке следования |
Нажать + Добавить этап, открыть селект и выбрать Заполнение. |
Открыт сайдпейдж; уже использованного Согласование нет; остальные этапы отсортированы по order; после локального сохранения строка Заполнение появляется в таблице, но еще не записана окончательно до Сохранить все. |
| VAR-ASSIGN-003 | Четыре обязательных действия | Открыт сайдпейдж добавления | Открыть селект, проверить варианты; попытаться сохранить без действия; затем последовательно выбрать каждый вариант. | Доступны ровно Ввод, Редактирование, Уточнение, Просмотр; без выбора сохранение заблокировано; каждое допустимое действие принимается. |
| VAR-ASSIGN-004 | Обязательность и границы описания действия | Подготовлены строки 149, 150, 151 символ | Сохранить привязку с пустым описанием и с каждой строкой. | Пустое и 151 символ отклонены; 149 и 150 сохраняются полностью; счетчик/ошибка отражают лимит 150 во всех состояниях формы. |
| VAR-ASSIGN-005 | Запрет повторной привязки | Город привязан к Заполнение |
Попытаться добавить тот же этап через UI, затем повторить прямым запросом/параллельными сохранениями. | Этап отсутствует в селекте; backend гарантирует уникальность пары; создается не более одной записи variableId + stageId; показана бизнес-ошибка без 500/debug. |
| VAR-ASSIGN-006 | Редактирование привязки | Есть Город / Заполнение / Ввод / Укажите город |
Выбрать Изменить, сменить действие на Уточнение и описание на Уточните город, локально сохранить и нажать Сохранить все. |
Сайдпейдж предзаполнен; строка и сохраненная привязка обновлены; переменная и этап не дублированы; новое поведение видно с обеих точек входа. |
| VAR-ASSIGN-007 | Отмена удаления привязки | Есть привязка Город к Согласование |
Выбрать Удалить, проверить текст с именами, нажать Отмена. |
Показано подтверждение; строка и серверная привязка сохранены; счетчики не изменены. |
| VAR-ASSIGN-008 | Подтверждение удаления привязки | Есть привязка Город к Согласование |
Подтвердить удаление строки, нажать Сохранить все, проверить этап и переменную. |
Удалена только выбранная привязка; сама переменная, этап и другие привязки сохранены; счетчики уменьшены на 1. |
| VAR-ASSIGN-009 | Пакетное сохранение и счетчик | В открытом оверлее добавлена, изменена и удалена по одной строке | Нажать Сохранить все, дождаться ответа и открыть экран повторно. |
Все три изменения применены атомарно; оверлей закрыт; показан алерт Настройки переменной в этапах сохранены; счетчик этапов равен фактическому числу привязок. |
| VAR-ASSIGN-010 | Отмена пакета изменений | В оверлее подготовлены несохраненные добавление/изменение/удаление | Нажать Отмена, подтвердить выход при запросе и открыть настройки повторно. |
Ни одно подготовленное изменение не применено; исходные строки и счетчики восстановлены; ложное уведомление об успехе отсутствует. |
Привязка через полотно и настройки этапа¶
Основание: BR-REQ-018, FR-CANVAS-001–006, UC-007–008.
| ID | Название | Предусловия | Шаги | Ожидаемый результат |
|---|---|---|---|---|
| VAR-CANVAS-001 | Карточка переменных в сайдпанели этапа | К Заполнение привязаны две переменные |
Нажать этап на полотне, открыть вкладку Переменные. |
Сайдпанель открыта; карточка показывает фактическое количество 2 и кнопку Настроить. |
| VAR-CANVAS-002 | Переход сразу на нужную вкладку | Открыта карточка переменных этапа | Нажать Настроить. |
Оверлей настройки этапа открывается сразу на вкладке Поля и переменные, без дополнительного клика; отображаются строки текущего этапа. |
| VAR-CANVAS-003 | Добавление только непривязанной переменной | Город уже на этапе, Имя клиента еще нет |
Нажать + Добавить, открыть селект переменных, выбрать Имя клиента, заполнить действие/описание и локально сохранить. |
Город отсутствует в селекте; переменные других БП отсутствуют; Имя клиента доступно; после сохранения появляется одна новая строка с именем и типом. |
| VAR-CANVAS-004 | Валидация формы добавления через этап | Открыта форма добавления | Проверить отсутствие переменной, действия и описания; проверить описание 150/151 символ и дублирование прямым запросом. | Все три поля обязательны; 150 символов допустимы, 151 — нет; дубль пары отклонен; невалидная строка не добавляется. |
| VAR-CANVAS-005 | Редактирование действия и описания | Есть Город / Просмотр / Проверьте город |
В меню строки выбрать Редактировать, сменить на Уточнение / Уточните город, локально и окончательно сохранить. |
Форма предзаполнена; изменены только action/description текущей привязки; результат виден в настройке этапов из списка переменных. |
| VAR-CANVAS-006 | Удаление из этапа с подтверждением | Есть привязка Город к Согласование |
Выбрать Удалить, сначала отменить, затем повторить и подтвердить; сохранить оверлей. |
При отмене строка остается; после подтверждения и общего сохранения удалена только привязка; переменная остается в БП; подтверждение содержит переменную и этап. |
| VAR-CANVAS-007 | Сохранение оверлея обновляет счетчик | В таблицу добавлена одна валидная строка | Нажать основную кнопку Сохранить, дождаться закрытия и проверить сайдпанель. |
Изменение сохранено; оверлей закрыт; счетчик увеличен на 1 и равен данным при повторном открытии. |
| VAR-CANVAS-008 | Отмена изменений этапа | Подготовлены несохраненные добавление, изменение и удаление | Нажать Отмена, повторно открыть этап. |
Все серверные данные и счетчик остались исходными; временные строки отсутствуют. |
| VAR-CANVAS-009 | Синхронизация двух точек входа | Изменение сохранено через полотно | Открыть управление этапами той же переменной из общего списка; затем изменить там и вернуться в этап. | Обе точки входа читают одну сущность VariableAssignment; действие, описание, наличие строки и счетчики совпадают без обновления вручную сверх предусмотренного потока. |
Порядок и экран исполнения¶
Основание: BR-REQ-001, BR-REQ-019, FR-VAR-006, FR-CANVAS-007, макеты исполнения.
| ID | Название | Предусловия | Шаги | Ожидаемый результат |
|---|---|---|---|---|
| VAR-ORDER-001 | Изменение глобального порядка | В БП есть Город, Сумма, Дата |
Переместить Дата перед Город, сохранить/дождаться автосохранения, обновить страницу. |
Новый глобальный order сохранен и стабилен; нет дублей/пропусков, влияющих на сортировку; в общем контексте исполнения используется новый порядок. |
| VAR-ORDER-002 | Изменение локального порядка этапа | Все три переменные привязаны к Заполнение |
На вкладке этапа переместить Сумма первой, сохранить и открыть повторно. |
Новый порядок VariableAssignment.order сохранен только для Заполнение; drag-and-drop/кнопки имеют однозначный результат. |
| VAR-ORDER-003 | Независимость глобального и локального порядка | Настроены отличающиеся порядки | Изменить глобальный порядок, проверить локальный; затем изменить локальный и проверить глобальный. | Изменение одного порядка не перезаписывает другой; оба значения воспроизводятся после обновления. |
| VAR-ORDER-004 | Порядок на экране исполнения | Настроены глобальный и локальный порядки, запущен экземпляр | Открыть этап с локальным порядком и экран без локальной настройки/в согласованном общем контексте. | На этапе применяется локальный порядок; там, где локальный порядок не задан, применяется согласованный глобальный; порядок стабилен после повторного входа. |
| VAR-ACTION-001 | Действие Ввод |
У переменной нет значения; на этапе действие Ввод |
Попытаться завершить этап без значения, затем ввести валидное значение. | Без значения завершение заблокировано; после ввода валидного значения этап можно завершить и значение сохраняется. |
| VAR-ACTION-002 | Действие Редактирование |
Есть текущее значение; действие Редактирование |
Попытаться завершить без изменения, затем изменить значение. | Поле редактируемо; пользователь обязан изменить текущее значение; без изменения завершение блокируется, с изменением — разрешено. |
| VAR-ACTION-003 | Действие Уточнение |
Есть текущее значение; действие Уточнение |
Завершить без изменения; повторить в другом экземпляре с изменением. | Поле редактируемо, но изменение необязательно; оба варианта разрешены; выбранное итоговое значение сохраняется. |
| VAR-ACTION-004 | Действие Просмотр |
Есть значение; действие Просмотр |
Попытаться изменить значение через UI и запрос исполнения. | Значение доступно только для чтения; UI не разрешает ввод; backend не принимает изменение в обход UI. |
| VAR-ACTION-005 | Подсказка действия на исполнении | У каждой тестовой переменной задано описание действия | Открыть этап исполнения и сопоставить подсказки с привязками. | У каждой переменной показано описание именно текущей привязки; текст не подменяется описанием переменной, не обрезается до 150 символов с потерей сохраненного значения и соответствует этапу. |
Согласованность данных и безопасность¶
Основание: FR-SEC-001, NFR-SEC-001–002, NFR-RELIAB-001–003.
| ID | Название | Предусловия | Шаги | Ожидаемый результат |
|---|---|---|---|---|
| VAR-DATA-001 | Каскад при удалении этапа | К Согласование привязаны три переменные, у них есть другие этапы |
Удалить этап предусмотренным модулем способом и проверить связи. | Удалены все и только привязки удаленного этапа; переменные и их связи с другими этапами сохранены; orphan-записей нет; счетчики пересчитаны. |
| VAR-DATA-002 | Атомарность и полной набор валидаций | Пакет содержит две валидные и одну невалидную привязку/настройку | Сохранить пакет и проверить БД/API после ошибки; исправить ошибку и повторить. | До исправления не сохранена ни одна часть пакета; показаны понятные ошибки всех обнаруженных полей либо согласованный полный ответ валидации; после исправления пакет сохраняется целиком. |
| VAR-SEC-001 | Права и статус проверяются на каждом изменении | Наблюдатель; опубликованный БП; известны запросы операций |
Попытаться создать, изменить, удалить переменную, изменить порядок и привязки через UI и сервисные запросы. | UI не предлагает запрещенные действия; каждый запрос независимо проверяет авторизацию, право и статус БП; возвращается контролируемый отказ; данные не меняются. |
| VAR-SEC-002 | Изоляция переменных и привязок по БП | В БП А и Б есть свои переменные/этапы | Подставить идентификатор переменной/этапа из БП Б в чтение и изменения БП А, включая создание привязки и reorder. | Чужие данные не появляются в списках/селектах; detail/update/delete/assignment/reorder отклоняются как not found или согласованная бизнес-ошибка; данные обоих БП не изменены. |
Производительность и масштабирование¶
Основание: NFR-PERF-001–003, NFR-SCALE-001–004.
| ID | Название | Предусловия | Шаги | Ожидаемый результат |
|---|---|---|---|---|
| VAR-PERF-001 | Открытие трех основных интерфейсов до 2 секунд | Стандартный согласованный профиль | По 5 раз открыть создание/редактирование, настройку этапов переменной и настройку этапа; фиксировать p95 от действия до готовности. | Для каждого интерфейса p95 не превышает 2 секунд; данные и контролы готовы к взаимодействию, а не только показан контейнер. |
| VAR-PERF-002 | Сохранение до 3 секунд | Подготовлены валидная переменная и пакет привязок | По 5 раз выполнить создание/редактирование и пакетное сохранение; фиксировать p95 до подтвержденного обновления UI. | p95 каждой операции не превышает 3 секунд; уведомление не показывается до подтверждения успешной записи. |
| VAR-PERF-003 | Страница с 500 переменными до 5 секунд | В БП создано 500 разнотипных переменных | Холодно и тепло открыть страницу 5 раз, проверить прокрутку, поиск и меню. | p95 полной загрузки не превышает 5 секунд; интерфейс остается работоспособным, строки не теряются и не дублируются. |
| VAR-PERF-004 | Оверлеи при 1000 переменных и 50 этапах | В БП 1000 переменных и 50 этапов | Открыть три интерфейса из VAR-PERF-001 и выполнить поиск/открытие селекта. | Открытие укладывается в 2 секунды по NFR-PERF-001; селекты/поиск не зависают и возвращают полный согласованный результат с пагинацией при наличии. |
| VAR-PERF-005 | Селекты при 100 этапах | В БП ровно 100 этапов, часть уже использована | Открыть добавление этапа для переменной, найти первый/средний/последний этап и проверить сортировку. | Селект работоспособен, отсортирован по order, содержит все 100 минус уже использованные этапы, поиск/прокрутка не теряют элементы. |
| VAR-PERF-006 | Граница суммарного размера файлов 100 МБ | maxFiles достаточен, форматы разрешены |
Загрузить набор ровно 100 МБ и набор 100 МБ + минимальная единица размера по контракту. | Набор на границе принимается; набор сверх границы отклоняется до/при сохранении с понятной ошибкой; частичная загрузка не считается успешным значением. |
| VAR-SCALE-001 | Большой набор справочников | Подготовлен согласованный большой набор категорий/справочников с пагинацией | Выбирать категории на разных страницах, искать справочники, быстро менять категорию и сохранять выбор. | Доступен весь набор, а не только первая страница; фильтрация соответствует последней категории; устаревшие ответы не подменяют выбор; время соответствует согласованному нагрузочному профилю. |
| VAR-SCALE-002 | Большой набор объектов учёта | Подготовлен согласованный большой набор категорий/объектов | Повторить сценарий VAR-SCALE-001, включая системные объекты. | Доступны системные и пользовательские объекты нужной категории; пагинация/поиск не смешивают категории; последний выбор сохраняется корректно. |
UX и архитектурные проверки¶
Основание: NFR-USAB-001–003, NFR-MOD-001–002, макеты.
| ID | Название | Предусловия | Шаги | Ожидаемый результат |
|---|---|---|---|---|
| VAR-UX-001 | Единые паттерны и понятные подписи | Доступны все точки входа | Последовательно открыть создание/редактирование, добавление/редактирование привязки, оба подтверждения удаления и уведомления. | Создание/редактирование использует согласованный overlay, привязки — sidepage, удаление — bottombar, результат — alert/toast; заголовки содержат контекст; Сохранить, Отмена, Подтвердить, добавление и настройка названы единообразно по утвержденному copy. |
| VAR-UX-002 | Обратная связь и восстановление после ошибки | Можно имитировать 4xx, 5xx и потерю сети | Вызвать ошибку валидации, отказ прав, серверную ошибку и потерю сети при сохранении; восстановить сеть и повторить. | Пользователь различает причины; сообщения не содержат stack trace/HTML; форма не закрывается и введенные данные не теряются без подтвержденного успеха; повторная отправка не создает дубль. |
| VAR-ARCH-001 | Расширяемость конфигурации типов | Доступны код и архитектурная схема реализации | Провести ревью регистрации типов, схем settings, рендера формы, сериализации и валидации; добавить тестовый тип в изолированной ветке/fixture без изменения существующих обработчиков. |
Новый тип подключается через отдельную конфигурацию/стратегию; существующие типы и общая CRUD-логика не требуют условных правок по всему модулю; неизвестный тип обрабатывается контролируемо. |
| VAR-ARCH-002 | Независимость интеграций | Доступны код, контракты и тестовые doubles справочников, объектов, редактора и исполнения | Отключить/заменить каждый внешний сервис по отдельности и выполнить релевантный поток; проверить границы модулей. | Интеграции идут через явные интерфейсы/API; сбой одного источника дает локализованную ошибку и не повреждает переменные; доменная модель не зависит от UI/конкретного клиента внешней системы. |
API: группы, системные переменные, форматы, экшны и ЭБП¶
Основание: BR-REQ-001–011, FR-CRUD-001–007, FR-TYPE-001–010, FR-ASSIGN-001–007, NFR-SEC-001–003, NFR-RELIAB-001–003. Фактический контракт фиксируется по OpenAPI стенда; токены и идентификаторы пользователей не сохраняются в артефактах.
| ID | Название | Предусловия | Шаги | Ожидаемый результат |
|---|---|---|---|---|
| VAR-API-001 | Аутентификация REST и GraphQL | Получен валидный access token | Выполнить одинаковый read-запрос: без заголовков; только с bearer; только с X-Keycloak-Sub; с обоими; с несовпадающим subject. |
Данные возвращаются только при валидном bearer и согласованной идентичности; клиентский subject без токена не авторизует запрос; ошибки не раскрывают внутренние данные. |
| VAR-API-002 | Фильтры системных и пользовательских переменных | В БП есть оба вида переменных | Проверить interaction_type, is_system, is_common, is_init_parameter, q; сопоставить пересечения и total. |
Каждый фильтр возвращает только соответствующие записи; total и пагинация согласованы; системные признаки нельзя подделать пользовательским запросом. |
| VAR-API-003 | Валидация пагинации | В БП не менее двух переменных | Проверить limit=1 с offset 0/1, затем limit 0, -1, текст и отрицательный offset. |
Валидные страницы последовательны и не дублируются; невалидные значения дают 422 без выполнения запроса к данным. |
| VAR-API-004 | Изоляция detail по businessProcessId | Переменная принадлежит БП A; существует БП B | Запросить ID переменной через URL БП A, БП B и несуществующего БП. | Только URL БП A возвращает объект; остальные дают 404/403 без раскрытия объекта. |
| VAR-API-005 | Атомарность PATCH с неверным BP | Подготовлена тестовая переменная БП A | Отправить PATCH через URL БП B/несуществующего БП, затем повторно прочитать через БП A. | PATCH отклонён до записи; все поля остались исходными. |
| VAR-API-006 | Изоляция DELETE по businessProcessId | Подготовлена тестовая переменная БП A | Отправить DELETE через URL БП B; повторно получить переменную через БП A. | DELETE отклонён; объект и привязки БП A сохранены. |
| VAR-API-007 | Создание десяти форматов | Есть временная пользовательская группа | Последовательно создать Строку, Число, Список, Флаг, Ссылку, Дату, Дату и время, Файл, Справочник и Объект учёта с валидными settings/default; повторно прочитать. | Каждый запрос 201; API возвращает типизированную схему; данные после GET совпадают с нормализованным контрактом. |
| VAR-API-008 | Негативная валидация settings | Есть временная группа | Проверить неизвестный формат, maxSelections=0, запрещённый формат файла, maxFiles=0, directory/accounting object без обязательных ссылок, противоречивые number constraints. |
Каждый запрос отклонён 4xx; шаблон и link группы не создаются; пакетная операция атомарна. |
| VAR-API-009 | Границы имени и описания | Есть временная группа | Проверить пустое/пробельное имя, description 499/500/501 и имя-дубликат. | Пустое имя, 501 и дубликат отклонены контролируемым 4xx; 499/500 сохранены; debug/SQL/stack trace отсутствуют. |
| VAR-API-010 | Защита системного признака | Выполняется пользовательский POST/PATCH | Передать is_system=true, затем проверить список is_system=true. |
Клиент не может создать или преобразовать системную переменную; сервер игнорирует поле либо возвращает 403/422. |
| VAR-API-011 | CRUD категории и группы | БП доступен для редактирования | Создать категорию и группу, прочитать, изменить, проверить повторное имя группы, затем удалить. | CRUD использует документированные коды; имя группы уникально в категории; системные категории/группы защищены; после удаления записи отсутствуют. |
| VAR-API-012 | Счётчик и привязка переменных группы | Создана группа и несколько переменных | Получить группу до/после создания, перемещения и удаления переменных. | variable_count и порядок вычислены из актуальных link; нет дублей; удалённые переменные не учитываются. |
| VAR-API-013 | Системные группы в ЭБП | Есть системная группа и несколько ЭБП | Получить group variables для одного entity и paginated entities. | Возвращается одна и та же группа; значения принадлежат указанному ЭБП и template; пагинация/архивный фильтр согласованы. |
| VAR-API-014 | Контракт экшнов переменной | Получен OpenAPI/GraphQL schema | Найти CRUD привязки переменная–этап; проверить четыре action, описание 149/150/151, дубль пары и обе точки чтения. | Контракт существует; доступны ровно четыре действия; границы и уникальность обеспечиваются backend; frontend operations присутствуют в schema. |
| VAR-API-015 | Пользовательская переменная в существующем ЭБП | ЭБП создан до переменной | Добавить variable template и запросить entity fields/view существующего ЭБП. | Поведение соответствует утверждённой миграционной политике: поле синхронизировано либо API явно сообщает, что применяется только к новым ЭБП. |
| VAR-API-016 | Пользовательская переменная в новом ЭБП | Создан валидный template в системном разделе | Создать новый ЭБП; получить entity fields и view. | Есть ровно одно поле с parent_id template; оно находится в правильной секции и доступно по обеим точкам чтения. |
| VAR-API-017 | Default value в новом ЭБП | Template имеет валидный default | Создать ЭБП и получить поле каждого формата. | data.value и UI-значение инициализированы default value с сохранением типа/формата. |
| VAR-API-018 | Bulk-update поля ЭБП | Есть пользовательское поле нового ЭБП | Изменить значение, повторно прочитать view; повторить с невалидным field/entity и смешанным пакетом. | Валидный пакет даёт 200 и сохраняется; невалидный — контролируемый 4xx; смешанный пакет не сохраняется частично. |
| VAR-API-019 | Каскад и очистка тестовых объектов | Используется уникальный префикс теста | Удалить ЭБП, variables, группу, категорию; повторно выполнить списки/GET. | Удалены только созданные тестом объекты и их entity fields/links; исходные данные неизменны; повторный GET даёт 404. |
| VAR-API-020 | Согласованность OpenAPI, OPTIONS и frontend | Доступны спецификация и frontend bundle | Сопоставить методы/схемы OpenAPI, OPTIONS, реальные запросы и GraphQL documents клиента. | Методы, payload, response и операции совпадают; нет клиентских операций, отсутствующих на backend; контракт проходит автоматический тест. |
| VAR-API-021 | Полнота переданного endpoint inventory | Получен согласованный список backend-ручек и OpenAPI стенда | Для каждого маршрута шаблонов, actions, values, групп, init parameters и системных конфигов сопоставить path и HTTP methods. | Все переданные маршруты опубликованы в OpenAPI с теми же методами; отсутствующие/лишние операции перечислены явно. |
| VAR-API-022 | Глобальный порядок variables | В отдельном тестовом БП есть системные и две пользовательские variables | Получить полный список ID, отправить обратный порядок через fields/reorder, повторно прочитать; отправить неполный/чужой набор; восстановить исходный порядок. |
Полный набор атомарно получает order=1..N; неполный, дублированный или чужой набор отклоняется 4xx без изменения; исходный порядок восстановлен. |
| VAR-API-023 | Симметричный CRUD action из variable и stage | Есть variable и stage одного тестового БП | Создать action через variable endpoint; прочитать через оба входа; PATCH через stage; DELETE через variable. Повторить в обратном направлении. | Оба входа представляют один объект с одинаковым ID/данными; изменение и удаление видны с обеих сторон. |
| VAR-API-024 | Валидация action и уникальность пары | Есть variable и stage | Проверить input/edit/clarify/view, неизвестное действие, пустое описание, длины 149/150/151 и повтор пары variable+stage. |
Ровно четыре действия допустимы; описание обязательно и не длиннее 150; дубль пары и invalid payload дают контролируемый 4xx без частичной записи. |
| VAR-API-025 | Локальный порядок actions этапа | На stage созданы минимум три action | Отправить полный обратный ordered_ids, повторно прочитать через stage и variables; затем неполный, дублированный и содержащий чужой ID набор. |
Полный набор сохраняет локальный порядок; invalid наборы отклоняются атомарно; глобальный порядок variables не меняется. |
| VAR-API-026 | Запись одного значения по action | ЭБП находится на stage с action каждого типа | Получить draggables/{id}/field-actions, записать value через action ID и повторно прочитать поле/view. |
Доступность записи соответствует action; валидное значение сохраняется с правильным типом; чужой draggable/action и invalid value отклоняются. |
| VAR-API-027 | Атомарная запись нескольких значений | В ЭБП доступны несколько actions | Отправить валидный bulk, затем пакет с одним invalid/чужим action и повторно прочитать все значения. | Валидный пакет сохраняется целиком; смешанный пакет не меняет ни одного значения и возвращает контролируемый 4xx. |
| VAR-API-028 | Публикация категории и variables layout | Создана временная пользовательская категория с группой | Запросить layout черновика; publish; запросить layout; запретить недопустимые изменения; unpublish и повторно прочитать. | Черновик недоступен в layout; опубликованная категория доступна; lifecycle и ограничения статуса соблюдаются; cleanup возвращает draft. |
| VAR-API-029 | Параметры запуска | Создана временная variable | Назначить через PUT, повторно прочитать GET, снять DELETE; повторить через чужой/несуществующий БП и смешанный список ID. | Назначение и снятие сохраняются; scope и полный набор валидируются до записи; ошибка не приводит к частичному назначению. |
| VAR-API-030 | Конфиги системных переменных | Доступна изолированная роль/среда для системного конфига | Проверить list/detail/filter/pagination; создать уникальный bp_type, изменить excluded fields, проверить влияние на новый БП и удалить. | CRUD документирован, bp_type уникален, excluded fields валидируются; только привилегированная роль изменяет конфиг; удаление возвращает исходную генерацию. |
| VAR-API-031 | Верхнеуровневые группы и links | Созданы category, groups и variables | Сопоставить /field-groups/, groups в category, /field-group-links/ и group-variable read models до/после перемещения. |
Все представления содержат согласованные group/link/order; чужой BP недоступен; нет дублированных links. |
| VAR-API-032 | CRUD значений /fields/ |
Создан отдельный ЭБП и известен template | Создать value, прочитать list/detail, PUT/PATCH, проверить чужую entity/template и DELETE с повторным GET. | CRUD сохраняет только значение данного ЭБП; parent/entity scope соблюдается; invalid/чужие ссылки отклоняются без побочных записей. |
| VAR-API-033 | Невалидный template не блокирует создание ЭБП | Используется отдельный тестовый БП и crash-safe cleanup | Попытаться создать переменную с пустым именем; затем создать новый ЭБП в том же БП. При ошибке повторно проверить отсутствие остаточных сущностей. | Невалидная переменная отклонена 4xx; новый ЭБП создаётся независимо от отклонённого запроса. Если template всё же принят, ошибка создания ЭБП фиксируется отдельно от первичного дефекта валидации; cleanup удаляет template, ЭБП и БП. |
Автоматизация API-кейсов¶
| Кейсы | Реализация | Статус автоматизации |
|---|---|---|
| VAR-API-001, VAR-API-004–006, VAR-API-020 | api_tests/test_security_and_isolation.py |
Полная REST/GraphQL auth-матрица и GET/PATCH/DELETE scope; xfail только при точном известном симптоме. В recovery-run чужой БП выбирается read-only, без создания неудаляемой сущности. |
| VAR-API-002–003, VAR-API-010–012 | api_tests/test_groups_and_system_variables.py |
Все опубликованные фильтры, valid/invalid pagination, уникальность группы, счётчик 2 → 1, POST/PATCH защиты is_system. |
| VAR-API-007–009 | api_tests/test_variable_formats.py, api_tests/test_reference_contracts.py |
Восемь автономных positive E2E, границы 499/500/501 и 20 negative; каталог справочников проверяется read-only. Positive directory/accounting object — GAP до fixture API. |
| VAR-API-014, VAR-API-020–021 | api_tests/test_actions_contract.py |
Полный inventory 30 переданных path/method contracts и GraphQL drift; точный xfail BPAPI-017 до deployment. |
| VAR-API-013, VAR-API-015–019, VAR-API-033 | api_tests/test_ebp_fields.py |
Entity/page read models, existing/new ЭБП, default/update, каскад template → entity field и защита создания ЭБП от невалидного template. |
| VAR-API-022 | api_tests/test_variable_reorder.py |
Полный набор ID, проверка persistence и обязательное восстановление; BPAPI-017 до deployment. |
| VAR-API-028 | api_tests/test_category_publication.py |
Publish/unpublish пройдены; variables-layout отсутствует на стенде — BPAPI-017. |
| VAR-API-029 | api_tests/test_init_parameters.py |
Positive lifecycle пройден; wrong-BP атомарен, но возвращает 500 — BPAPI-020. |
| VAR-API-030 | api_tests/test_system_variable_configs.py |
Read/auth/schema подготовлены; BFF возвращает 404 — BPAPI-017. Mutation отложена до изолированной системной fixture. |
| VAR-API-019 | api_tests/support/state.py, api_tests/test_cleanup.py, tools/cleanup-api-test-data.py |
Манифест, LIFO cleanup и аварийный повтор; 20.08.2026 полный цикл включая удаление БП пройден. |
| VAR-API-023–027, VAR-API-031–032 | Контрактные ожидания зафиксированы; E2E будет добавлен после merge/deployment и появления автономной stage fixture | Сейчас блокируют BPAPI-017 и отключённые execution routes feature-ветки. |
Общие фикстуры находятся в api_tests/conftest.py; клиент OAuth/REST/GraphQL — в api_tests/support/client.py. Все ID создаваемых сущностей берутся из ответов текущего запуска. Учетные данные передаются только через environment variables.
Примечания к исполнению¶
- Тесты с прямыми запросами выполняются по фактическому контракту реализации. До появления OpenAPI они не фиксируют выдуманные URL, HTTP-коды и payload.
- Для
VAR-ARCH-*результатом является ссылка на ревью/ADR и автоматические component-тесты, а не только отметка ручного тестировщика. - Для
VAR-SCALE-*объем набора утверждается в плане нагрузочного тестирования. Формулировканеограниченное количествоподтверждается отсутствием искусственного доменного лимита, пагинацией и архитектурным анализом. - Если продукт утвердит copy из макетов вместо формулировок ТЗ, сначала обновляются требования и матрица, затем ожидаемые результаты UI-кейсов.