Types de tests et structure AAA
Pyramide des tests, structure AAA, trois familles de cas.
Objectifs
À la fin de cette leçon, vous saurez :
- classer les quatre niveaux de tests ;
- écrire un test Arrange-Act-Assert ;
- savoir quoi tester en premier.
🔗 Pour vous rafraîchir la mémoire : méthodes HTTP et codes de statut
La pyramide, du bas au sommet
/ E2E \ ← parcours complets (lents, fragiles, peu nombreux)
/ API \ ← endpoints via HTTP (moyens)
/ Intégration\ ← avec vraie base (moyens)
/ Unitaires \ ← fonctions/classes isolées (rapides, nombreux)
| Niveau | Vérifie | Vitesse | Exemple |
|---|---|---|---|
| Unitaire | une unité isolée | ms | calculerFrais('carte') === 0.29 |
| Intégration | code + base réelle | s | repository crée/lit vraiment |
| API | requête HTTP complète | 10ms-s | POST /tasks → 201 + JSON |
| E2E | le système vu par l'humain | s-min | Playwright clique tout |
Plus on monte : plus de confiance, plus de coût. D'où la pyramide : beaucoup d'unitaires rapides, quelques E2E sur les parcours critiques.
AAA : la structure de tout test
it("calcule les frais carte", () => {
// Arrange — préparer
const moyen = "carte";
// Act — agir (UNE action)
const frais = calculerFrais(moyen);
// Assert — vérifier UNE attente
expect(frais).toBe(0.29);
});
Un test = un comportement, trois blocs, aucune logique conditionnelle. Si vous écrivez des if dans un test, c'est plusieurs tests.
Les cas à couvrir systématiquement
Pour chaque fonction :
1. cas nominal → l'entrée normale
2. cas limite → vide, zéro, maximum
3. erreur attendue → entrée invalide rejette correctement
describe("moyenne", () => {
it("calcule la moyenne simple", ...); // nominal
it("renvoie null pour une liste vide", ...); // limite
it("ignore les valeurs non numériques", ...); // erreur attendue
});
Ces trois lignes de description forment déjà la spécification exécutable de votre fonction — c'est aussi de la documentation qui ne ment jamais.
Quoi tester en premier
Priorité pragmatique quand tout est à faire :
- Les règles métier pures (calculs, validations) — unitaires, ROI immédiat.
- Les endpoints critiques (authentification, paiements) — niveau API.
- Le parcours d'inscription complet — un seul E2E bien choisi.
Exercice
- Classez : "le slug se génère sans accents", "POST /users renvoie 409 si doublon", "un utilisateur achète et reçoit son reçu".
- Écrivez les trois cas de
estPalindromeen AAA. - Pourquoi un E2E ne remplace-t-il pas mille unitaires ?
Résumé
- Pyramide : beaucoup d'unitaires, quelques E2E.
- AAA sans logique ; trois familles de cas par fonction.
- Commencer par le métier pur : meilleur retour sur effort.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Réponses détaillées
Question 1. Unitaire / API / E2E respectivement.
Question 3. L'E2E vérifie l'intégration mais : lent (minutes), fragile (sélecteurs UI), localise mal les fautes ("ça casse quelque part"). L'unitaire pointe LA ligne fautive en millisecondes. Les deux servent ; ils ne remplacent rien.