MSBuild предназначен для запуска всех тестов, даже если некоторые из них не пройдены - PullRequest
5 голосов
/ 14 января 2011

У меня есть скрипт MSBuild, который запускает модульные тесты NUnit, используя консоль.Есть несколько тестовых проектов, и я хотел бы сохранить их как отдельные цели MSBuild, если это возможно.Если тесты не пройдены, я хочу завершить сборку.Однако я хочу продолжить выполнение всех тестов, даже если некоторые из них не пройдут.

Если я установлю ContinueOnError="true", то сборка будет успешной независимо от результатов тестирования.Если оставить значение false, сборка будет остановлена ​​после первого неудачного тестового проекта.

1 Ответ

7 голосов
/ 14 января 2011

Один из способов сделать это - установить ContinueOnError="true" для задач NUnit, но получить код выхода из процесса NUnit.Если код выхода когда-либо равен! = 0, создайте новое свойство, которое можно использовать позже в скрипте для сбоя сборки.

Пример:

<Project DefaultTargets="Test"
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <UnitTests Include="test1">
      <Error>true</Error>
    </UnitTests>
    <UnitTests Include="test2">
      <Error>false</Error>
    </UnitTests>
    <UnitTests Include="test3">
      <Error>true</Error>
    </UnitTests>
    <UnitTests Include="test4">
      <Error>false</Error>
    </UnitTests>
    <UnitTests Include="test5">
      <Error>false</Error>
    </UnitTests>
  </ItemGroup>

  <Target Name="Test" DependsOnTargets="RunTests">
    <!--Fail the build.  This runs after the RunTests target has completed-->
    <!--If condition passes it will out put the test assemblies that failed-->
    <Error Condition="$(FailBuild) == 'True'"
           Text="Tests that failed: @(FailedTests) "/>
  </Target>

  <Target Name="RunTests" Inputs="@(UnitTests)" Outputs="%(UnitTests.identity)">
    <!--Call NUnit here-->
    <Exec Command="if %(UnitTests.Error) == true exit 1" ContinueOnError="true">
      <!--Grab the exit code of the NUnit process-->
      <Output TaskParameter="exitcode" PropertyName="ExitCode" />
    </Exec>

    <!--Just a test message-->
    <Message Text="%(UnitTests.identity)'s exit code: $(ExitCode)"/>

    <PropertyGroup>
      <!--Create the FailedBuild property if ExitCode != 0 and set it to True-->
      <!--This will be used later on to fail the build-->
      <FailBuild Condition="$(ExitCode) != 0">True</FailBuild>
    </PropertyGroup>

    <ItemGroup>
      <!--Keep a running list of the test assemblies that have failed-->
      <FailedTests Condition="$(ExitCode) != 0"
                   Include="%(UnitTests.identity)" />
    </ItemGroup>
  </Target>

</Project>
...