Mutations-Tests mit PIT

Unit Tests sind zum Standard-Werkzeug eines jeden Entwicklers geworden. Damit lässt sich die Qualität eines Moduls garantieren. In Kombination mit Code Coverage kann eine aussagekräftige Metrik erstellt werden. Dabei liegt die Betonung hier jedoch auf „kann“. Die Code Coverage-Metrik kann leicht hinter das Licht geführt werden, da sie nur aussagt, dass eine Zeile von einem Test-Fall durchlaufen wurde. Code Coverage sagt leider nichts über die Qualität eines Testfalls aus und ob dieser überhaupt etwas prüft.
Mit PIT können Mutations-Tests durchgeführt werden und somit die Qualität der eigenen Testfälle sichergestellt werden. PIT mutiert dabei Verzweigungen der zu testenden Klasse und prüft, ob die Testfälle nach der Mutation fehlschlagen. Ein fehlschlagender Test heißt in diesem Fall, dass der Zweig abgedeckt ist.

Ein Beispiel hierfür wäre wie die Klasse Filter und der dazugehörige Unit-Test. Den Unit-Test wird über PIT gestartet. Es existiert sowohl eine Integration für Eclipse, als auch für diverse Build-Werkzeuge wie Maven oder Ant. Ich habe mich hier für die Variante mit Eclipse entschieden. Dort muss der Testfall lediglich als PIT Mutation Test ausgeführt werden (Run As -> PIT Mutation Test).

public class Filter {

  private final int limit;

  public Filter(int limit) { this.limit = limit; }

  public boolean filter(int i) { return i < limit; }
}

public class FilterTest {

  private Filter filter;

  @Before
  public void setUp() { filter = new Filter(5); }

  @Test
  public void filter_10() {
    final boolean result = filter.filter(10);
    Assert.assertFalse(result);
  }

  @Test
  public void filter_1() {
    final boolean result = filter.filter(1);
    Assert.assertTrue(result);
  }
}

Nachdem PIT durchgelaufen ist, gibt die Teststatistik an, wie viele Zweige von Testfall abgedeckt sind. Es ist nicht sofort sichtbar, dass dieser Test nicht alle Zweige abdeckt. Der Schwellenwert (5) wird nicht geprüft und die Mutation des Kleiner- zu einem Kleiner-Gleich-Operator schlug in keinem Testfall fehl.

pit_1

PIT verändert nicht nur logische Operatoren, sondern entfernt beispielsweise auch Aufrufe zu Methoden oder Konstruktoren. Die komplette Liste aller Mutatoren auf den Seiten von PIT gibt Aufschluss darüber welche Mutatoren existieren und welche Absicht hinter diesen steckt.

Mutations-Test unterstützen den Entwickler bessere Tests zu schreiben und evtl. vergessene oder nicht offensichtliche Abzweigungen ebenfalls zu prüfen.

Teilen Sie diesen Beitrag

Das könnte dich auch interessieren …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert