Open Cover ist ein Tool zum Ermitteln der Code Coverage von .Net-Anwendungen. In Verbindung mit dem ReportGenerator ergibt sich so eine gute Übersicht, welche Teile des Codes verwendet werden und welche noch nicht abgedeckt sind.
Dies ist besonders hilfreich im Zusammenspiel mit Unittests, die mit Hilfe von NUnit erstellt wurden. So kann man immer sicher sein, bei den Tests auch nichts vergessen zu haben.
OpenCover kann auf der github-Seite heruntergeladen werden unter https://github.com/OpenCover/opencover.
Der ReportGenerator ist erhältlich unter http://www.palmmedia.de/Net/ReportGenerator.
Aufruf von OpenCover und ReportGenerator
Nach der Installation bietet es sich an, eine Batch-Datei zu erstellen, mit dessen Hilfe für die zu überwachenden Assemblies die NUnit-Tests aufgerufen werden.
Hier ein Beispiel, wie das Ganze aussehen kann:
1 2 3 4 5 6 7 8 |
REM Starten von OpenCover via NUnit OPENCOVERORDNER\OpenCover.Console.exe -target:NUNITORDNER\nunit-console.exe -targetargs:"/noshadow PROJEKTORDNER\bin\Debug\Assembly.exe" -filter:"+[*]* -[*]*Exception* -[Module*]*Program* -[Module*]*Test* -[Module*]*Stub* -[Module*]*Constants* " -output:coverresult.xml REM Erstellen des Reports mit Hilfe von ReportGenerator REPORTGENERATORORDNER\ReportGenerator.exe coverresult.xml REPORTORDNER\coverreport REM Öffnen des Report-Ergebnisses im Standard-Browser start REPORTORDNER\coverreport\index.htm |
In diesem Beispiel wird zunächst der NUnit Console Runner verwendet um die Tests mit OpenCover laufen zu lassen. Anschließend wird der Report erstellt und im Standard-Browser geöffnet.
OpenCover
Zunächst wird mit OpenCover eine Assembly.exe, welche die NUnit-Tests enthält mit Hilfe des NUnit Console Runners gestartet. Dieser führt die Tests aus. Im Folgenden wird dann ein Filter definiert, der zunächst alle Klassen in allen Modulen einschließt (+[*]*) und anschließend gezielt wieder bestimmte Klassen ausschließt, etwa die Klasse Program, da diese in einem NUnit-Console-Runner-Projekt nur NUnit startet und mit dem eigentlichen Ziel des Tests nichts zu tun hat.
Die Syntax des Filters ist folgendermaßen aufgebaut:
1 2 3 4 5 |
+/-[MODUL]KLASSE IIIIIIIIII++++++--- Die Klasse, welche ein- oder ausgeschlossen werden soll. III+++++++--------- Das Modul, also das Assembly, auf welches sich der Filter bezieht. +++----------------- Kennzeichen, ob der Filter einschließen (+) oder ausschließen (-) soll Beim Modul und der Klasse kann * als Platzhalter verwendet werden. |
Zuletzt wird dann noch angegeben, wo OpenCover die XML-Datei ablegen soll, die das Ergebnis enthält.
ReportGenerator
Nach dem Lauf von OpenCover kann das Ergebnis nun mit Hilfe des ReportGenerators aufbereitet werden. Dazu wird das Ergebnis von OpenCover als Parameter übergeben. Zum Schluss noch der Ordner, in dem der Report erstellt werden soll.
Es ist möglich, mehrere OpenCover-Ergebnisse in einem Report zu verarbeiten. Dazu müssen die Ergebnisdateien mit einem Semikolon (;) voneinander getrennt werden.
Beispiel:
1 |
ReportGenerator.exe coverresult.xml;coverresult2.xml;coverresult3.xml Ausgabe |
Anzeigen des Reports
Wenn man möchte, kann man sich zum Schluss das Ergebnis gleich anzeigen lassen. Dazu ruft man aus dem Ausgabeordner, der beim ReportGenerator angegeben wurde einfach die index.htm mit Hilfe des Batch-Befehls „start“ auf.
Aufrufen aus dem Visual Studio heraus
Mit dem gleichen Trick, wie wir auch Doxygen in VS eingerichtet haben, schaffen wir es auch, OpenCover aus dem Visual Studio heraus für jedes beliebige Projekt aufzurufen. Dafür muss nur für jedes Projekt eine Batch-Datei wie oben beschrieben angelegt werden.
Diese Speichert man dann unter dem Namen der Solution-Datei mit dem Anhang „.OpenCover.bat“ und schon kann man sie in den externen Tools mit folgenden Parametern angeben:
1 |
$(SolutionDir)$(SolutionFileName).OpenCover.bat |
Beispiel:
Das Projekt heißt „HelloWorld“ und die Solution-Datei heißt „HelloWorld.sln“. Nun speichern wir die Batch-Datei unter dem Namen „HelloWorld.sln.OpenCover.bat“ und der oben beschriebene Aufruf funktioniert. Die Batch-Datei muss dafür im gleichen Ordner liegen, wie die Solution-Datei.