Mutation Testing

Details
Auch bekannt als

Mutationsanalyse, Fehlerbasiertes Testen

Kernkonzepte:

Testqualitätsbewertung

Bewertung, wie effektiv Tests Fehler erkennen

Code-Mutationen

Absichtliches Einführen kleiner, syntaktischer Änderungen (Mutanten) in Quellcode

Mutationsoperatoren

Regeln zur Erstellung von Mutanten (z.B. > zu >= ändern, Boolean umkehren, Anweisung entfernen)

Getötete Mutanten

Mutationen, die durch fehlschlagende Tests erkannt wurden (gut)

Überlebende Mutanten

Mutationen, die von Tests nicht erkannt wurden (zeigt Testschwäche an)

Äquivalente Mutanten

Mutationen, die das Programmverhalten nicht ändern (Falsch-Positive)

Mutations-Score

Prozentsatz getöteter Mutanten: (getötet / (gesamt - äquivalent)) × 100%

Mutationen erster Ordnung

Einzelne atomare Änderung pro Mutant

Mutationen höherer Ordnung

Mehrere kombinierte Änderungen

Schwache Mutation

Test muss nur unterschiedlichen internen Zustand erzeugen

Starke Mutation

Test muss unterschiedliche finale Ausgabe erzeugen

Testadäquatheitskriterium

"Sind die Tests gut genug?" nicht nur "Ist die Abdeckung hoch genug?"

Schlüsselvertreter

Richard Lipton (theoretische Grundlage, 1971), Richard DeMillo, Timothy Budd

Wichtige Werkzeuge:

  • PITest (Java)

  • Stryker (JavaScript/TypeScript, C#, Scala)

  • Mutmut (Python)

  • Infection (PHP)

  • Mull (C/C++)

Wann zu verwenden:

  • Bewertung der Testsuit-Qualität über Abdeckungsmetriken hinaus

  • Identifizierung von Lücken in Test-Assertions

  • Kritische Systeme, die hohes Testvertrauen erfordern

  • Ergänzung der Code-Abdeckung als Qualitätsmetrik

  • Refactoring von Legacy-Code mit bestehenden Tests

  • Lehre effektiver Testpraktiken

  • Kontinuierliche Verbesserung der Testeffektivität

Praktische Herausforderungen:

Rechenkosten

N Mutationen × M Tests = teuer

Äquivalente-Mutanten-Problem

Schwierig, funktional identische Mutanten automatisch zu erkennen

Zeitinvestition

Kann bei großen Codebasen langsam sein

Abhilfestrategien

Selektive Mutation, Mutations-Sampling, inkrementelle Analyse

Beziehung zu anderen Praktiken:

Code-Abdeckung

Mutations-Testing zeigt, dass hohe Abdeckung ≠ gute Tests

TDD

Starkes TDD erzeugt oft natürlich hohe Mutations-Scores

Property-based Testing

Orthogonale, aber komplementäre Ansätze

Fault Injection

Ähnliches Konzept, angewendet auf Produktionssysteme