Документация Ручные тест-планы

Ручные тест-планы

Ручной тест-план — это план, в котором каждый шаг ждёт вердикта
тестировщика. Используйте его для приёмочного тестирования, регуляторного
sign-off, исследовательских прогонов или любых сценариев, где автомат не
может сам решить «прошло/не прошло».

Сделать прогон полностью ручным можно двумя способами:

  1. Создать план как ручной с самого начала через мастер. Каждый
    тест-кейс в плане получает executionMode: manual в параметрах, поэтому
    любой будущий прогон — по расписанию, ad-hoc или из CI — выполняется в
    ручном режиме.
  2. Переопределить режим на этапе запуска. Передайте флаг в теле запроса
    POST /runs, и все TCM-айтемы данного прогона пойдут в ручном режиме —
    независимо от того, как план был сконфигурирован изначально. Сам план
    не модифицируется, поэтому следующий запуск без override вернётся к
    sticky-режиму, заданному на айтеме.

Оба пути дают одинаковый UX в живом прогоне: каждый шаг появляется в
Drawer’е с тремя кнопками вердикта (Pass / Fail / Skip), полем для
комментария и загрузчиком вложений (T4 — Drawer, T5 — viewer отчёта).

Путь 1 — мастер (UI)

  1. Откройте страницу Тест-планы.
  2. Нажмите Создать ручной тест-план в тулбаре (иконка с поднятой рукой
    между «Master Run» и поиском).
  3. Шаг 1 — Основное. Введите название (≤200 символов) и опциональное
    markdown-описание (≤4000 символов).
  4. Шаг 2 — Тест-кейсы. Нажмите Выбрать тест-кейсы…, откроется
    tree-picker по TCM-папкам. Выберите один или несколько кейсов. Мастер
    показывает живой счётчик выбранных кейсов и позволяет удалить отдельный
    кейс без повторного открытия пикера.
  5. Шаг 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-
режиму.

Приоритет

Решая режим для одного айтема, оркестратор берёт первое непустое значение:

  1. executionModeOverride из тела запроса (если задан).
  2. parameters.executionMode на айтеме плана.
  3. Значение по умолчанию: 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 после закрытия последнего шага последним тестировщиком.

Связанные документы