Les enseignants ont besoin de moyennes à jour immédiatement après la publication ou modification des notes, sans attendre un batch nocturne. Le système recalcule via Domain Events synchrones : statistiques d'évaluation (min/max/moyenne/médiane), moyennes matières pondérées (normalisation /20), et moyenne générale par élève. Les résultats sont stockés dans des tables dénormalisées avec cache Redis (TTL 5 min). Trois endpoints API exposent les données avec contrôle d'accès par rôle. Une commande console permet le backfill des données historiques au déploiement.
118 lines
3.1 KiB
Markdown
118 lines
3.1 KiB
Markdown
---
|
|
name: 'step-03e-subagent-performance'
|
|
description: 'Subagent: Check test performance (speed, efficiency, parallelization)'
|
|
subagent: true
|
|
outputFile: '/tmp/tea-test-review-performance-{{timestamp}}.json'
|
|
---
|
|
|
|
# Subagent 3E: Performance Quality Check
|
|
|
|
## SUBAGENT CONTEXT
|
|
|
|
This is an **isolated subagent** running in parallel with other quality dimension checks.
|
|
|
|
**Your task:** Analyze test files for PERFORMANCE violations only.
|
|
|
|
---
|
|
|
|
## MANDATORY EXECUTION RULES
|
|
|
|
- ✅ Check PERFORMANCE only (not other quality dimensions)
|
|
- ✅ Output structured JSON to temp file
|
|
- ❌ Do NOT check determinism, isolation, maintainability, or coverage
|
|
|
|
---
|
|
|
|
## SUBAGENT TASK
|
|
|
|
### 1. Identify Performance Violations
|
|
|
|
**HIGH SEVERITY Violations**:
|
|
|
|
- Tests not parallelizable (using test.describe.serial unnecessarily)
|
|
- Slow setup/teardown (creating fresh DB for every test)
|
|
- Excessive navigation (reloading pages unnecessarily)
|
|
- No fixture reuse (repeating expensive operations)
|
|
|
|
**MEDIUM SEVERITY Violations**:
|
|
|
|
- Hard waits >2 seconds (waitForTimeout(5000))
|
|
- Inefficient selectors (page.$$ instead of locators)
|
|
- Large data sets in tests without pagination
|
|
- Missing performance optimizations
|
|
|
|
**LOW SEVERITY Violations**:
|
|
|
|
- Could use parallelization (test.describe.configure({ mode: 'parallel' }))
|
|
- Minor inefficiencies
|
|
- Excessive logging
|
|
|
|
### 2. Calculate Performance Score
|
|
|
|
```javascript
|
|
const severityWeights = { HIGH: 10, MEDIUM: 5, LOW: 2 };
|
|
const totalPenalty = violations.reduce((sum, v) => sum + severityWeights[v.severity], 0);
|
|
const score = Math.max(0, 100 - totalPenalty);
|
|
```
|
|
|
|
---
|
|
|
|
## OUTPUT FORMAT
|
|
|
|
```json
|
|
{
|
|
"dimension": "performance",
|
|
"score": 80,
|
|
"max_score": 100,
|
|
"grade": "B",
|
|
"violations": [
|
|
{
|
|
"file": "tests/e2e/search.spec.ts",
|
|
"line": 10,
|
|
"severity": "HIGH",
|
|
"category": "not-parallelizable",
|
|
"description": "Tests use test.describe.serial unnecessarily - reduces parallel execution",
|
|
"suggestion": "Remove .serial unless tests truly share state",
|
|
"code_snippet": "test.describe.serial('Search tests', () => { ... });"
|
|
},
|
|
{
|
|
"file": "tests/api/bulk-operations.spec.ts",
|
|
"line": 35,
|
|
"severity": "MEDIUM",
|
|
"category": "slow-setup",
|
|
"description": "Test creates 1000 records in setup - very slow",
|
|
"suggestion": "Use smaller data sets or fixture factories",
|
|
"code_snippet": "beforeEach(async () => { for (let i=0; i<1000; i++) { ... } });"
|
|
}
|
|
],
|
|
"passed_checks": 13,
|
|
"failed_checks": 2,
|
|
"violation_summary": {
|
|
"HIGH": 1,
|
|
"MEDIUM": 1,
|
|
"LOW": 0
|
|
},
|
|
"performance_metrics": {
|
|
"parallelizable_tests": 80,
|
|
"serial_tests": 20,
|
|
"avg_test_duration_estimate": "~2 seconds",
|
|
"slow_tests": ["bulk-operations.spec.ts (>30s)"]
|
|
},
|
|
"recommendations": [
|
|
"Enable parallel mode where possible",
|
|
"Reduce setup data to minimum needed",
|
|
"Use fixtures to share expensive setup across tests",
|
|
"Remove unnecessary .serial constraints"
|
|
],
|
|
"summary": "Good performance with 2 violations - 80% tests can run in parallel"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## EXIT CONDITION
|
|
|
|
Subagent completes when JSON output written to temp file.
|
|
|
|
**Subagent terminates here.**
|