【问题标题】:Using maxcpucount to parallelise unit testing in msbuild?使用 maxcpucount 在 msbuild 中并行化单元测试?
【发布时间】:2011-09-28 18:20:25
【问题描述】:

在我正在开发的一个特定的 SOA 风格的应用程序中,我们在每个服务中都有大量的单元测试。每个服务的测试都是串行运行的,我想测试并行运行每个服务的测试。

在我们的 msbuild 文件中如下:

<Target Name="RunUnitTests">
    <ItemGroup Condition="'@(UnitTestsOutput)' == ''">
        <UnitTestsOutput Include="$(UnitTestsOutputFolder)\**\*Tests.dll" />
    </ItemGroup>

    <Exec Command="$(NUnitRunner) /nologo /labels /timeout=30000 @(UnitTestsOutput, ' ')" />
</Target>

因此,所有测试项目程序集都以名称“Tests”结尾,因此通过该搜索可以找到/提取它们。 做这样的事情是否可能/可行?

<Target Name="RunUnitTests">
    <ItemGroup Condition="'@(UnitTestsOutput)' == ''">
        <UnitTestsOutputService1 Include="$(UnitTestsOutputFolder)\*Service1*\*Tests.dll" />
        <UnitTestsOutputService2 Include="$(UnitTestsOutputFolder)\*Service2*\*Tests.dll" />
        <UnitTestsOutputService3 Include="$(UnitTestsOutputFolder)\*Service3*\*Tests.dll" />
        <UnitTestsOutputService4 Include="$(UnitTestsOutputFolder)\*Service4*\*Tests.dll" />
        <UnitTestsOutputService5 Include="$(UnitTestsOutputFolder)\*Service5*\*Tests.dll" />
    </ItemGroup>

    <Exec Command="$(NUnitRunner) /nologo /labels /timeout=30000 @(UnitTestsOutputService1, ' ')" />
    <Exec Command="$(NUnitRunner) /nologo /labels /timeout=30000 @(UnitTestsOutputService2, ' ')" />
    <Exec Command="$(NUnitRunner) /nologo /labels /timeout=30000 @(UnitTestsOutputService3, ' ')" />
    <Exec Command="$(NUnitRunner) /nologo /labels /timeout=30000 @(UnitTestsOutputService4, ' ')" />
    <Exec Command="$(NUnitRunner) /nologo /labels /timeout=30000 @(UnitTestsOutputService5, ' ')" />
</Target>

然后,如果使用 /maxcpucount 运行构建,它可能会并行化这些测试集吗?

【问题讨论】:

    标签: msbuild nunit


    【解决方案1】:

    您可以使用 BuildInParallel = true 和自定义目标:

    <Project .... DefaultTargets="RunAll" />
    ...
        <Target Name="RunSingle">
            <ItemGroup>
                <UnitTestsOutputService Include="$(UnitTestsOutputFolder)\*Service$(ServiceNum)*\*Tests.dll" />
            </ItemGroup>
            <Exec Command="$(NUnitRunner) /nologo /labels /timeout=30000 @(UnitTestsOutputService , ' ')" />
        </Target>
    
        <ItemGroup>
         <Parallel Include="1;2;3;4;5" />
        <ItemGroup>
    
        <Target Name="RunAll">
    
         <ItemGroup>
          <Projects Include="$(MSBuildProjectFile)" > <-- for recursive call to same build file -->
           <Properties>ServiceNum=%(parallel.identity)</Properties> <-- Service1, Service2 .. -->
          </Projects>
         </ItemGroup>
         <MSBuild Projects="@(Projects)" BuildInParallel="true" Targets="RunSingle" />
        </Target>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多