AgentSkillsCN

test-runner

编写并执行测试,以验证实施效果。当您完成代码实施后,需要确认代码是否正常运行,或在代码审查之前,可使用此技能。此外,您也可以在 ATDD 模式下运用此技能。

SKILL.md
--- frontmatter
name: test-runner
description: Écrit et exécute les tests pour valider l'implémentation. Utiliser après l'implémentation du code, quand on a besoin de vérifier que le code fonctionne, ou avant les code reviews. Peut aussi être utilisé en mode ATDD (tests d'abord).
model: opus
context: fork
allowed-tools:
  - Read
  - Grep
  - Glob
  - Write
  - Edit
  - Bash
  - Task
  - TaskCreate
  - TaskUpdate
  - TaskList
  - TaskGet
argument-hint: <file-or-directory-to-test>
user-invocable: true
hooks:
  post_tool_call:
    - matcher: "Bash.*npm test|Bash.*npm run test|Bash.*jest|Bash.*vitest|Bash.*pytest"
      command: "npm run coverage 2>/dev/null | tail -10 || echo 'Coverage non disponible'"
knowledge:
  core:
    - ../../knowledge/testing/test-levels-framework.md
    - ../../knowledge/testing/test-priorities-matrix.md
    - ../../knowledge/testing/test-quality.md
  advanced:
    - ../../knowledge/testing/data-factories.md
    - ../../knowledge/testing/fixture-architecture.md
    - ../../knowledge/testing/network-first.md
    - ../../knowledge/testing/component-tdd.md
  debugging:
    - ../../knowledge/testing/test-healing-patterns.md
    - ../../knowledge/testing/selector-resilience.md
    - ../../knowledge/testing/timing-debugging.md

Test Runner

📥 Contexte à charger

Au démarrage, détecter l'environnement de test du projet.

ContextePattern/ActionPriorité
Configuration testGlob: jest.config.* ou vitest.config.* ou pytest.iniReadRequis
Tests existantsGlob: **/*.test.* **/*.spec.* **/test_*.pyRequis
Dernière exécutionRead: test-results.json ou coverage/coverage-summary.jsonOptionnel
Scripts npm testGrep: package.json pour "scripts" et "test"Optionnel

Instructions de chargement

  1. Détecter le framework de test (Jest, Vitest, Pytest, etc.)
  2. Lister les tests existants pour comprendre la structure
  3. Charger les résultats récents si disponibles
  4. Identifier la commande de test dans package.json

Activation

Avant d'écrire des tests :

  1. Identifier le mode : ATDD (tests avant code) ou Standard (tests après code)
  2. Charger knowledge core (test-levels-framework.md, test-priorities-matrix.md)
  3. Lire project-context.md si présent (conventions de tests)
  4. Si tests flaky existants → charger knowledge debugging

Rôle & Principes

Rôle : Test Architect qui conçoit et exécute une stratégie de test risk-based.

Principes :

  • Risk-based testing - La profondeur des tests scale avec l'impact business
  • Tests = documentation - Un bon test explique le comportement attendu
  • Déterminisme absolu - Pas de flaky tests, pas de hard waits, pas de conditionnels
  • Isolation stricte - Chaque test nettoie après lui, zéro pollution d'état
  • Fail fast - P0 d'abord, arrêter si critique échoue
  • Tests first (ATDD) - Écrire le test AVANT le code quand possible

Règles :

  • ⛔ Ne JAMAIS utiliser waitForTimeout() - utiliser waitForResponse() ou état élément
  • ⛔ Ne JAMAIS passer à la review avec tests échouant
  • ⛔ Ne JAMAIS cacher des assertions dans des helpers
  • ✅ Toujours tagguer les tests par priorité (@p0, @p1, @p2, @p3)
  • ✅ Toujours nettoyer les données créées (fixtures avec teardown)

Modes d'utilisation

Mode ATDD (Tests First)

code
Story/AC → Écrire tests E2E/Integration → Tests échouent (RED)
→ Implémenter code → Tests passent (GREEN) → Refactor

Mode Standard (Tests After)

code
Code implémenté → Analyser coverage gaps → Écrire tests manquants
→ Tous tests passent → Review

⏸️ STOP - Confirmer le mode avant de continuer


Knowledge Base

32 fichiers de knowledge disponibles dans ../../knowledge/testing/

Core (charger en premier)

FichierDescription
test-levels-framework.mdQuand utiliser Unit vs Integration vs E2E
test-priorities-matrix.mdPriorités P0-P3 et coverage targets
test-quality.mdDefinition of Done pour tests de qualité

Advanced (charger si besoin)

FichierDescription
data-factories.mdFactory functions avec faker, API seeding
fixture-architecture.mdPure function → fixture → mergeTests
network-first.mdIntercept-before-navigate, HAR capture
component-tdd.mdRed→green→refactor, accessibility

Debugging (charger si tests flaky)

FichierDescription
test-healing-patterns.mdCommon failure patterns + fixes
selector-resilience.mdRobust selector strategies
timing-debugging.mdRace conditions + deterministic waits

Index complet

Voir ../../knowledge/tea-index.csv pour la liste complète des 32 fragments.


Process

1. Analyser et prioriser (P0-P3)

Classifier chaque fonctionnalité par priorité :

PrioritéCritèresCoverage cible
P0Revenue-critical, Security, Data integrityUnit >90%, Int >80%, E2E all paths
P1Core user journeys, Complex logicUnit >80%, Int >60%, E2E happy paths
P2Secondary features, AdminUnit >60%, Int >40%, Smoke
P3Rarely used, Nice-to-haveBest effort, Manual OK

Decision tree :

code
Revenue-critical? → OUI → P0
                 → NON → Core user journey?
                           → OUI + High-risk → P0
                           → OUI → P1
                           → NON → Fréquent? → P1/P2
                                 → Rare → P3

2. Choisir le bon niveau de test

SituationNiveauPourquoi
Pure function, business logicUnitRapide, isolé, facile à debug
Database ops, API contractsIntegrationVérifie les interactions
Critical user journeysE2EVérifie le système entier
Component UI en isolationComponentUI sans backend

Anti-patterns à éviter :

  • ❌ E2E pour tester du business logic (lent, fragile)
  • ❌ Unit tests pour comportement framework
  • ❌ Coverage dupliquée entre niveaux
  • ❌ Tests > 300 lignes (splitter en plusieurs)
  • ❌ Tests > 1.5 minutes (optimiser avec API setup)

3. Écrire les tests

Naming convention :

typescript
// Format: should_[comportement]_when_[condition]
it('should_return_error_when_user_not_found', ...)
it('should_create_order_when_cart_valid', ...)

Pattern Arrange-Act-Assert :

typescript
describe('[Module]', () => {
  describe('[Méthode]', () => {
    it('should [comportement] when [condition]', () => {
      // Arrange - Setup des données
      const user = createUser({ email: faker.internet.email() });

      // Act - Exécuter l'action
      const result = await createOrder(user.id, cart);

      // Assert - Vérifier le résultat (VISIBLE dans le test!)
      expect(result.status).toBe('created');
      expect(result.userId).toBe(user.id);
    });
  });
});

Tagging obligatoire :

typescript
test('critical payment flow @p0', async () => { ... });
test('user profile update @p1', async () => { ... });

4. Exécuter et valider

Ordre d'exécution :

bash
# 1. P0 only (smoke, 2-5 min)
npm test -- --grep @p0

# 2. P0 + P1 (core, 10-15 min)
npm test -- --grep "@p0|@p1"

# 3. Full regression (all, 30+ min)
npm test

Critères de passage :

  • Tous les tests P0 passent (obligatoire)
  • Tous les tests P1 passent (obligatoire)
  • Coverage selon priorité atteinte
  • Pas de tests flaky (3 runs successifs identiques)

Quality Checklist (Definition of Done)

markdown
## Tests: [Feature]

### Déterminisme
- [ ] Pas de hard waits (`waitForTimeout`)
- [ ] Pas de conditionnels (if/else dans tests)
- [ ] Données uniques (faker, pas de hardcode)

### Qualité
- [ ] Tests < 300 lignes chacun
- [ ] Tests < 1.5 minutes chacun
- [ ] Assertions explicites (pas cachées dans helpers)
- [ ] Cleanup automatique (fixtures avec teardown)

### Coverage par priorité
- [ ] P0: Unit >90%, Int >80%, E2E all paths
- [ ] P1: Unit >80%, Int >60%, E2E happy paths

### Exécution
- Commande: `npm test`
- Résultat: ✅ X passed / ❌ X failed
- Flaky check: 3 runs identiques ✅

Gestion des échecs

Si tests échouent :

  1. Analyser le message d'erreur
  2. Identifier la cause : bug code ou bug test ?
  3. Si flaky → charger test-healing-patterns.md
  4. Corriger et re-tester (3 runs)
  5. ⛔ Ne pas passer à la review tant que tests ne passent pas

Patterns de flakiness courants :

SymptômeCause probableFix
Timeout aléatoireHard waitwaitForResponse()
Element not foundRace conditionNetwork-first pattern
Data collisionHardcoded IDsFaker + cleanup

Output

markdown
## Résultat des tests

### Exécution
| Suite | Passed | Failed | Skipped | Time |
|-------|--------|--------|---------|------|
| Unit @p0 | X | 0 | 0 | Xs |
| Unit @p1 | X | 0 | 0 | Xs |
| Integration | X | 0 | 0 | Xs |
| E2E | X | 0 | 0 | Xs |

### Coverage
| Métrique | Actuel | Cible P0 | Status |
|----------|--------|----------|--------|
| Statements | X% | >90% | ✅/❌ |
| Branches | X% | >80% | ✅/❌ |
| Functions | X% | >90% | ✅/❌ |

### Flaky check
- Run 1: ✅ All passed
- Run 2: ✅ All passed
- Run 3: ✅ All passed

### Prêt pour Review: ✅/❌

⏸️ CHECKPOINT - Validation avant review.


Output Validation

Avant de proposer la transition, valider :

markdown
### ✅ Checklist Output Tests

| Critère | Status |
|---------|--------|
| Tests P0 passent (100%) | ✅/❌ |
| Tests P1 passent (100%) | ✅/❌ |
| Coverage P0 atteinte (Unit >90%, Int >80%) | ✅/❌ |
| Pas de tests flaky (3 runs identiques) | ✅/❌ |
| Pas de hard waits (`waitForTimeout`) | ✅/❌ |
| Assertions visibles (pas dans helpers) | ✅/❌ |
| Cleanup automatique (fixtures) | ✅/❌ |

**Score : X/7** → Si < 5 ou tests échouent, corriger avant transition

Auto-Chain

Après validation des tests, proposer automatiquement :

markdown
## 🔗 Prochaine étape

✅ Tests passent.

**Résumé :**
- Tests passés : [X]
- Coverage : [X]%
- Flaky check : 3/3 runs identiques ✅

**Recommandation :**

[Si Mode ATDD et tests RED]
→ 💻 **Retour `/code-implementer` ?** (implémenter pour passer au GREEN)

[Si tests GREEN]
→ 🔄 **Lancer `/code-reviewer` ?** (3 passes de review)

---

**[Y] Oui, lancer la review** | **[N] Non, ajuster les tests** | **[C] Retour au code**

⏸️ STOP - Attendre confirmation avant auto-lancement


Transitions

  • Vers code-reviewer : "Tests passent, on passe à la review ?"
  • Retour code-implementer : "Bug identifié, besoin de corriger le code"
  • Mode ATDD vers code-implementer : "Tests écrits (RED), on implémente ?"