Verbesserte Testqualität durch die Integration von Mutationstest in die CI/CD Pipeline

mutation-title

Wie hoch ist die Qualität meiner Modultests? Bei der Beantwortung dieser Frage kann die Hinzunahme von Mutationstests Abhilfe schaffen. Mutationstests erweitern herkömmliche Modultests, indem sie fehlerhaften Code (Mutationen) in die bestehende Codebasis injizieren. Dies kann z.B. die Modifizierung von arithmetischen Operationen und Rückgabewerten von Methoden beinhalten. Im Anschluss wird überprüft, ob die bestehenden Testfälle diese Mutationen erkennen und fehlschlagen. Wenn z.B. die innere Logik einer If-Anweisung dahingehend verändert wird, dass ihr Ergebnis immer 'Wahr' ergibt, ist eine negative Auswirkung auf die Testergebnisse zu erwarten. Die durch die Durchführung von Mutationstests gewonnen Informationen liefern Hinweise, an welchen Stellen weitere Testfälle benötigt werden oder welche bestehenden Tests erweitert werden sollten.

Aber wie kann dieses Verfahren während des Entwicklungsprozesses praktisch eingesetzt werden? Um die Qualität der eigenen Tests dauerhaft zu erhöhen, ist eine Implementierung von Mutationstest in den Continuous-Integration- und Continuous-Delivery- (CI/CD-) Prozess sinnvoll. In der Praxis existiert allerdings ein Problem, das dieser Idee entgegenwirkt: Aufgrund der technisch sehr anspruchsvollen Mutation des Quellcodes benötigen Mutationstests für einen Testdurchlauf mehr Zeit als herkömmliche Modultests. In unserem Anwendungsfall, einem Microservice Projekt, welches mit Spring Boot umgesetzt ist, benötigen die Mutationstests im Mittel fünfmal mehr Zeit als die Modultests. Dies ist zu lange für eine dauerhafte Verwendung in unserer CI/CD-Pipeline. Allerdings bietet die von uns zur Erstellung von Mutationstests verwendete Technologie Pitest eine Möglichkeit, dieses Problem zu lösen und die Rechenzeiten zu verkürzen. In Kombination mit einer Versionsverwaltungssoftware bietet das Pitest-Maven-Plugin die Funktionalität, nur modifizierte Codestellen zu mutieren, anstatt der gesamten Codebasis. Somit ist es möglich, die benötigte Zeit der Mutationstests stark zu verkürzen. Eine Implementierung in die Pipeline erscheint dadurch wieder praktikabel.

Exemplarischer Aufbau Pipeline mit Git

git checkout origin/master
# Erstelle einen temporären Commit, um alle Änderungen im aktuellen Feature-Branch zu untersuchen.
git merge origin/$CI_COMMIT_BRANCH
# Führe die Mutationstest durch
mvn org.pitest:pitest-maven:scmMutationCoverage -DanalyseLastCommit
 

Nun werden während des Entwicklungsprozesses nur die Codeänderungen im aktuellen Feature-Branch analysiert. Die gesamte Codebasis wird nur noch bei der Veröffentlichung einer neuen Version oder Ergänzungen in den Master-Branch analysiert. Dadurch ist es möglich, die Qualität unserer Modultests dauerhaft automatisch zu kontrollieren und hoch zu halten, während die Durchlaufzeiten der Pipeline niedrig bleiben. So steht einem kontinuierlichen Entwicklungsprozess nichts mehr im Wege.

Quellen

By accepting you will be accessing a service provided by a third-party external to https://blog.ordix.de/