Genforschung für Software-Entwickler: Mit mutiertem Code Testing-Tools testen

Agile Softwareentwicklungsmethoden wie z.B. die testgetriebene Entwicklung (test driven development – TDD) bei denen Entwickler zunächst Testfälle und dann das zu testende Codeteil erstellen, schaffen Bedarf für Tools zur Testfallverwaltung und Testautomation. Oder führen dazu, dass Entwickler sich solche Tools ad-hoc selbst schreiben, da sie mit den käuflichen Produkten unzufrieden sind, diese nicht in ihre Lieblings-IDE integrieren können oder die Tools so komplex sind, dass eine mehrtägige Schulung dafür erforderlich wäre.

Das führt irgendwann zu der Frage „Wie gut sind meine Testing-Tools?“ Lassen sich damit tatsächlich alle Fehler finden, die in den Code hineingeraten sind? Oder gibt es Bugs, die von den Testfällen bzw. den sie ausführenden Tools übersehen werden?

Um die Güte von Testing-Tools testen zu können, kann man sich der Methode der Mutationstests (mutation testing) bedienen. Mutationstests basieren auf Programmen, die gezielt Fehler (Mutationen) in gegebenen Quellcode einstreuen (fault injection). Vorzeichen umdrehen, Zählvariablen herauf- oder heruntersetzen, Schleifen einmal mehr oder weniger durchlaufen lassen, ganze Codezeilen weglassen oder hinzufügen usw. Auch am Bytecode kann mutiert werden: Manipulationen der Speicherverwaltung, Eingriffe in die Parameter von Funktionsaufrufen und Zugriffen auf Betriebssystemfunktionen (system calls), Veränderungen bei Netzwerkzugriffen und den Headern von Datenpaketen.

Das dann ausgeführte und fehlerbehaftete Programm sollte deutlich bemerkbare Verhaltensveränderungen aufweisen, die durch Testing-Tools entdeckt werden können. Ist das nicht der Fall, so wurde der mutierte Codeteil entweder gar nicht ausgeführt und kann daher beim nächsten Refactoring als überflüssig entfernt werden. Oder der verwendete Testfall bzw. das Testing-Tool übersieht den Fehler bzw. deckt ihn nicht ab und bedarf daher der Überarbeitung.

Der Schwerpunkt des Einsatzes von Mutationstest liegt dabei meist bei Modultests, d.h. beim Testen einzelner überschaubarer Komponenten in einer frühen Phase des Entwicklungsprozesses, bevor diese zu größeren Builds zusammengesetzt werden.

In eine ähnliche Richtung zielt auch das Fuzzing, d.h. das automatisierte Generieren von zufälligen Eingabewerten für Programme (z.B. über deren Bedienoberflächen oder durch Eingriffe in die Kommunikation zwischen Objekten) mit dem Ziel, das Programm dazu zu bringen Anomalien (unerwartete Verarbeitungszustände, die am sich nicht vorgesehen sind und daher auch nicht abgefangen werden) zu zeigen. Fuzzing wird ebenfalls zum Mutationstesten gezählt. Fuzzing-Tests können auch dazu genutzt werden, gezielt und automatisiert nach Schwachstellen in Software zu suchen, mit dem Ziel diese für Exploits auszunutzen. Charlie Miller, ein Gewinner beim diesjährigen Pwn2own-Hackerwettbewerb tat dies erfolgreich um Schwachstellen in gängigen Office-Programmen zu finden, die sich im Laufe des Wettbewerbs aus nutzen ließen, wie er nachträglich in einem Interview erklärte.

Auch die Wissenschaft beschäftigt sich mit Mutationstest. So z.B. Andreas Zeller, Professor am Lehrstuhl für Softwaretechnik an der Universität des Saarlandes. Seit Forschungsteam entwickelte das Javalanche Framework zum Mutationstesten von Javacode. Es wird als Open Source Programm verbreitet und kann  frei heruntergeladen werden. Somit kann sich jeder Interessierte selbst mit Mutationstest vertraut machen.



wallpaper-1019588
Beste Gaming Mäuse mit vielen Tasten
wallpaper-1019588
[Manga] Banana Fish [8]
wallpaper-1019588
[Manga] Yakuza goes Hausmann [3]
wallpaper-1019588
Ratchet and Clank: Rift Apart für die PlayStation 5: bunt, laut und so unbekannt bekannt