🔒 SYSTEM REQUIREMENTS
Перед выполнением агент ОБЯЗАН загрузить: .claude/protocols/gardener.md
SDET: API Automation (Kotlin)
<purpose> Генерирует полный набор Kotlin-автотестов для REST API: модели, HTTP-клиент, хелперы, тесты. Источник сценариев — `audit/test-scenarios.md` (результат /test-cases) или спецификация напрямую. </purpose>Когда использовать
- •Есть
audit/test-scenarios.mdс матрицей сценариев — покрыть их автотестами - •Нужно написать тесты для нового endpoint с нуля
- •Ревью существующих тестов на соответствие стандартам (
reviewarg)
Protocol
- •Stack: HTTP-клиент = Ktor
HttpClient(CIO)инициализируется вrequests/слое (не в тестах) черезby lazy(LazyThreadSafetyMode.SYNCHRONIZED). JUnit5 +@ParameterizedTest(junit-jupiter-params), Awaitility, Ktor Logging (LogLevel.ALL), JSON Schema Validator, Faker (генерация данных в TestData). - •BANNED:
Thread.sleep,delay,runBlocking(используйrunTest),HttpClient(в*Tests.kt(inline HTTP в тестах), manual@AllureId,shouldBe(useassertEquals), comments. - •Security Headers Rule: Каждый POS-тест (POST/PUT/DELETE с 2xx) обязан проверять
Content-Type,X-Content-Type-Options,Strict-Transport-SecurityчерезassertEqualsнаresponse.headers. - •Structure:
- •
requests/: DTOs (@JsonNaming) + Request-объекты. - •
helpers/:@Stepannotated flows. - •
tests/:@Epic(из названия фичи/пакета),@Feature(из названия эндпоинта),@Severity,@DisplayName.@AllureId— НЕ генерируется: проставляется вручную или через утилиту после привязки к TMS.
- •
- •Gates:
compileTestKotlin,ktlintCheck.
Input Source Strategy
Primary Source: audit/test-scenarios.md — результат /test-cases. Каждая строка таблицы → автотест.
Secondary Source: Спецификация напрямую — если test-scenarios.md отсутствует.
Input Validation (Mandatory Check)
КРИТИЧНО: Перед началом генерации выполни 2-фазную проверку.
Фаза 1: Проверка наличия test-scenarios (Primary Source)
[ -f audit/test-scenarios.md ] || echo "WARNING"
Если файл отсутствует:
⚠️ WARNING: audit/test-scenarios.md не найден. Продолжаю без pre-built сценариев.
Фаза 2: Проверка наличия строк таблицы (защита от пустого файла)
grep -q "^|" audit/test-scenarios.md || echo "WARNING"
Если строки таблицы не найдены:
⚠️ WARNING: test-scenarios.md существует, но не содержит строк таблицы. Продолжаю с пустой базой.
Если все проверки пройдены:
- •Read
audit/test-scenarios.md— извлеки все строки таблицы (каждая строка = один автотест) - •Прочитай
audit/test-plan.md(если существует) для приоритизации порядка генерации (P0 → P1 → P2)
Parsing test-scenarios.md
- •Читай
audit/test-scenarios.md - •Для каждой строки таблицы извлекай: ID, Type, Scenario, Input, Expected
- •BVA-значения из колонки Input → переноси в автотест ТОЧНО
- •Порядок генерации: по приоритету из
audit/test-plan.md(если есть) или строка за строкой
Если User запрашивает endpoint без сценариев в таблице:
⚠️ WARNING: No scenarios for {endpoint} in audit/test-scenarios.md. Продолжаю без сценариев для этого endpoint.
Verbosity Protocol
Code first, talk later: Генерация → Compilation → Post-Check → SKILL COMPLETE. Нет промежуточных explanation.
Запрещено:
- •"I will now create..." — просто Create
- •"The test covers..." — покрытие идёт в SKILL COMPLETE метрику
- •"Let me fix..." — просто Fix и Compile
- •Explanation после каждого файла — группируй все файлы → один compilation attempt
Разрешено:
- •Compilation errors — показывай stderr, не описание
- •SKILL COMPLETE — метрики (Coverage, Compilation status)
Post-Check: Inline (5 строк), проверка против BANNED list и Quality Gates.
Mandatory Checks:
grep -r "Thread.sleep\|delay(\|runBlocking\|shouldBe\|//\|body<\|@AllureId(" src/test/kotlin/
grep -rl "HttpClient(" src/test/kotlin/ | grep "Tests\.kt$"
grep -r "Map<String, Any>" src/test/kotlin/
⛔ Любой match → FAIL, применить anti-pattern fix:
| Pattern | ref |
|---|---|
Thread.sleep / delay( | platform/flaky-sleep-tests.md |
runBlocking | platform/coroutine-test-return-type.md |
shouldBe | common/assertion-without-message.md |
HttpClient( в *Tests.kt | api/inline-http-calls.md — перенести в requests/ |
body< | api/map-instead-of-dto.md |
@AllureId( | sdet.md:131 — только ./gradlew assignAllureIds |
Map<String, Any> | api/map-instead-of-dto.md |
Quality Gates:
- •Каждый мутирующий POS-тест (POST/PUT/DELETE) содержит проверку Side Effects: состояние БД (
DB:), события в очереди или Cache — через вызов Helper-метода. - •Все NEG-тесты проверяют не только HTTP-код, но и бизнес-код ошибки (
assertEquals(expectedCode, response.body.code, "error code mismatch")). - •No duplication: логика создания сущностей — только в Helpers; логика данных — только в TestData/FakerService. Inline-строки в тестах запрещены.
Workflow
- •Input Check (MANDATORY):
- •Выполни 2-фазную проверку test-scenarios (см. Input Validation выше)
- •Если любая фаза FAIL → выведи ⚠️ WARNING и продолжи с доступными данными
- •Если все проверки PASS → Read
audit/test-scenarios.md
- •Discovery:
- •Read
CLAUDE.md,build.gradle.kts. - •Read
audit/test-scenarios.md(Primary Source) → извлеки все строки таблицы. - •Glob
src/**/*Test*.kt,src/**/requests/**/*.kt(для контекста уже существующих паттернов). - •Прочитай
audit/test-plan.md(если существует) — только для определения приоритетов P0/P1/P2. - •Style Analysis: Glob
src/**/models/**/*.kt. Если поля уже используют snake_case без@JsonNaming→ НЕ добавляй@JsonNamingв генерируемые модели. Прочитайsrc/**/TestBase.kt— используй те же суперклассы, аннотации уровня класса и import-ы. - •Print Summary: N сценариев найдено, M endpoint-ов в плане, стиль моделей: [SnakeCase/Native].
- •Read
- •Plan & Gen:
- •Источник сценариев: строки таблицы из
audit/test-scenarios.md. - •Порядок: по приоритету из test-plan.md (P0 → P1 → P2). Если test-plan.md отсутствует — строка за строкой.
- •Check
references/api-patterns.mdfor specific logic (Auth/CRUD/Page). - •Для каждой строки таблицы генерируй один автотест:
- •Реализуй Input как параметры HTTP-запроса
- •Реализуй Expected как assertions (HTTP status + logic)
- •Перенеси BVA-значения из колонки Input ТОЧНО (граничные значения нельзя округлять или менять)
- •Добавь
@Link(name = "Scenario {ID}", url = "file://audit/test-scenarios.md")— обязательно
- •Phase 1: Stateless (Validation, Auth fail).
- •Phase 2: 1-step setup (CRUD, simple flows).
- •Phase 3: Multi-step (Helpers, State transitions).
- •Источник сценариев: строки таблицы из
- •Translation & Grouping: Применяй маппинг из
references/api-patterns.md#translation-rules. Группировку NEG/BVA — изapi-patterns.md#grouping-strategy. - •Compile:
./gradlew compileTestKotlin && ./gradlew ktlintCheck. Если > 1 неудачных компиляций → ESCALATION (см. ниже) - •Verify: Grep BANNED patterns (см. Post-Check выше). Fix violations → re-compile.
Escalation (3-Strike Rule)
Если > 1 неудачных компиляций на одном endpoint: Активируй Escalation Protocol (определён в Agent Prompt). EXIT с ⚠️ SKILL PARTIAL.
Review Mode (review arg)
- •Read
src/test/**/*.kt. - •Check against Protocol +
references/api-patterns.md#architecture+qa-antipatterns/_index.md. - •Report:
⛔ Violation (ref: antipattern)/✅ Pass. DO NOT EDIT.
References
- •Architecture & patterns:
references/api-patterns.md(Architecture, Translation Rules, Coverage Matrix, Grouping) - •Code examples:
references/examples.md - •Anti-patterns:
.claude/qa-antipatterns/_index.md→platform/,api/,common/,security/
Completion Contract
Success (Full Coverage)
✅ SKILL COMPLETE: /api-tests ├─ Артефакты: src/main/kotlin/**/ (requests, helpers, config) + src/test/kotlin/autotests/**/ (tests) ├─ Compilation: PASS ├─ Source: audit/test-scenarios.md (N сценариев) ├─ Context: audit/test-plan.md (P0: X endpoints, P1: Y endpoints) | "нет" ├─ Coverage: N/M сценариев реализовано (NN%) ├─ Traceability: @Link(scenario ID) в N/N тестах (100% обязательно) └─ BANNED check: PASS
Partial (With Blockers)
⚠️ SKILL PARTIAL: /api-tests
├─ Артефакты: [{file1}.kt (✅), {file2}.kt (❌)]
├─ Compilation: PARTIAL (X/Y files)
├─ Source: audit/test-scenarios.md (N сценариев)
├─ Coverage: X/N сценариев реализовано (NN%)
├─ Blockers: 1 UNIMPLEMENTABLE (см. ESCALATION выше)
├─ Traceability: @Link присутствует в X/Y успешных автотестах
└─ Status: BLOCKED, требуется решение Orchestrator
Когда использовать SKILL PARTIAL:
- •После 3 неудачных компиляций на одном endpoint (Escalation)
- •Техническая блокировка (библиотека не поддерживает feature)
- •Неполная спецификация для одного endpoint (остальные покрыты)