Используете maxcpucount для параллельного тестирования модулей в msbuild? - PullRequest
0 голосов
/ 28 сентября 2011

В конкретном приложении в стиле SOA, над которым я работаю, у нас есть большое количество модульных тестов в каждом сервисе. Тесты для каждой службы выполняются последовательно, и я хочу протестировать выполнение тестов для каждой службы параллельно.

В нашем файле msbuild есть следующее:

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

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

Таким образом, все сборки проектов тестов заканчиваются именем «Тесты», поэтому они обнаруживаются / подхватываются этим поиском. Было бы возможно / возможно сделать что-то подобное?

<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, она может распараллелить эти наборы тестов?

1 Ответ

1 голос
/ 28 сентября 2011

Вы можете использовать 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>
...