2009-04-16 7 views
6

Ein Problem mit mutation testing besteht darin, dass es langsam ist, da standardmäßig ein vollständiger Testlauf (entweder eine Testdatei oder eine Reihe von Testdateien) für jede generierte Mutation ausgeführt wird.Fehlende Einheitentests für Mutationstests

Eine Möglichkeit, Mutationstests schneller durchzuführen, wäre, den Testlauf für eine bestimmte Mutante zu stoppen, sobald ein einziger Fehler aufgetreten ist (aber nur während des Mutationstests). Noch besser wäre es für den Mutationstester, sich daran zu erinnern, was der erste Test war, um die letzte Mutante zu töten, und diese zuerst der nächsten Mutante zu geben. Gibt es irgendwas in Ruby, das eines dieser Dinge tut, oder ist es meine beste Idee, mit Affen zu flicken?

(Ja, ich weiß Unit-Tests sollte schnell sein. Und all die nichtbestandenen Tests zeigt ist nützlich, außerhalb der Mutationstests, da es hilft, identifizieren Sie nicht nur, dass etwas falsch ist, aber genau feststellen, wo es schief geht)

Edit: Ich benutze derzeit mit Test/Unit heckle. Wenn es dem Test/der Einheit nicht möglich ist, sich zu erinnern, welche Tests zwischen den Laufversuchen fehlschlagen, könnten sich Zwischenrufe oder etwas Laufendes Zwischenspucken daran erinnern.

+0

und Sie führen diese Tests wie ...? –

Antwort

2

Ihr bestes Bestes ist es, die heckle source von Github zu überprüfen, es zu patchen und diesen Patch an die Entwickler zu senden. Sie sollten in der Lage sein, einen benutzerdefinierten Test Runner für Zwischenrufe zu schreiben.

Monkey Patching ist nie die Antwort für so etwas. In der Tat ist Affenflicken fast nie die Antwort für irgendetwas.

1

Ein Ansatz, den ich begonnen habe, war das Schreiben von Komponententests für jede Methode und das Einfügen in separate Dateien, die wie Rubyspecs organisiert sind. Ich lasse jede Spezifikation isoliert laufen und gebe die genaue Methode an, die ich ankreuzen möchte. Ich habe eine Rake-Aufgabe, die all dies verwaltet und am Ende einen Bericht mit eventuell fehlgeschlagenen Mutationen druckt.

Am Ende bekomme ich volle heckle Berichterstattung über jede Methode, ohne ewig auf die Ergebnisse zu warten. Plus, es ist sogar besser als der normale Ansatz, den jeder benutzt, weil ich keine zufällige Deckung bekomme - die Spezifikationen jeder Methode müssen alle Mutationen dieser Methode abdecken.

1

Mein Tool mutant verwendet die Option rspec2 --fail-fast, um sofort zu stoppen, sobald ein fehlerhaftes Beispiel gefunden wurde. Zusammen mit der Strategie --rspec-dm2, die nur die betroffenen Komponententests ausführt, erhalten wir sehr schnelle Mutationsabdeckungstests. Sehen Sie diese asciicast für eine (Geschwindigkeits-) Demonstration.