13 November 2010 HowTo, MSBuild, NUnit Robert Muehsig

imageDa ich aktuell in einem Projekt statt MSTest NUnit einsetze, möchte ich natürlich die NUnit Tests auch in meinem Build abspielen. Wie man MSTest und MSBuild miteinander bekannt macht, habe ich hier gebloggt. Mit NUnit ist es nicht wesentlich schwerer.

Voraussetzungen

Ich habe bei mir NUnit in der Version 2.5.9 (momentan im Entwicklungszweig) geladen. In Version 2.5.8 gab/gibt es einen Bug, sodass der NUnit Agent sich nie beendet und der Prozess hängt. Dies hängt wohl mit .NET 4.0 zusammen, daher lieber eine neue Version laden.

Nach der Installation findet man die NUnit Dateien hier:

C:\Program Files (x86)\NUnit 2.5.9

NUnit 2.5.9 / Runner / Files in das Projektverzeichnis kopieren

Entweder man setzt für den NUnit Test Runner (in dem Fall die nunit-console.exe) einen Systempfad, oder man kopiert die Dateien alle mit in das Projektverzeichnis.

Alles unter" "C:\Program Files (x86)\NUnit 2.5.9\bin\net-2.0” muss in das Projektverzeichnis bzw. unterhalb gespeichert werden.

Ich hab die Dateien unter "PROJEKTNAME\Tools\NUnit\” gespeichert.

MSBuild Community Pack

Wie bereits in manch anderen MSBuild Blogposts nutz ich auch hier das MSBuild Community Pack, weil es dort einen netten Tasks "NUnit” gibt.

Demo Solution

image

Bis auf die NUnit Test Runner Files sehr ihr das wesentliche im Build. Unter Build\Lib findet sich das MSBuild Community Pack und ansonsten gibt es eine .bat Datei zur leichteren Ausführung sowie unser MSBuild File. Das MSBuildNUnit.Tests Projekt ist mein "Demo” Test Projekt - hier ist das nunit.framework verlinkt und 1 Test enthalten.

Das MSBuild File

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Run">
<Import Project="$(MSBuildStartupDirectory)\Lib\MSBuild.Community.Tasks.Targets"/>
	<PropertyGroup> 
    <!-- After Compile: Result will be saved in OutDir -->
		<OutDir>$(MSBuildStartupDirectory)\OutDir\</OutDir>
    
    <!-- Configuration -->
    <Configuration>Release</Configuration>
    
    <!-- Solutionproperties-->
		<SolutionProperties>
      OutDir=$(OutDir);
      Platform=Any CPU;
      Configuration=$(Configuration)
    </SolutionProperties>
	</PropertyGroup>
	<ItemGroup>
		<Solution Include="..\MSBuildNUnit.sln">
			<Properties>
				$(SolutionProperties)
			</Properties>
		</Solution>
	</ItemGroup>
	<Target Name="Run">
    <Message Text="Run called." />
    
    <CallTarget Targets="BuildSolution" />
    <CallTarget Targets="RunTests" />
  </Target>

  <Target Name="BuildSolution">
    <Message Text="BuildSolution called." />
    <MSBuild Projects="@(Solution)"/>
	</Target>

  <Target Name="RunTests">
    <!-- Run Unit tests -->
    <CreateItem Include="$(OutDir)*.Tests.dll">
      <Output TaskParameter="Include" ItemName="TestAssembly" />
    </CreateItem>
    <NUnit ToolPath="..\Tools\NUnit" DisableShadowCopy="true" Assemblies="@(TestAssembly)" />
  </Target>

</Project>

Zwischen Zeile 32 und 43 ist die NUnit Integration zu finden. Im OutDir hole ich mir alle Assemblies die ein "Tests” enthalten und kann diese über den NUnit Tasks aufrufen. Dort gebe ich zudem noch den ToolPath zun den Runnern an, ansonsten würde das Script den Runner nicht finden.

Zudem kommt am Ende des Builds noch eine TestResults.xml raus, welche im Build Verzeichnis liegt.

Alles in allem: Eine einfache Sache.

[Download Democode]


Written by Robert Muehsig

Software Developer - from Dresden, Germany, now living & working in Switzerland. Microsoft MVP & Web Geek.
Other Projects: KnowYourStack.com | ExpensiveMeeting | EinKofferVollerReisen.de

If you like the content and want to support me you could buy me a beer or a coffee via Litecoin or Bitcoin - thanks for reading!