Unit-Tests sind unbestritteten ein wichtiges Hilfsmittel zur Verbesserung der Softwarequalität. Schwierig ist es, während des Lebenszyklus der Software die Tests immer aktuell und vor allem vollständig zu halten. Das Tool Cobertura zeigt, welche Programmteile bei den Unit-Tests durchlaufen werden.
Cobertura ermittelt während der Programmausführung, welche Codeteile durchlaufen werden. In Verbindung mit Unit-Tests können so schnell ungetestete Klassen, Methoden und sogar Pfade im Programmablauf erkannt werden.
Vertrauen ist gut, Kontrolle ist besser
Ganz nimmt Cobertura dem Entwickler das Denken nicht ab. Man stelle sich folgendes Szenario vor: Eine Methode a(…) wird einem Unit-Test unterzogen. Diese Methode greift aber auf eine Methode b(…) zu und ruft diese auf. Dabei ist es unerheblich, ob beide Methoden in der gleichen Klasse liegen oder nicht. Was zeigt Cobertura? Genau: Sowohl der Code der Methode a(…) als auch der Code Methode b(…) werden als durchlaufen erkannt. Alles in Ordnung. Oder doch nicht? Wie gesagt: Cobertura ermittelt die durchlaufenen Codestellen während der Ausführung, also im Beispiel der Code von a(…) und b(…). Was aber, wenn Methode b(…) getestet werden soll, aber kein Test vorhanden ist? Genau ist hier liegt das Problem. Der Entwickler muß immer noch prüfen, ob alle zu relevanten Methoden auch wirklich durch einen eigenen Test abgedeckt sind.
Eine praktikable Lösung ist es, während der Entwicklung nur einen Unit-Test auszuführen (in der Regel den der geänderten Klasse oder den geänderten Unit-Test selbst), das Cobertura-Ergebnis für die geänderte Klasse zu beachten und alle anderen Klassen zu ignoreren. Das funktioniert auch gut in Verbindung mit umfangreichen Projekten, da in diesem Schritt nur die Änderungen getestet werden müssen. Fairerweise sei aber noch folgendes erwähnt: Liegen die Methoden a(…) und b(…) aus dem vorherigen Beispiel in der gleichen Klasse (wir erinnern uns: a(…) ruft b(…) auf), so wird b(…) in jedem Fall durchlaufen.
Cobertura und Eclipse
Für Eclipse gibt es ein entsprechendes Plugin namens eCobertura, dessen Verwendung sehr einfach ist. Nach der Installation gibt es zusätzlich die Schaltfläche "Coverage as". Ähnlich den "Run as" bzw. "Debug as" wird hier ebenfalls das Programm, in der Regel ein Unit-Test, ausgeführt. Nach Ausführung wird auch gleich das Ergebnis im Sourcecode-Editor angezeigt: Programmteile, die beim Test durchlaufen wurden sind grün hinterlegt, solche, die nicht durchlaufen wurden rot.
Bei eCobertura gibt es einen wichtigen Punkt zu beachten: Die aktuelle Version (0.9.8) färbt immer die gesamte Zeile ein, was bei entsprechendem Coding Style zu falschen Anzeigen führt. Schreibt man beispielsweise statt
if (obj == null)
throw new NullPoinerException();
als
if (obj == null) throw new NullPointerException();
wird die gesamte Zeile grün markiert (weil das if abgearbeitet wurde), auch wenn der Fall obj == null nicht aufgetreten ist.
Fazit
Cobertura/eCobertura unterstützt den Entwickler beim Schreiben der Unit-Tests. Die Entscheidung, was und wieviel wie getestet werden soll bleibt aber noch immer beim Entwickler. Durch den Einsatz von Cobertura wird die Gefahr, bei Weiterentwicklungen Codestellen ungetestet zu lassen, zwar wird nicht vollständig gebannt, aber zumindest stark vermindert werden.