Dateien für automatisierte Tests bereit stellen

Die berühmten Unit Testing Frameworks werden nicht nur für Unit Tests genutzt, sondern auch für automatisierte Tests allgemein und damit auch für Integrationstests. In diesem Zusammenhang wird es dann schnell notwendig, dass auch eine Reihe von Dateien bereit gestellt werden müssen. Dies endet nicht selten darin, dass jene Dateien während des Tests nicht gefunden werden können weil mal wieder irgend etwas nicht funktioniert. Nachfolgend soll deshalb eine einfache Lösung für diesen Fall aufgezeigt werden.

In der Vergangenheit neigte ich immer dazu die Dateien einfach in das Builverzeichnis kopieren zu lassen und habe dann von dort auf darauf zugegriffen. Hierzu muss man einfach für die Datei die „Build Action“ auf None und den Wert von „Copy to Output“ in den Eigenschaften der Datei setzen. Das große Problem dabei ist, dass der Testrunner von Visual Studio und auch der von Resharper, eine sogenannte Shadow Copy anlegen. Die Assemblies werden also vor der Ausführung der Tests in ein temporäres Verzeichnis verschoben und liegen nicht mehr im Bin Verzeichnis. Da andere Dateien nicht mit kopiert werden, können diese während des Tests auch nicht gefunden werden.

Um nun dieses Problem zu umgehen, muss man die Dateien als Ressourcen in das Testprojekt einbinden. Anschließend kann man sie mit folgender Metheode wieder auslesen und Deployen:


private string GetContent(string resourceName, string targetPath)
{
 var assembly = Assembly.GetExecutingAssembly();

 using (var stream = assembly.GetManifestResourceStream(resourceName))
 using (var reader = new StreamReader(stream))
 {
   var content = reader.ReadToEnd();
   File.WriteAllText(targetPath, content);
 }
}

Der Targetpath ist hierbei natürlich das Zielverzeichnis. Der Ressourcename ergibt sich wiederum aus dem Namensraum in dem die Datei innerhalb der Assemblie liegt. Habe ich also eine Datei Messungen.xml die in einem Verzeichnis XML der Testassembly Messystem.Messlogik.Tests liegt, dann erhalte ich den Ressourcennamen Messystem.Messlogik.Tests.XML.Messungen.xml.

Will man die Dateien außerdem in einem möglichst sicheren Verzeichnis deployen, kann man sich ein temporäres Verzeichnis anlegen. Dazu benötigt man die Path Klasse, welche über GetTempPath() einen entsprechenden Pfad bereit stellt. Sollte man dies tun, ist es aber auch wichtig jenes Verzeichnis nach Abschluss der Tests zu beräumen. Dies kann man beispielsweise über

 

Kommentar hinterlassen