A mutáció tesztelés a tesztkészlet minőségét értékeli úgy, hogy szándékosan kis hibákat ("mutánsokat") vezetnek be a kódba, és ellenőrzik, hogy a tesztek megkapják-e azokat. Méri, hogy a tesztek valójában milyen jók a hibák detektálásában — a lefedettségen túlmutatva, amely csak a végrehajtást méri.
A mutáció tesztelés működése
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
Miért jobb ez, mint a lefedettség
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.
Megfontolások
✓ 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.
Miért fontos
A mutáció tesztelés megértése értékes senior szintű tudás, mivel sokkal erősebb mértéket biztosít a tesztkészlet minőségére, mint a lefedettség, a lefedettség fő gyengeségét orvosolva, így hasznos a tesztkészletek értékelésének és javításának szempontjából.
Az alapvető felismerés az, hogy a lefedettség a végrehajtást méri, nem az ellenőrzést — a kód "lefedettnek" lehet (végrehajtott) olyan tesztek által, amelyek valójában nem ellenőrzik a viselkedését (gyenge vagy hiányzó értékelések), hamis bizalomságot adva. A mutáció tesztelés ezt úgy oldja meg, hogy méri, hogy a tesztek valójában megfognak-e bugokat: szándékosan kis bugokat (mutánsokat) vezetnek be a kódba, és ellenőrzik, hogy a tesztek megfogják-e azokat (a "meghalt" mutáns jó a sikertelen tesztek által; a "túlélt" mutáns azt jelenti, hogy a tesztek nem fogták meg azt a bugot).
A mutáció pontszám (az elpusztított mutánsok százaléka) sokkal erősebb jele a tesztminőségnek, mint a lefedettség, mivel azt mutatja, hogy a tesztek valójában ellenőrzik-e a viselkedést — egy túlélt mutáns feltár egy valódi hiányt (a tesztek végrehajtják a kódot, de nem ellenőrzik jól, pl. gyenge értékelések vagy nem tesztelt viselkedés), amit a lefedettség kihagyott volna.
Ennek megértése — hogy a mutáció tesztelés feltárja a gyenge teszteket, amelyek magas lefedettség mögé rejtőznek — az kulcsfontosságú érték, amely a „magas lefedettség nem garantálja a jó teszteket
