Tests testen mit MutateMe

Verfasst am 18.05.2010 23:32:04, Arvid Bergelmir

Vor kurzem bin ich auf MutateMe, ein Projekt von Pádraic Brady, gestoßen, womit sich Tests testen lassen. Hört sich, wenn man das zum ersten Mal hört, etwas paranoid an, aber wenn man sich den Sinn und Zweck des Projekts näher anschaut, wird es verständlich warum man Tests testen sollte.

Nachdem ich meinen Code aus dem Idun-Repository vollständig mit UnitTests versehen und eine 100%ige Code-Coverage erreicht habe, war ich bei MutateMe sehr interessiert und wollte es mal ausprobieren und schauen, ob es bei meinen UnitTests noch Fehler finden kann.

MutateMe ist ein Mutation Testing Framework, womit sich Fehler in Tests aufspüren lassen. Zudem lässt sich erahnen, wie genau man seine Tests geschrieben hat. Sicherlich kommt hier, bei dem Ein oder Anderen, die Frage auf, wie MutateMe Fehler in Tests finden kann? Dazu gleich mehr. Erstmal müssen die Vorraussetzungen fürs Testen erfüllt sein.

Bevor man MutateMe nutzen kann, sind einige Vorraussetzungen zu erfüllen. Alle Tests müssen mit PHPUnit umgesetzt sein, da MutateMe PHPUnit, als Adapter zur Ausführung, nutzt. Als nächstes muss die Runkit Extension für PHP installiert sein. Dafür sollte nicht die Extension von PHP selbst genommen werden, sondern die Erweiterung von Dmitry Zenovich, die einige Fehler behebt. Auf die Installation der einzelnen Komponenten möchte ich hier nicht weiter eingehen. Eine Zusammenfassung findet man bei Pádraic Brady in der README.markdown des MutateMe-Projekts. Darüber hinaus müssen die vorhandenen Tests eine Code-Coverage von 100% erreichen.

Sind alle Vorraussetzungen erfüllt, so kann das Testen der Tests beginnen. Das ist auch nicht schwer, denn man muss lediglich in das Basisverzeichnis, des zu testenden Projekts, wechseln und folgende Zeile in der Konsole ausführen:

mutateme –src=./library –tests=./tests

Dabei wird angegeben, wo die zu testenden Dateien liegen (--src) und, wo die Tests liegen (--tests). Nachdem alle Tests durchgelaufen sind, beginnt MutateMe mit seinen Mutationen, um Fehler in den einzelnen Tests ausfindig zu machen. Aber wie macht MutateMe das? Das ist eigentlich sehr einfach.

MutateMe verändert den eigentlichen Code und führt daraufhin die Tests nochmal aus. Sollte der Test, trotz der Änderungen, ohne Fehler durchlaufen, so ist es wahrscheinlich, dass der Test nicht genau genug testet. Schlägt ein Test nach den Änderungen nicht fehl, so wird die Änderung im Diff-Format angezeigt.

Die Ergebnisse sollten jedoch immer im Detail durchgeschaut werden, denn MutateMe liefert auch sogenannte false positives. Dabei handelt es sich um erkannte Fehler, die in Wirklichkeit keine sind. Das liegt einfach daran, dass es Funktionalitäten auch mit den Anpassungen die gleichen Ergebnisse liefern. Darauf wird man aber, nach jedem Durchlauf, mit folgenden Worten, hingewiesen.

Remeber that some Mutants may just be Ghosts (or if you want to be boring, 'false positives').

Nachdem ich mir MutateMe ein paar Tage angeschaut und an meinem Idun-Projekt getestet habe, habe ich MutateMe in einem eigenen Fork, bei GitHub, um 12 weitere Mutationen erweitert. Das sind zwar mehr als doppelt so viele Mutationen, wie es bereits von Pádraic Brady gab, aber das sind noch lange nicht alle Mutationen. Ich habe zumindest schon ein paar Ideen für weitere Mutationen.

Tags:
  • Git
  • Github
  • Idun
  • MutateMe
  • Mutation Testing
  • PHP
  • PHPUnit
  • Runkit
  • UnitTesting