Mutation testing évalue la qualité d'une suite de tests en introduisant délibérément de petits bugs ("mutants") dans le code et en vérifiant si les tests les détectent. Il mesure l'efficacité réelle des tests à détecter les défauts — allant au-delà de la couverture, qui mesure uniquement l'exécution.
Comment fonctionne le mutation testing
1. A tool makes small changes (MUTATIONS) to the code, e.g.:
→ change + to -, > to >=, true to false, remove a statement, change a constant
→ each mutation = a deliberate "bug" (a MUTANT version of the code)
2. Run the TEST SUITE against each mutant:
→ tests FAIL → the mutant is "KILLED" (good — tests caught the bug) ✓
→ tests PASS → the mutant "SURVIVED" (bad — tests DIDN'T catch the bug) ✗
3. MUTATION SCORE = % of mutants killed → measures how good the tests are at catching bugs
Pourquoi c'est mieux que la couverture
COVERAGE → measures if code was EXECUTED (not if behavior was verified) → can be high with
weak tests (no real assertions)
MUTATION TESTING → measures if tests actually DETECT bugs (changes in behavior):
→ a surviving mutant reveals a GAP — tests execute that code but don't verify it well
(weak/missing assertions, untested behavior)
→ A much stronger signal of TEST QUALITY than coverage.
Considérations
✓ Reveals weak tests (high coverage but surviving mutants = false confidence)
⚠️ COMPUTATIONALLY EXPENSIVE (runs the suite many times — once per mutant) → slow
⚠️ "Equivalent mutants" (mutations that don't change behavior) → false survivors to ignore
→ Tools: Stryker (JS), PIT (Java), mutmut (Python). Use on critical code; run periodically.
Pourquoi c'est important
Comprendre le mutation testing est une connaissance précieuse au niveau senior car il fournit une mesure beaucoup plus forte de la qualité des tests que la couverture, en résolvant la faiblesse clé de la couverture, ce qui est utile pour évaluer et améliorer les suites de tests.
L'intuition fondamentale est que la couverture mesure l'exécution, pas la vérification — le code peut être "couvert" (exécuté) par des tests qui ne vérifient pas réellement son comportement (assertions faibles ou manquantes), donnant une fausse confiance. Mutation testing résout ce problème en mesurant si les tests détectent réellement les bugs : il introduit de petits bugs délibérés (mutants) dans le code et vérifie si les tests les détectent (un mutant "tué" par des tests qui échouent est bon ; un mutant "survivant" signifie que les tests n'ont pas détecté ce bug).
Le score de mutation (pourcentage de mutants tués) est un signal bien plus fort de la qualité des tests que la couverture car il révèle si les tests vérifient réellement le comportement — un mutant survivant expose une véritable lacune (les tests exécutent le code mais ne le vérifient pas bien, par exemple des assertions faibles ou un comportement non testé) que la couverture ne détecterait pas.
Comprendre cela — que le mutation testing révèle les tests faibles cachés derrière une couverture élevée — est la valeur clé, en résolvant la limitation que une couverture élevée ne garantit pas une bonne qualité de tests.
Comprendre les considérations — que c'est coûteux en calcul (exécuter la suite une fois par mutant, ce qui le rend lent), que les "mutants équivalents" (mutations ne changeant pas le comportement) sont de faux survivants à ignorer, et que des outils existent (Stryker, PIT, mutmut) — reflète une conscience pratique de quand et comment l'utiliser (sur le code critique, périodiquement, plutôt que constamment).
Puisque la qualité des tests compte vraiment (la couverture seule peut donner une fausse confiance) et que le mutation testing fournit une mesure beaucoup plus forte en vérifiant si les tests détectent réellement les bugs, et puisque comprendre cela, son avantage par rapport à la couverture, et ses considérations pratiques est utile pour évaluer et améliorer véritablement les suites de tests, comprendre le mutation testing est une connaissance précieuse au niveau senior — une technique sophistiquée pour mesurer la qualité réelle des tests, en résolvant la faiblesse clé de la couverture, et reflétant la compréhension plus profonde de l'efficacité des tests attendue pour les rôles senior préoccupés par la véritable qualité des tests, pas seulement par les chiffres de couverture.
