Blog

Lassen Sie die Mutanten nicht entkommen!

Ruben Kruiver

Ruben Kruiver

Aktualisiert Oktober 16, 2025
5 Minuten

Das Schreiben automatisierter Tests ist etwas, das jeder Entwickler tun sollte. Unit-Tests sind eine der am häufigsten verwendeten Arten. Aber woher wissen Sie, dass Sie qualitativ gute Tests schreiben? Hier kommt der Mutationstest ins Spiel. Es ist der Test, der die Tests testet. Unter normalen Umständen kann dies die einfachste Form des Testens sein und gibt einen guten Einblick in die Qualität Ihrer Unit-Tests. In diesem Blog werde ich beschreiben, was Mutationstests sind und vor allem, wie Sie die Mutanten nicht entkommen lassen!

Unit-Tests und Codeabdeckung

Um Mutationstests zu verstehen, müssen wir zunächst kurz auf Unit-Tests und Codeabdeckung eingehen. Wenn Sie Code schreiben, sollten Sie immer darauf achten, dass genügend Unit-Tests geschrieben werden. Es gibt eine etwas willkürliche Zahl, die dem Pareto-Prinzip entnommen ist und besagt, dass 80% des Codes durch Unit-Tests abgedeckt sein sollten. Ich persönlich bin mit dieser Aussage nicht einverstanden und rate immer dazu, eine 100%ige Codeabdeckung anzustreben. Dies mit einer Einschränkung, aber die 80% sind zu willkürlich. Sie kann bereits erreicht werden, indem man die einfachsten Tests schreibt und sie mit einigen der schwierigeren Tests auffüllt. Das kann bei Code-Reviews ans Licht kommen, wird aber auch oft übersehen. Daher bin ich der Meinung, dass Sie, wenn Sie keinen Test für einen Teil des Codes schreiben wollen, diesen aus Ihrer Codeabdeckung ausschließen sollten. Auf diese Weise können sich andere bei Code-Reviews eine Meinung dazu bilden. Sie haben sich bewusst überlegt, was Sie testen wollen und was nicht.

Warum Sie Mutationstests verwenden sollten

Beim Testen geht es darum, Vertrauen zu schaffen. Dieses Vertrauen ist notwendig, um sicherzustellen, dass Sie Ihren Dienst bei Ihren Kunden konsistent einsetzen können. Ein wichtiger Aspekt dabei ist, dass der Dienst 'immer' erwartungsgemäß reagiert und stabil ist. Als Entwickler sind Sie für das Schreiben der automatisierten Tests für den von Ihnen geschriebenen Code verantwortlich. Wie können Sie überprüfen, ob die Tests, die Sie geschrieben haben, auch wirklich gut sind? Das ist der Punkt, an dem Mutationstests glänzen.

Was sind Mutationstests?

Mutationstests sind eine Form des vollautomatischen Testens, die Ihren Quellcode, Ihre Unit-Tests und Ihre Codeabdeckung verwenden. Das Einzige, was Sie brauchen, ist, dass Sie Ihrem Testtool alle notwendigen Informationen zur Verfügung stellen (Pfade, Abdeckungsberichte usw.). Anhand dieser Informationen versucht das Mutationstest-Tool, Teile des Codes zu finden, die verändert werden können. Dies wird als Mutation bezeichnet.

Beispiel

Sehen Sie sich das folgende Beispiel an.


if (x > 0) {
  print("X is a valid number");
}

Das Tool für Mutationstests wird versuchen, sie zu ändern und die entsprechenden Tests erneut durchführen.


if (x >= 0) {
  print("X is a valid number");
}

Wie Sie sehen, kann dies den Fluss Ihres Codes drastisch verändern, da er unerwartet in eine Verzweigung eintreten kann. Dies ist ein sehr einfaches Beispiel, aber diese Art von Fehlern kann leicht versehentlich gemacht werden. Das Tool für Mutationstests wird diese Art von Änderungen im gesamten zu testenden Code vornehmen. Es sammelt aus dem Codeabdeckungsbericht die Einheitstests, die zum Testen eines bestimmten Codestücks gemeldet wurden, und führt die Tests erneut aus. Wenn keiner der Tests bei der Änderung fehlschlägt, kann diese Änderung versehentlich vorgenommen und ein Fehler unwissentlich eingeführt werden. Dies wird als "entgangener Mutant" bezeichnet. Wenn mindestens ein Test fehlschlägt, dann haben wir die Mutante getötet. Ein anderes Ergebnis kann sein, dass die Änderung zu fehlerhaftem Code oder Endlosschleifen führt. Diese werden in der Regel markiert und ignoriert.

Was mit entkommenen Mutanten zu tun ist

Wenn Ihr Mutationstestprogramm seine Tests abgeschlossen hat, erhalten Sie einen Bericht mit den Ergebnissen. In der Regel enthält der Bericht eine Liste der genauen Änderungen, die bei entkommenen Mutanten vorgenommen wurden. Anhand dieses Berichts sollten Sie Ihre Tests überprüfen und entweder die notwendigen Änderungen an mindestens einem der Tests vornehmen, um die Mutation abzudecken, oder einen zusätzlichen Test für diese Mutation hinzufügen. Mein Rat wäre, 100% mutantenfreie Tests anzustreben, denn: Wie wollen Sie entscheiden, welche Mutation nicht wichtig ist, wenn Sie bereits bewusst entschieden haben, welcher Test wichtig ist?

Wo Sie Mutationstests durchführen können

Mutationstests werden in der Testpipeline durchgeführt, direkt nach der Phase, in der Sie Ihre Unit-Tests ausgeführt und Ihren Code Coverage Report gesammelt haben. Natürlich sollte dies vor der Deployment-Pipeline geschehen. Im Allgemeinen sollten alle Testpipelines abgeschlossen sein, bevor eine Zusammenführung mit dem Hauptzweig erlaubt wird. Sobald der Code im Hauptzweig ist, sollte er bereits validiert worden sein.

Tools für Mutationstests

Natürlich können Sie auch Ihre bevorzugte Suchmaschine verwenden, um nach einem Tool für Ihre Programmiersprache zu suchen. Für die meisten modernen Programmiersprachen gibt es mindestens eines. Wenn es keines gibt, können Sie vielleicht eine Open-Source-Initiative starten, um eines zu erstellen. Für Leser, die nicht viel Zeit mit der Suche verbringen möchten, finden Sie hier eine nicht erschöpfende Liste von Mutationstest-Tools:

Fazit

Mutationstests sind eine Technik, mit der Sie die Qualität Ihrer Unit-Tests überprüfen können. Es handelt sich um ein vollautomatisches Testwerkzeug, das Änderungen an Ihrem Quellcode vornimmt und dann die Unit-Tests ausführt, um zu überprüfen, ob mindestens einer davon fehlschlägt. Wenn ein Test fehlschlägt, haben wir den Mutanten getötet. Wenn nicht, dann... lassen Sie die Mutanten nicht entkommen! Foto von Sangharsh Lohakare auf Unsplash.

Verfasst von

Ruben Kruiver

Contact

Let’s discuss how we can support your journey.