Zum Inhalt springen
SDETRole
SDETRole

Glossar · Testgrundlagen

Mutationstest

Englisch: Mutation testing

Auch genannt: Mutationstesten, Mutationsanalyse, Mutation Score

Definition

Eine Technik, die kleine, absichtliche Fehler (Mutanten) in den Code einbaut und die Tests erneut ausführt, um zu messen, ob die Suite Fehler tatsächlich erkennt.

Mutationstesten testet Ihre Tests. Ein Tool erzeugt viele Kopien des Codes, jede mit einer kleinen Änderung, etwa >= zu >, + zu - oder einen Methodenrumpf, der durch return null ersetzt wird. Jede geänderte Kopie ist ein Mutant. Die Testsuite läuft gegen jeden Mutanten. Schlägt mindestens ein Test fehl, ist der Mutant getötet (killed). Bestehen alle Tests weiterhin, hat der Mutant überlebt (survived), und das bedeutet: Die Tests würden diesen Bug nicht bemerken.

Mutation Score = getötete Mutanten / alle Mutanten (ohne äquivalente Mutanten).

Beispiel

boolean isAdult(int age) {
    return age >= 18;
}

Tests: isAdult(30) ist true, isAdult(10) ist false. Zeilen- und Zweigabdeckung liegen beide bei 100 %.

Das Tool erzeugt einen Mutanten mit age > 18. Beide Tests bestehen weiterhin, der Mutant überlebt also. Das deckt einen fehlenden Grenzwerttest auf: Niemand hat isAdult(18) geprüft. Wird dieser Test ergänzt, ist der Mutant getötet. Die Codeabdeckung konnte Ihnen das nicht sagen; Mutationstesten schon.

Tools

  • Java: PIT (pitest), mit Plugins für Maven und Gradle und Unterstützung für JUnit 5.
  • JavaScript/TypeScript: StrykerJS, das es auch in Versionen für .NET und Scala gibt.
  • Python: mutmut und Cosmic Ray.

Praktische Grenzen

  • Kosten. Jeder Mutant bedeutet einen Testlauf. Tools reduzieren das, indem sie nur die Tests ausführen, die die mutierte Zeile abdecken, und inkrementell nur auf geändertem Code laufen, trotzdem ist es deutlich langsamer als ein normaler Lauf. Die meisten Teams führen es nächtlich oder für geänderte Dateien in einem Pull Request aus, nicht bei jedem Commit für die gesamte Codebasis.
  • Äquivalente Mutanten. Manche Änderungen verändern das Verhalten überhaupt nicht, zum Beispiel i < n zu i != n in einer Schleife, in der i von unterhalb n immer um eins hochzählt. Kein Test kann solche Mutanten töten, daher müssen sie von Hand geprüft und ausgeschlossen werden.
  • Am besten auf Unit-Ebene. Mutationstesten ist für schnelle, deterministische Unit-Tests gedacht. Es gegen langsame UI-Tests laufen zu lassen, ist selten praktikabel.

Nutzen Sie überlebende Mutanten als To-do-Liste für fehlende Assertions, besonders in der Geschäftslogik, statt einem perfekten Score hinterherzujagen.

Tippen Sie, um SDETRole zu durchsuchen.

Volltextsuche mit Pagefind · läuft in Ihrem Browser Suchseite öffnen →