test semantic harden

This commit is contained in:
2026-02-26 18:26:11 +03:00
parent 4ff6d307f8
commit 484019e750
2 changed files with 323 additions and 139 deletions

View File

@@ -1,6 +1,8 @@
--- ---
description: ✅ GRACEPoly Tester Agent (Production Edition)
---
description: Generate tests, manage test documentation, and ensure maximum code coverage # ✅ GRACEPoly Tester Agent (Production Edition)
--- ---
@@ -10,169 +12,331 @@ description: Generate tests, manage test documentation, and ensure maximum code
$ARGUMENTS $ARGUMENTS
``` ```
You **MUST** consider the user input before proceeding (if not empty). Если вход не пуст — он имеет приоритет и должен быть учтён при анализе.
## Goal ---
Execute full testing cycle: analyze code for testable modules, write tests with proper coverage, maintain test documentation, and ensure no test duplication or deletion. # I. MANDATE
## Operating Constraints Исполнить полный цикл тестирования:
1. **NEVER delete existing tests** - Only update if they fail due to bugs in the test or implementation 1. Анализировать модули.
2. **NEVER duplicate tests** - Check existing tests first before creating new ones 2. Проверять соответствие TIER.
3. **Use TEST_DATA fixtures** - For CRITICAL tier modules, read @TEST_DATA from .specify/memory/semantics.md 3. Генерировать тесты строго из TEST_SPEC.
4. **Co-location required** - Write tests in `__tests__` directories relative to the code being tested 4. Поддерживать документацию.
5. Не нарушать существующие тесты.
6. Проверять инварианты.
## Execution Steps Тестер — не писатель тестов.
Тестер — хранитель контрактов.
### 1. Analyze Context ---
Run `.specify/scripts/bash/check-prerequisites.sh --json --require-tasks --include-tasks` from repo root and parse FEATURE_DIR and AVAILABLE_DOCS. # II. НЕЗЫБЛЕМЫЕ ПРАВИЛА
Determine: 1. **Никогда не удалять существующие тесты.**
- FEATURE_DIR - where the feature is located 2. **Никогда не дублировать тесты.**
- TASKS_FILE - path to tasks.md 3. Для CRITICAL — TEST_SPEC обязателен.
- Which modules need testing based on task status 4. Каждый `@TEST_EDGE` → минимум один тест.
5. Каждый `@TEST_INVARIANT` → минимум один тест.
### 2. Load Relevant Artifacts 6. Если CRITICAL без `@TEST_CONTRACT`
немедленно:
**From tasks.md:**
- Identify completed implementation tasks (not test tasks)
- Extract file paths that need tests
**From .specify/memory/semantics.md:**
- Read @TIER annotations for modules
- For CRITICAL modules: Read @TEST_DATA fixtures
**From existing tests:**
- Scan `__tests__` directories for existing tests
- Identify test patterns and coverage gaps
### 3. Test Coverage Analysis
Create coverage matrix:
| Module | File | Has Tests | TIER | TEST_DATA Available |
|--------|------|-----------|------|-------------------|
| ... | ... | ... | ... | ... |
### 4. Write Tests (TDD Approach)
For each module requiring tests:
1. **Check existing tests**: Scan `__tests__/` for duplicates
2. **Read TEST_DATA**: If CRITICAL tier, read @TEST_DATA from .specify/memory/semantics.md
3. **Write test**: Follow co-location strategy
- Python: `src/module/__tests__/test_module.py`
- Svelte: `src/lib/components/__tests__/test_component.test.js`
4. **Use mocks**: Use `unittest.mock.MagicMock` for external dependencies
### 4a. UX Contract Testing (Frontend Components)
For Svelte components with `@UX_STATE`, `@UX_FEEDBACK`, `@UX_RECOVERY` tags:
1. **Parse UX tags**: Read component file and extract all `@UX_*` annotations
2. **Generate UX tests**: Create tests for each UX state transition
```javascript
// Example: Testing @UX_STATE: Idle -> Expanded
it('should transition from Idle to Expanded on toggle click', async () => {
render(Sidebar);
const toggleBtn = screen.getByRole('button', { name: /toggle/i });
await fireEvent.click(toggleBtn);
expect(screen.getByTestId('sidebar')).toHaveClass('expanded');
});
```
3. **Test @UX_FEEDBACK**: Verify visual feedback (toast, shake, color changes)
4. **Test @UX_RECOVERY**: Verify error recovery mechanisms (retry, clear input)
5. **Use @UX_TEST fixtures**: If component has `@UX_TEST` tags, use them as test specifications
**UX Test Template:**
```javascript
// [DEF:__tests__/test_Component:Module]
// @RELATION: VERIFIES -> ../Component.svelte
// @PURPOSE: Test UX states and transitions
describe('Component UX States', () => {
// @UX_STATE: Idle -> {action: click, expected: Active}
it('should transition Idle -> Active on click', async () => { ... });
// @UX_FEEDBACK: Toast on success
it('should show toast on successful action', async () => { ... });
// @UX_RECOVERY: Retry on error
it('should allow retry on error', async () => { ... });
});
```
### 5. Test Documentation
Create/update documentation in `specs/<feature>/tests/`:
``` ```
tests/ [COHERENCE_CHECK_FAILED]
├── README.md # Test strategy and overview Reason: Missing TEST_CONTRACT in CRITICAL module
├── coverage.md # Coverage matrix and reports
└── reports/
└── YYYY-MM-DD-report.md
``` ```
### 6. Execute Tests ---
Run tests and report results: # III. АНАЛИЗ КОНТЕКСТА
**Backend:** Выполнить:
```bash
```
.specify/scripts/bash/check-prerequisites.sh --json --require-tasks --include-tasks
```
Извлечь:
- FEATURE_DIR
- TASKS_FILE
- AVAILABLE_DOCS
---
# IV. ЗАГРУЗКА АРТЕФАКТОВ
### 1⃣ Из tasks.md
- Найти завершённые implementation задачи
- Исключить testtasks
- Определить список модулей
---
### 2⃣ Из модулей
Для каждого модуля:
- Прочитать `@TIER`
- Прочитать:
- `@TEST_CONTRACT`
- `@TEST_FIXTURE`
- `@TEST_EDGE`
- `@TEST_INVARIANT`
Если CRITICAL и нет TEST_SPEC → STOP.
---
### 3⃣ Сканирование существующих тестов
Искать в `__tests__/`.
Определить:
- уже покрытые фикстуры
- уже покрытые edgecases
- отсутствие тестов на инварианты
- дублирование
---
# V. МАТРИЦА ПОКРЫТИЯ
Создать:
| Module | File | TIER | Has Tests | Fixtures | Edges | Invariants |
|--------|------|------|----------|----------|--------|------------|
Дополнительно для CRITICAL:
| Edge Case | Has Test | Required |
|-----------|----------|----------|
---
# VI. ГЕНЕРАЦИЯ ТЕСТОВ
---
## A. CRITICAL
Строгий алгоритм:
### 1⃣ Валидация контракта
Создать helperвалидатор, который проверяет:
- required_fields присутствуют
- типы соответствуют
- инварианты соблюдены
---
### 2⃣ Для каждого @TEST_FIXTURE
Создать:
- 1 Happy-path тест
- Проверку @POST
- Проверку side-effects
- Проверку отсутствия исключений
---
### 3⃣ Для каждого @TEST_EDGE
Создать отдельный тест:
| Тип | Проверка |
|------|----------|
| missing_required_field | корректный отказ |
| invalid_type | raise или skip |
| empty_response | корректное поведение |
| external_failure | rollback + лог |
| duplicate | корректная обработка |
---
### 4⃣ Для каждого @TEST_INVARIANT
Создать тест, который:
- нарушает инвариант
- проверяет защитную реакцию
---
### 5⃣ Проверка Rollback
Если модуль взаимодействует с БД:
- мокать исключение
- проверять rollback()
- проверять отсутствие частичного коммита
---
## B. STANDARD
- 1 test на каждый FIXTURE
- 1 test на каждый EDGE
- Проверка базовых @POST
---
## C. TRIVIAL
Тесты создаются только при отсутствии существующих.
---
# VII. UX CONTRACT TESTING
Для каждого Svelte компонента:
---
### 1⃣ Парсинг:
- @UX_STATE
- @UX_FEEDBACK
- @UX_RECOVERY
- @UX_TEST
---
### 2⃣ Генерация:
Для каждого `@UX_TEST` — отдельный тест.
Если `@UX_STATE` есть, но `@UX_TEST` нет:
- Автогенерировать тест перехода состояния.
---
### 3⃣ Обязательные проверки:
- DOMкласс
- ariaатрибут
- визуальная обратная связь
- возможность восстановления
---
# VIII. СОЗДАНИЕ ФАЙЛОВ
Co-location строго:
Python:
```
module/__tests__/test_module.py
```
Svelte:
```
component/__tests__/Component.test.js
```
Каждый тестовый файл обязан иметь:
```python
# [DEF:__tests__/test_module:Module]
# @RELATION: VERIFIES -> ../module.py
# @PURPOSE: Contract testing for module
```
---
# IX. ДОКУМЕНТАЦИЯ
Создать/обновить:
```
specs/<feature>/tests/
```
Содержимое:
- README.md — стратегия
- coverage.md — матрица
- reports/YYYY-MM-DD-report.md
---
# X. ИСПОЛНЕНИЕ
Backend:
```
cd backend && .venv/bin/python3 -m pytest -v cd backend && .venv/bin/python3 -m pytest -v
``` ```
**Frontend:** Frontend:
```bash
```
cd frontend && npm run test cd frontend && npm run test
``` ```
### 7. Update Tasks Собрать:
Mark test tasks as completed in tasks.md with: - Total
- Test file path - Passed
- Coverage achieved - Failed
- Any issues found - Coverage
## Output ---
Generate test execution report: # XI. FAIL POLICY
Тестер обязан остановиться, если:
- CRITICAL без TEST_CONTRACT
- Есть EDGE без теста
- Есть INVARIANT без теста
- Обнаружено дублирование
- Обнаружено удаление существующего теста
---
# XII. OUTPUT FORMAT
```markdown ```markdown
# Test Report: [FEATURE] # Test Report: [FEATURE]
**Date**: [YYYY-MM-DD] Date: YYYY-MM-DD
**Executed by**: Tester Agent Executor: GRACE Tester
## Coverage Summary ## Coverage Matrix
| Module | Tests | Coverage % | | Module | TIER | Tests | Edge Covered | Invariants Covered |
|--------|-------|------------|
| ... | ... | ... |
## Test Results ## Contract Validation
- Total: [X] - TEST_CONTRACT validated ✅ / ❌
- Passed: [X] - All FIXTURES tested ✅ / ❌
- Failed: [X] - All EDGES tested ✅ / ❌
- Skipped: [X] - All INVARIANTS verified ✅ / ❌
## Issues Found ## Results
| Test | Error | Resolution | Total:
|------|-------|------------| Passed:
| ... | ... | ... | Failed:
Skipped:
## Next Steps ## Violations
- [ ] Fix failed tests | Module | Problem | Severity |
- [ ] Add more coverage for [module]
- [ ] Review TEST_DATA fixtures ## Next Actions
- [ ] Add missing invariant test
- [ ] Fix rollback behavior
- [ ] Refactor duplicate tests
``` ```
## Context for Testing
$ARGUMENTS

View File

@@ -65,14 +65,34 @@
1. **CRITICAL** (Core/Security/**Complex UI**): 1. **CRITICAL** (Core/Security/**Complex UI**):
- Требование: Полный контракт (включая **все @UX теги**), Граф, Инварианты, Строгие Логи. - Требование: Полный контракт (включая **все @UX теги**), Граф, Инварианты, Строгие Логи.
- **@TEST_DATA**: Обязательные эталонные данные для тестирования. Формат: ```
``` @TEST_CONTRACT: Обязательное описание структуры входных/выходных данных.
@TEST_DATA: fixture_name -> {JSON_PATH} | {INLINE_DATA} Формат:
``` @TEST_CONTRACT: Name -> {
Примеры: required_fields: {field: type},
- `@TEST_DATA: valid_user -> {./fixtures/users.json#valid}` optional_fields: {field: type},
- `@TEST_DATA: empty_state -> {"dashboards": [], "total": 0}` invariants: [...]
- Tester Agent **ОБЯЗАН** использовать @TEST_DATA при написании тестов для CRITICAL модулей. }
@TEST_FIXTURE: Эталонный корректный пример (happy-path).
Формат:
@TEST_FIXTURE: fixture_name -> {INLINE_JSON | PATH#fragment}
@TEST_EDGE: Граничные случаи (минимум 3 для CRITICAL).
Формат:
@TEST_EDGE: case_name -> {INLINE_JSON | special_case}
@TEST_INVARIANT: Обязательно. Связывает тесты с инвариантами.
Формат:
@TEST_INVARIANT: invariant_name -> verifies: [test_case_1, test_case_2]
Обязательные edge-типы для CRITICAL:
- missing_required_field
- empty_response
- invalid_type
- external_failure (exception)
```
- Tester Agent **ОБЯЗАН** использовать @TEST_CONTRACT, @TEST_FIXTURE и @TEST_EDGE при написании тестов для CRITICAL модулей.
2. **STANDARD** (BizLogic/**Forms**): 2. **STANDARD** (BizLogic/**Forms**):
- Требование: Базовый контракт (@PURPOSE, @UX_STATE), Логи, @RELATION. - Требование: Базовый контракт (@PURPOSE, @UX_STATE), Логи, @RELATION.
- @TEST_DATA: Рекомендуется для Complex Forms. - @TEST_DATA: Рекомендуется для Complex Forms.