Problem

Übliche Testmetriken, wie z. B. line coverage und branch coverage, geben lediglich darüber Auskunft, ob Code bei Testausführung erreicht worden ist und nicht unbedingt, ob auch die richtige Funktionalität ausgeführt worden ist.

Dadurch ist es möglich Testcode zu schreiben, der lediglich die Metrik zufriedenstellt, ohne irgendetwas zu testen (Testcases ohne Assertions).

Lösung

Um sich über die Qualität der Tests ein Bild zu machen, kann man Mutationtests verwenden.

Ein Mutationtest führt Unittests auf verschiedenen Mutationen des zu testenden Codes aus.

Es gibt viele verschiedene Mutationsarten, z.B. das Ändern von Conditions (>= wird zu >) oder das Invertieren von boolschen Rückgabewerten.

Beispiel

public class Jambitee {
  public boolean isAwake(int amountOfCoffeesToday) {
    if (amountOfCoffeesToday >= 1 ) {
      return true;
    } else {
      return false;
    }
  }
}
  
public class JambiteeTest {
  private Jambitee jambitee = new Jambitee();
  
  @Test
  public void isAwakeWith2Coffees() {
    assertTrue(jambitee.isAwake(2));
  }
  
  @Test
  public void isAsleepWithNoCoffee() {
    assertFalse(jambitee.isAwake(0));
  }
}
Obwohl der Code hier eine 100%ige line- und branch-coverage hat, sichern die Tests die ">=1"-Condition nicht ab.
In Maven muss man nur das Plugin einbinden.
<plugin>
  <groupId>org.pitest</groupId>
  <artifactId>pitest-maven</artifactId>
  <version>LATEST</version>
</plugin>
Danach kann man die Mutationtests ausführen, indem man das mutationCoverage Goal aufruft. `mvn org.pitest:pitest-maven:mutationCoverage`
Mutationtests mit Pitest

Pitest führt die Tests auf verschiedenen Mutationen aus und erkennt dabei, dass es eine Mutation gibt, die nicht von den Tests abgedeckt ist.

Weiterführende Aspekte

---

Autor: Christof Huber / Software Developer / Business Division Industry & Energy

SCHREIB UNS

* Pflichtfeld

SCHREIB UNS

* Pflichtfeld

Cookie-Einstellungen

Diese Website verwendet Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und Zugriffe auf die Website zu analysieren. Zudem werden Informationen zu Ihrer Verwendung der Website an Partner für soziale Medien, Werbung und Analysen weitergegeben. Die Partner führen diese Informationen möglicherweise mit weiteren Daten zusammen, die Sie ihnen bereitgestellt haben oder die sie im Rahmen Ihrer Nutzung der Dienste gesammelt haben.

Weitere Informationen finden Sie in unserer Datenschutzerklärung. Dort können Sie nachträglich auch Ihre Cookie-Einstellungen ändern.

contact icon

Kontakt aufnehmen