I wanted to run the test cases for my libraries as a part of building them, so I will make sure every time I have to build the libraries that they are functioning correctly.
Unfortunatly, the built-in tasks will not do that be default; the option here is to call the nunit-console using the
Then doing a simple google search, I found MSBuildCommunityTasks.
MSBuild Community Tasks Project is an open source project for some missing and useful tasks, one of them is the Nunit task.
After I got the installer,I tried to find the documentation and see how to use the Nunit task, but I haven't seen any example on how to use it.
Try and Error; this is the last resort, but I also got some information by looking into the source code of the Nunit task itself to know how to allow the task to find the nunit-console.exe.
I followed the following steps to actually get my Nunit test cases to run during my build.
1 - import the MSBuild.Community.Tasks.Targets files:
<Import
Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
2 - Copy the Nunit\bin directory to my source code folder tree under a top level folder; example:
\My-Source-Code
+--\Tools
+--\Nunit
+--\MyLibrary
3 - Created a property in the Msbuild script to hold the relative path to nunit binaries
<PropertyGroup>
<NUnit-ToolPath>.\Tools\NUnit</NUnit-ToolPath>
</PropertyGroup>
4 - My library and its tests are part of the same solution, so the MSBuild task <<MSBuild> will build the library and the tests at the sametime.
<MSBuild
Projects="MyLibraryWithTests.sln"
Targets="Build"
/>
5 - Then come the play with Nunit task to actually run the test cases:
<NUnit
Assemblies=".\bin\Debug\MyLibrary.Tests.exe"
ToolPath="$(NUnit-ToolPath)"
DisableShadowCopy="true"
/>
Notice that:
I had to set the DisableShadowCopy="true" to run the tests in their original location and instruct nunit-console not to make a copy in a temp folder
6 - I liked to organize a little bit, so I have created 2 targets; one for the build and one for the test, then a single target to call them both; which makes my build script looks like this:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="BuildAll" >
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
<!--ToolsSettings-->
<PropertyGroup>
<NUnit-ToolPath>..\Tools\NUnit</NUnit-ToolPath>
</PropertyGroup>
<Target Name="BuildAll" DependsOnTargets="MyLibrary;MyLibrary-Test">
</Target>
<Target Name="MyLibrary">
<MSBuild Projects="MyLibrary.sln" Targets="Build" />
</Target>
<Target Name="MyLibrary-Test">
<NUnit
Assemblies=".\bin\Debug\MyLibrary-Test.exe"
ToolPath="$(NUnit-ToolPath)"
DisableShadowCopy="true"
/>
</Target>
</Project>