Kürzlich stellte sich uns die Anforderung, Unit-Tests auf einem virtuellen PC während des Buildprozesses auszuführen und die Ergebnisse im Build sichtbar zu machen – sprich die Testergebnisse auf den TFS zu pulbizieren. Der Kunde, der die Anforderung stellte, wollte damit umfangreiche Smoke-Tests auf mehreren Zielplattformen automatisieren. So sollte es z. B. möglich sein, eine Applikation auf einem Windows XP und Vista zu testen. Dazu wurden mehrere virtuelle PCs (hier mit VM-Ware) erstellt und Snapshots erzeugt. Im Buildprozess sollen diese gestartet und für das Applikationsdeployment verwendet werden. Nach einiger Zeit der Evaluierung mit dem Visual Studio Load Test Agent, entschieden wir uns für eine Scripting-Lösung. Wir wollten mstest.exe remote auf dem VPC ausführen.
Um das Microsoft Testing Framework über remote scripten zu können, benötigt man zunächst ein Visual Studio in der Development oder Test Edition, welches auf dem virtuellen PC installiert ist. Desweiteren empfiehlt es sich, eine Batch-Datei zum scripten der Testausführung und Publikation der Testergebnisse zu erstellen. Diese könnte dann in etwa so aussehen:
“C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\mstest.exe” /testcontainer:”c:\test\testproject.dll” /runconfig:localtestrun.testrunconfig
Das setzt voraus, dass die aktuellen Binaries der Testprojekte in das entsprechende Verzeichnis (hier: C:\Test) während des Buildprozesses kopiert worden sind. Das kann z. B. über eine Netzwerkfreigabe erfolgen.
Bleibt nur noch, diese Batch-Datei auf dem virtuellen PC während des Buildprozesses auszuführen. Hier eignet sich das Tool PsExec, welches sich auch als Finalbuilder-Task findet. Es dient zur Ausführung von Commands auf einem Remote-PC. Der Aufruf sieht in unserem Beispiel wie folgt aus:
PsExec //ComputerName –u Domain\TFSService –w c:\LocationOfBatchFile cmd.exe /c mstest.bat
Wichtig ist hierbei die explizite Angabe des Nutzers über den Kommandozeilenparameter -u. Da mstest.exe im Isolation-Modus einen separaten Thread zur Testausführung erzeugt, würde eine fehlende User-Angabe zu einem IPC-Fehler führen. Wer keinen User angeben möchte kann daher über /noisolation die Thread-Erzeugung von mstest.exe abschalten.