Ручные тест-планы
Ручной тест-план — это план, в котором каждый шаг ждёт вердикта
тестировщика. Используйте его для приёмочного тестирования, регуляторного
sign-off, исследовательских прогонов или любых сценариев, где автомат не
может сам решить «прошло/не прошло».
Сделать прогон полностью ручным можно двумя способами:
- Создать план как ручной с самого начала через мастер. Каждый
тест-кейс в плане получаетexecutionMode: manualв параметрах, поэтому
любой будущий прогон — по расписанию, ad-hoc или из CI — выполняется в
ручном режиме. - Переопределить режим на этапе запуска. Передайте флаг в теле запроса
POST/runs, и все TCM-айтемы данного прогона пойдут в ручном режиме —
независимо от того, как план был сконфигурирован изначально. Сам план
не модифицируется, поэтому следующий запуск без override вернётся к
sticky-режиму, заданному на айтеме.
Оба пути дают одинаковый UX в живом прогоне: каждый шаг появляется в
Drawer’е с тремя кнопками вердикта (Pass / Fail / Skip), полем для
комментария и загрузчиком вложений (T4 — Drawer, T5 — viewer отчёта).
Путь 1 — мастер (UI)
- Откройте страницу Тест-планы.
- Нажмите Создать ручной тест-план в тулбаре (иконка с поднятой рукой
между «Master Run» и поиском). - Шаг 1 — Основное. Введите название (≤200 символов) и опциональное
markdown-описание (≤4000 символов). - Шаг 2 — Тест-кейсы. Нажмите Выбрать тест-кейсы…, откроется
tree-picker по TCM-папкам. Выберите один или несколько кейсов. Мастер
показывает живой счётчик выбранных кейсов и позволяет удалить отдельный
кейс без повторного открытия пикера. - Шаг 3 — Проверка. Просмотрите сводку и выберите:
- Сохранить черновик — план создаётся, прогон не запускается.
- Создать и запустить — план создаётся, и сразу же стартует прогон с
ручным override’ом.
Клавиатура: Esc закрывает мастер; Cmd/Ctrl+Enter вызывает основное
действие текущего шага (Далее на шагах 1–2, Создать и запустить на шаге 3).
Что видит тестировщик во время ручного прогона
После старта ручного прогона страница run-detail открывается с Drawer’ом
справа. Каждый шаг появляется по очереди — три кнопки (Pass / Fail / Skip),
поле комментария и загрузчик «Прикрепить доказательство». Оркестратор
приостанавливает poll deadline, пока шаг ждёт действия человека —
тестировщики могут потратить часы или дни. Жёсткий потолок 72 часа защищает
от runs, случайно оставленных открытыми навсегда.
Когда последний шаг закрыт, прогон финализируется со сводным статусом: все
pass → passed; есть fail → failed; есть skip без fail → partial.
Путь 2 — override на этапе запуска (API + CI)
Override превращает любой план в одноразовый ручной прогон без изменения
самого плана. Удобно, когда нужно перепроверить автоматический suite вручную
после инцидента или когда release manager хочет точечную проверку без
форка плана.
curl -X POST \
-H "X-API-Key: $MOCKARTY_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"executionModeOverride":"manual"}' \
"$MOCKARTY_URL/api/v1/test-plans/$PLAN_ID/run"
Допустимые значения executionModeOverride:
| Значение | Эффект на TCM-айтемы |
|---|---|
"" / нет |
Без override. Используется Parameters.executionMode каждого айтема. |
"manual" |
Все айтемы — вручную, каждый шаг ждёт вердикта. |
"auto" |
Все айтемы — без участия человека (semi-automatic в терминах TCM). |
Любое другое значение отклоняется с HTTP 400 и кодом validation, чтобы
опечатка в CI-скрипте сразу всплывала, а не молча возвращалась к sticky-
режиму.
Приоритет
Решая режим для одного айтема, оркестратор берёт первое непустое значение:
executionModeOverrideиз тела запроса (если задан).parameters.executionModeна айтеме плана.- Значение по умолчанию:
manual.
Поскольку override scoped на конкретный прогон, два прогона одного плана
могут идти в разных режимах — например, CI-прогон с
executionModeOverride: "auto" для ночного smoke и ad-hoc прогон с
executionModeOverride: "manual", когда тестировщик хочет перепроверить
руками.
Запуск из SDK / CLI
То же поле executionModeOverride доступно во всех официальных клиентах.
Go SDK (sdk/go-sdk):
run, err := client.TestPlans().RunManual(ctx, "#42", mockarty.RunManualOptions{
ExecutionModeOverride: "manual",
RecordDetailed: true,
NotifyOnCompletion: true,
NotifyEmails: []string{"qa-lead@example.com"},
})
Python SDK (sdk/py-sdk):
run = client.test_plans.run_manual(
"#42",
execution_mode_override="manual",
record_detailed=True,
notify_on_completion=True,
notify_emails=["qa-lead@example.com"],
)
Java SDK (sdk/java-sdk):
TestPlanApi.RunManualOptions opts = new TestPlanApi.RunManualOptions()
.executionModeOverride("manual")
.recordDetailed(true)
.notifyOnCompletion(true)
.notifyEmails(List.of("qa-lead@example.com"));
TestPlanRun run = client.testPlans().runManual("#42", opts);
CLI (mockarty-cli):
mockarty-cli testplan run-manual '#42' \
--execution-mode-override=manual \
--record-detailed \
--notify-on-completion \
--notify-emails=qa-lead@example.com
Резолв ручного шага
Пока ручной прогон в работе, каждый шаг, ждущий вердикта, появляется в
GET /api/v1/me/awaiting-manual (те же данные, что рисует колокольчик
в топ-баре). Опубликуйте вердикт через resolve-эндпоинт:
curl -X POST \
-H "X-API-Key: $MOCKARTY_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"resolution":"pass","note":"smoke ok","noteFmt":"plain"}' \
"$MOCKARTY_URL/api/v1/namespaces/$NS/tcm/case-runs/$CASE_RUN_ID/steps/$STEP_UID/resolve"
Или из клиента:
mockarty-cli testplan resolve-step "$CASE_RUN_ID" "$STEP_UID" \
--resolution=pass --note="smoke ok"
err := client.TestPlans().ResolveStep(ctx, caseRunID, stepUID, mockarty.ResolveStepOptions{
Resolution: mockarty.StepResolutionPass,
Note: "smoke ok",
NoteFmt: "plain",
})
client.test_plans.resolve_step(
case_run_id, step_uid,
resolution="pass", note="smoke ok", note_fmt="plain",
)
В CI-сценариях можно использовать mockarty-cli me awaiting-manual --format=json,
чтобы быстро упасть, если в конце pipeline остался открытый ручной шаг:
count=$(mockarty-cli me awaiting-manual --format=json | jq '.count')
if [ "$count" -gt 0 ]; then
echo "::error ::$count manual gates still open"
exit 1
fi
CI/CD-нюансы
- Ручной прогон никогда не завершится сам. Pipeline’ы, которые ждут
терминальный статус (например,until status == passed), повиснут.
Либо запускайте ручные прогоны из отдельной job’ы, не блокирующей
pipeline, либо используйтеexecutionModeOverride: "auto"в CI и
оставляйте manual для прогонов, ведомых тестировщиком. - Уведомления срабатывают на тех же событиях lifecycle как для
ручных, так и для автоматических прогонов — ручной план может слать
webhook или email после закрытия последнего шага последним тестировщиком.
Связанные документы
- Тест-планы — базовые концепции и типы айтемов.
- Тест-кейсы — сущность, из которой строится ручной план.
- Вложения TCM — загрузка доказательств из Drawer’а.