I am working on a project that has a large code base with a lot of logic. For this project I am trying to adopt a more TDD oriented development approach. This includes unit- and integration testing, as well as code coverage, and yes I do know that a high coverage percentage is not the same as good tests, but on the other hand, a low coverage indicates that more tests need to be written.
We are currently using NUnit.126.96.36.19992 and the code coverage tools I was able to find was NCover, PartCover and OpenCover. NCover is no longer free, and from what I can read it seems like OpenCover is the better choice compared to PartCover.
This blog post describes well some of the differences and features of PartCover vs. OpenCover.
This is the MSBuild configuration file that we are currently using to run unit test and code coverage.
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> <!-- Application Configurations --> <PropertyGroup> <NUnit-ToolPath>..\packages\NUnit.188.8.131.5292\tools\</NUnit-ToolPath> <OpenCover-ToolPath>..\packages\OpenCover.1.0.719\</OpenCover-ToolPath> <ReportGenerator-ToolPath>..\packages\ReportGenerator.184.108.40.206\</ReportGenerator-ToolPath> <MSBuildCommunityTasksPath>$(MSBuildProjectDirectory)\..\Libs\msbuild\</MSBuildCommunityTasksPath> <!-- Add paths to assemblies to test --> <TestAssemblies>..\Tests\Core.Tests\bin\Debug\Core.Tests.dll ..\Tests\Model.Tests\bin\Debug\Model.Tests.dll</TestAssemblies> </PropertyGroup> <ItemGroup> <AllProjects Include="..\Tests\**\*.csproj" /> </ItemGroup> <Target Name="Clean"> <MSBuild Projects="@(AllProjects)" Targets="Clean" /> </Target> <Target Name="Compile"> <MSBuild Projects="@(AllProjects)" Targets="Build" Properties="WarningLevel=1" /> </Target> <Target Name="Test" DependsOnTargets="Clean;Compile"> <!-- /domain=single is not support by the NUnit msbuild task, and it is required for OpenCover coverage test --> <Exec Command="$(NUnit-ToolPath)nunit-console-x86.exe $(TestAssembliesPath) /nologo /noshadow /domain=single /output=test-results.xml" /> </Target> <Target Name="Coverage" DependsOnTargets="Clean;Compile"> <!-- /domain=single is not support by the NUnit msbuild task, and it is required for OpenCover coverage test --> <Exec Command="$(OpenCover-ToolPath)OpenCover.Console.exe -register:user -target:"$(NUnit-ToolPath)nunit-console-x86.exe" -targetargs:"/noshadow $(TestAssembliesPath) /domain:single" -filter:"+[Model]* +[Core]* +[Datalayer]*" -output:coverage.xml" /> <Delete Files=".\coveragereport" /> <Exec Command="$(ReportGenerator-ToolPath)ReportGenerator.exe coverage.xml "coveragereport" html" /> <Exec Command="$(ReportGenerator-ToolPath)ReportGenerator.exe coverage.xml "coveragereport" xmlsummary" /> <Delete Files="coverage.xml" /> </Target> <Target Name="Build" DependsOnTargets="Clean;Compile;Test;" /> </Project>
Running the different targets from command prompt is easy, just type “msbuild [MSBUILD CONFIG FILE].xml /t:[TARGET]”
[MSBUILD CONFIG FILE] should be the name of the file above, [TARGET] can be any of the following Clean, Compile, Test and Coverage.
The Coverage target generates a fine HTML report as well as a XML summary.
Please note that I have not used the NUnit task from MSBuild community as the /domain=single is important, and as it is currently not supported by that task.