Mutation testing with Pitest

Mutationtests mit Pitest

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 Automotive Bavaria

Mutation testing with Pitest

Wir verwenden Cookies, um unsere Webseite für Sie zu optimieren. Mit dem Besuch unserer Webseite erklären Sie sich damit einverstanden. // Our website is using cookies to improve your experience. By continuing to browse the site, you are agreeing to our use of cookies.

Weitere Informationen finden Sie in unserer Datenschutzerklärung. // For more information, please refer to our privacy policy.