Outils & qualité · 4 mondes · 12 étapes
Tests & déploiement
Des tests qui attrapent les bugs, une chaîne qui vérifie tout, une mise en production sans frayeur.
Progression
0 %
0/12 étapes terminées
Fondamental · 9 min de lecture
Écrire des tests
Des tests jugés sur les bugs qu'ils attrapent
1Définition
Un test automatique prépare des données, appelle le code, puis vérifie le résultat avec des assertions qui lèvent une erreur explicite en cas d'écart. Une bonne suite couvre le cas normal, les limites et les erreurs ; on la juge aux bugs qu'elle attrape — c'est l'idée du test de mutation.
2Principes fondamentaux
01
Préparer, agir, vérifier
Trois temps lisibles dans chaque test : les données, l'appel, l'assertion.
02
Comparer des valeurs
=== compare les références des objets : l'égalité de test compare le contenu.
03
Tester les frontières
Pile au seuil, juste en dessous, vide, zéro : là où > et >= se distinguent.
04
Un échec n'arrête pas la série
Le lanceur continue, pour montrer tous les tests rouges d'un coup.
3Exemples pratiques
Avec Vitest
1import { describe, expect, it } from "vitest";2import { remise } from "./remise";3 4describe("remise", () => {5 it("applique VIP pile au seuil", () => {6 expect(remise(50, "VIP")).toBe(40);7 });8 it("refuse un prix négatif", () => {9 expect(() => remise(-5, "VIP")).toThrow();10 });11});Mêmes idées que dans le cours : des cas nommés, des assertions, et un test d'erreur attendue.
Le test de mutation automatique
1npx stryker run2# Mutant survived: src/remise.ts:4 >= → >Stryker modifie le code tout seul (inverse des conditions, change des opérateurs) et signale chaque mutant que les tests n'ont pas attrapé.
4Erreurs courantes
Un seul cas « qui marche »
À éviter
expect(remise(100, "ETE10")).toBe(90); // et c'est toutÀ faire
Normal, limites, code inconnu, erreurPourquoi : La moitié des règles n'est jamais vérifiée.
Comparer des objets avec toBe
À éviter
expect(panier).toBe([{ prix: 10 }]);À faire
expect(panier).toEqual([{ prix: 10 }]);Pourquoi : toBe compare les références : deux tableaux identiques sont différents.
Tester l'implémentation
À éviter
expect(fonctionInterne).toHaveBeenCalled();À faire
expect(resultat).toBe(40);Pourquoi : Un test lié aux détails casse à chaque réécriture, même quand le comportement ne change pas.
5Subtilités à connaître
- ◆Le taux de couverture dit quelles lignes ont été exécutées, pas si elles ont été vérifiées : une suite peut couvrir 100 % du code sans une seule assertion utile.
- ◆Écrire le test avant le code (TDD) oblige à penser aux cas avant d'être influencé par sa propre implémentation.
- ◆Un test qui échoue doit dire pourquoi : « Attendu 40, reçu 50 » se corrige en une minute, « false is not true » en une heure.
6Vérifie ta compréhension
Question 1/3
Score 0
Quel cas attrape un > écrit à la place de >= ?
Envie d'essayer ? Ouvre le Labo et recopie les exemples pour les modifier.