Archive for Januar 2009

h1

UnitTests, automatische Tests mit TFS 2008

Januar 23, 2009

Fast immer benötigt man für das Ausführen von UnitTests eine Umgebung wie im wirklichen Leben. Es sind also auch z.B. Konfigurationsfiles an einem bestimmten Ort (wie z.B. in einem Unterordner “config”) notwendig. Die Visual Studio UnitTests werden aber in einem eigenen Ordner ausgeführt und genau dort braucht man nun auch diesen Unterordner mit seinen Dateien. Hier gibt es im großen und ganzen zwei Ansätze. Entweder man konfiguriert die Testkonfiguration (siehe 2 Abbildungen):

image
–> öffnen der Testkonfiguration mit Wizard

image
–> Definieren von Dateien die für die UnitTests notwendig sind unter “Deployment”

Leider bietet der Wizard keine Möglichkeit einen Unterordner/Zielordner mit anzugeben. Dazu muss man das “.testconfig” File im XML-Editor öffnen und selbst am DeploymentItem-Tag herumeditieren. Dort steht einem nun das Attribut “outputDirectory” zur Verfügung.

<Deployment>
  <DeploymentItem filename="log4net.conf.xml" 
    outputDirectory="config" />
  <DeploymentItem filename="myentlib.config" />
</Deployment>

–> .testconfig File im XML-Editor

Der zweite Ansatz ist über ein Attribut im Testcode selbst zu definieren welche Dateien für den Test notwendig sind:

DeploymentItems (DeploymentItemsAttribute bei MSDN)

[TestMethod()]
[DeploymentItem("config\\log4net.conf.xml", "config")]
public void MyTest()
{
    ...
}

–> DeploymentItemAttribut im Code

DeploymentItems und TFS Team Build:

Leider hat man nun das nächste Problem mit den DeploymentItems und UnitTests im Zusammenhang mit Teambuild. Auf dem Teambuild Server können die UnitTests nur ausgeführt werden, wenn Visual Studio installiert ist. Das VS2008 hat hier wohl einen Bug, denn er sucht die für den UnitTest definierten DeploymentItems nicht im Ordner wo die Tests ausgeführt werden, sondern im Ordner wo Visual Studio auf dem Teambuild Server installiert ist (System.Configuration.ConfigurationErrorsException: The configuration folder ‚D:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\config\log4net.conf.xml‘ doesn’t exist).

Geholfen hat jetzt nur ein Workaround im Testcode:

[ClassInitialize()]
public static void MyClassInitialize(
  TestContext testContext)
{
    AppDomain.CurrentDomain.SetData("APPBASE", 
     Environment.CurrentDirectory);
}

–> Bei jedem UnitTest in der Initialisierung einzufügen (Forum post hier)

Team Build – Code Coverage – Partially Succeeded

Manchmal kommt es trotz erfolgreichen Build und auch erfolgreichen durchführen aller UnitTests zu dem Status “Partially Succeeded”.

image

–> “Partially Succeeded” trotz erfolgreichem Build und no failed UnitTests ?!

Ein bisschen Nachforschung bringt einen dann auf den Pfad, dass es ein paar Warnungen gegeben hat, die man auch Abarbeiten kann. Man lädt sich die Testresults auf den lokalen Rechner (Link unter “Test Run” anklicken) und arbeitet die Warnungen ab. Zum Beispiel will Code Coverage zwingend x86 dlls (siehe auch hier). Weiterhin müssen alle dlls die im Code Coverage eingeschlossen sind auch verfügbar sein. Code Coverage wird übrigens auch in der .testconfig Datei definiert und kann mit dem Wizard (siehe oben im Artikel) eingerichtet werden.