Мы настроили рекурсивный скрипт MSBuild для одновременного запуска модульных тестовых библиотек, который выглядит примерно так:
<Target Name="UnitTestDll">
<Message Text="Testing $(NUnitFile)" />
<ItemGroup>
<ThisDll Include="$(NUnitFile)"/>
</ItemGroup>
<NUnit ToolPath="$(NUnitFolder)" Assemblies="@(ThisDll)" OutputXmlFile="$(TestResultsDir)\%(ThisDll.FileName)-test-results.xml" ExcludeCategory="Integration,IntegrationTest,IntegrationsTest,IntegrationTests,IntegrationsTests,Integration Test,Integration Tests,Integrations Tests,Approval Tests" ContinueOnError="true" />
</Target>
<Target Name="UnitTest" DependsOnTargets="Clean;CompileAndPackage">
<Message Text="Run all tests in Solution $(SolutionFileName)" />
<CreateItem Include="$(SolutionFolder)**\bin\$(configuration)\**\*.Tests.dll" Exclude="$(SolutionFolder)\NuGet**;$(SolutionFolder)**\obj\**\*.Tests.dll;$(SolutionFolder)**\pnunit.tests.dll">
<Output TaskParameter="Include" ItemName="NUnitFiles" />
</CreateItem>
<ItemGroup>
<TempProjects Include="$(MSBuildProjectFile)">
<Properties>NUnitFile=%(NUnitFiles.Identity)</Properties>
</TempProjects>
</ItemGroup>
<RemoveDir Directories="$(TestResultsDir)" Condition = "Exists('$(TestResultsDir)')"/>
<MakeDir Directories="$(TestResultsDir)"/>
<MSBuild Projects="@(TempProjects)" BuildInParallel="true" Targets="UnitTestDll" />
</Target>
Вам, очевидно, все еще нужны ваши цели компиляции (или в нашем случае CompileAndPackage), чтобы на самом деле сначала построить тестовые библиотеки.
Это также портит ваши результаты NUnit для большинства инструментов отчетности, но, решив эту проблему, мы уже написали инструмент, который поможет с этим: https://github.com/15below/NUnitMerger