15.7.2009 Code-Coverage von JUnit Tests mit Eclipse und Maven

eclemma

Meistens benutze ich für die Messung der Code-Coverage von Tests EclEMMA, da dieses als Eclipse-Plugin die Code-Coverage direkt in Eclipse anzeigt.

Zwei Probleme habe ich allerdings mit EclEMMA festgestellt:

  1. In Testmethoden, die eine Exception werfen sollen, kann EclEMMA die Testcoverage nicht korrekt feststellen (siehe dort in der FAQ).
  2. In multi-Threaded Tests terminierte Thread.sleep() in einigen Fällen nie (hing sich auf).

Wenn man JUnit Tests, die dies betrifft, unter eclemma auslassen will, sie aber beim normalen Unit-Testlauf mit ausführen kann, hilft folgende Zeile in der Testmethode:


if ( System.getProperty("java.class.path").contains(".eclemma.") ) 
    return;

djunit

djunut, ein weiteres Eclipse-Plugin für Code-Coverage kommt leider auch mit Threads oft nicht klar:


Exception in thread "Thread-1" java.util.ConcurrentModificationException

Leider habe ich keine Lösung für das Problem. Ohne Threads funktioniert aber djunit auch zufriedenstellend.

cobertura

Ein sehr schönes weiteres Code-Coverage Werkzeug ist allerdings mit Cobertura verfügbar, welches es auch als Maven 2 Plugin gibt, leider nicht als Eclipse-Plugin.
Hier der nötige Ausschnitt aus der pom.xml:


<project>
 ...
 <dependencies>
 ...

 <dependency>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>cobertura-maven-plugin</artifactId>
  <version>2.2</version>
  <scope>test</scope>
 </dependency>

 ...
 </dependencies>

 ...

 <reporting>
 ...

 <plugins>
  <plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>cobertura-maven-plugin</artifactId>
   <configuration>
   <formats>
    <format>html</format>
    <format>xml</format>
   </formats>
   </configuration>
  </plugin>
 </plugins>

 ...
 </reporting>
</project>

Aufgerufen wird Cobertura dann so:

mvn cobertura:cobertura

Dabei führt es dann die Tests unter Cobertura aus und generiert einen Bericht in HTML und XML nach target/target/site/cobertura/, der unter target/site/cobertura/index.html mit einem Browser betrachtet werden kann.