Home ORDIX AG             Dienstleistung             Trainingsshop    Kunden / Referenzen Aktuelles    Kontakt
Home  Pfeil  ORDIX News  Pfeil  1/2007  Pfeil  Java/J2EE
suche: 
Dieser Artikel richtet sich an Anwendungsentwickler und Projektmanager, die den Grad der Testabdeckung ihres Codes messen möchten.

Glossar

ant
ant ist ein in Java geschriebenes Werkzeug zur automatisierten Abarbeitung von Aufgaben (Dateien kopieren, Sourcen kompilieren, Archive packen etc.). Welche Aufgaben in welcher Reihenfolge mit welchen Parametern ausgeführt werden, wird in so genannten ant-Skripten abgelegt, die XML als Format verwenden. ant ist vor allem in der Softwareentwicklung weit verbreitet und wird von fast allen IDEs unterstützt.
Eclipse
Eine Open Source Entwicklungsumgebung unter der Verwaltung der Eclipse Foundation. Entstanden aus dem kommerziellen "Visual Age for Java" von IBM.
JUnit
Ein Open Source Framework zur Durchführung von automatisierten Tests von Java-Programmen.

Code Coverage mit Clover

Java unterm Kleeblatt

In nahezu keinem Projekt fehlt heutzutage die Überprüfung des Source Code auf korrekte Funktionsweise. Dies geschieht zum Beispiel mit dem Testingtool JUnit. Mittels Code Coverage und Werkzeugen, wie dem hier vorgestellten Clover, kann anschließend der Java-Programmcode auf vollständige Testabdeckung überprüft werden.

Clover

Mit dem Clover Plugin für Eclipse ist es möglich, innerhalb der IDE Java-Projekte zu kompilieren, mit JUnit zu testen und den Grad der Testabdeckung der Unit-Tests sofort in einer separaten View zu sichten, ohne dabei die Entwicklungsumgebung zu verlassen. Das kommerzielle Tool ist eines der ältesten Vertreter aus dem Bereich Code Coverage. Der Name "Clover" ist übrigens die Kurzform des Kosenamens des Autors "Mr. Clover Lover" und bedeutet übersetzt "Kleeblatt".

Code Coverage

Unter dem Begriff Code Coverage versteht man die Messung des von Unit-Tests abgedeckten Source Code. Noch nicht getestete Programmzeilen lassen sich dadurch schnell aufspüren.

Beim Code Coverage gibt es unterschiedliche Coverage Metriken, wie zum Beispiel Branch-, Decision-, Line- oder Path-Coverage. Die verschiedenen Ansätze sollen hier aber im Einzelnen nicht näher betrachtet werden. Festzuhalten ist nur, dass es verschiedene Herangehensweisen und Messmethoden gibt, um das Verhältnis von getestetem Quellcode zum gesamten Projekt zu errechnen und (grafisch) darzustellen.

Installation

Über die Homepage unter [1] kann die aktuelle Version des Programms in verschiedenen Ausführungen bezogen werden. Neben der Standalone-Version für das Buildtool ANT existieren Versionen für die Integration in verschiedene IDEs. Derzeit werden die folgenden Entwicklungsumgebungen unterstützt:

In diesem Artikel wird die Version Clover für Eclipse in der Version 1.2.9 näher betrachtet.

Die heruntergeladene Version ist eine ZIP-Datei und wird in das Verzeichnis {ECLIPSE_HOME}/plugins entpackt. Ältere Versionen des Plugins sollten vorher entfernt werden.

Um das Tool zu aktivieren, wird eine gültige Lizenzdatei benötigt, die ebenfalls über die Herstellerseite zu beziehen ist.

Zur Evaluierung steht auch eine 30-Tage-Test-Lizenz zur Verfügung. Diese Datei wird im Clover-Verzeichnis abgelegt.

Nach einem Neustart von Eclipse ist das Plugin aktiviert und einsatzbereit.

Erste Schritte

Anhand einer kleinen Hilfsklasse, die eine Methode subtract() zum Subtrahieren zweier Long-Werte beinhaltet, soll der Einsatz des Code Coverage Tools demonstriert werden.

Dafür wird ein neues Projekt in Eclipse angelegt. Anschließend wird Clover über die Projekt-Properties aktiviert.

Der Screenshot in Abbildung 1 zeigt die Einstellungsmöglichkeiten auf dem neu hinzugekommenen Clover-Menüpunkt. Für unsere Zwecke reicht ein Setzen des Hakens "Enable Clover plugin in this Project".

Eclipse Projekteinstellungen für Clover. Abb. 1: Eclipse Projekteinstellungen für Clover.

Einsatz

Grundlage für einen JUnit-Test bildet die Klasse CalculatorUtil, die nur eine Methode subtract() besitzt. Diese ist in Abbildung 2 zu sehen.

public class CalculatorUtil {
	
    public static Long subtract(Long minuend, Long subtrahend) {
	
        if (minuend == null) {
            return (-subtrahend);
        } else if (subtrahend == null) {
            return minuend;
        } else {
            return (minuend.longValue() - subtrahend.longValue());
        }
    }
}
Abb. 2: Die Klasse CalculatorUtil.

Die Methode erhält als Übergabeparameter zwei Zahlen. Zurückgegeben wird die Differenz der beiden Zahlen. Ist der Minuend null, so wird der negierte Subtrahend als Ergebnis geliefert. Ist der Subtrahend null, so wird der Minuend zurückgegeben. Sind beide Zahlen ungleich null, ist die Differenz das Resultat. Ob diese Routine Sinn macht, sei dahingestellt. Wichtig ist lediglich:

Das Listing in Abbildung 3 zeigt die Testklasse CalculatorUtilTest mit der Methode testSubtract(), die die drei oben beschriebenen Szenarien durchspielt und die zu testende Klasse zu 100 Prozent abdeckt.

import junit.framework.TestCase;
	
public class CalculatorUtilTest extends TestCase {
    Long number1 = null;
    Long number2 = new Long(1);
    Long number3 = new Long(2);
	
    public void testSubtract() {
	
        assertEquals(new Long(-1), CalculatorUtil.subtract(number1, number2));
        assertEquals(new Long(1), CalculatorUtil.subtract(number3, number2));
        assertEquals(new Long(2), CalculatorUtil.subtract(number3, number1));
    }
}
Abb. 3: Die Testklasse CalculatorUtilTest.

Clover Einstellungen

Im ersten Schritt haben wir Clover für das Projekt aktiviert. Allerdings wird die Überprüfung auf Code-Abdeckung noch nicht durchgeführt. Dafür muss die Clover-View über Window->Show View eingeblendet werden.

In dieser Ansicht gilt es, noch zwei Schalter zu setzen. Schalter Nr. 1 "Toggle compiling with Clover" übersetzt das ausgewählte Projekt mit dem Clover-eigenen Compiler. Damit wird die Messung der Code-Abdeckung überhaupt erst möglich.

Ergebnisanzeige in der Clover View

Mit Schalter Nr. 2 "Show coverage data ..." wird die fehlende Testabdeckung im Quellcode am linken Rand der Clover View innerhalb von Eclipse durch rote Ausrufezeichen sichtbar gemacht. Ein zusätzlicher Tool-Tipp auf dem Symbol gibt an, dass diese Zeile noch nicht aufgerufen wurde oder welche Bedingungen noch nicht erfüllt bzw. getestet sind.

Des Weiteren zeigt die View im unteren Teil grafisch an, zu wie viel Prozent eine Klasse von den Unit-Tests durchlaufen wurde. Zu einer konkret selektierten Klasse im Baum werden diese Angaben auf Methoden, Statements und Bedingungen heruntergebrochen.

In Abbildung 4 ist die Codeabdeckung für die Klasse CalculatorUtil zu sehen. Im Quellcode darüber sind die noch nicht getesteten Zeilen markiert. Bewusst wurde eine Zeile im Unit-Test auskommentiert, um nicht abgedeckte Blöcke sichtbar zu machen.

Abb. 4: Clover View mit Report zur Code Coverage. (vergrößern!)

Reports

Neben der Anzeige innerhalb der Clover View ist es aber auch möglich, Reports aus den gesammelten Daten zu generieren. Bei der Ausgabe können verschiedene Formate gewählt werden. Dazu gehören die Erzeugung von HTML-Seiten und PDF-Dateien sowie die Generierung von XML-Dateien für eine eventuelle Weiterverarbeitung.

Fazit

Wie das Beispiel zeigt, lassen sich mit Clover noch nicht getestete Source-Zeilen zuverlässig und vor allem frühzeitig aufdecken.

Dem Projektmanager gibt es eine gute Übersicht über den aktuellen Grad der Testabdeckung. In größeren Projekten ist es ein unverzichtbares Tool, das durch die zusätzliche Funktion der Reporterstellung in unterschiedlichen Formaten besticht.

Der Einsatz von Clover darf aber nicht darüber hinwegtäuschen, dass trotz alledem selbst auf die Richtigkeit und Vollständigkeit der programmierten Tests zu achten ist.

Andre Dirr (info@ordix.de).