2011-01-14 6 views
5

コンソールランナーを使用してNUnitユニットテストを実行するMSBuildスクリプトがあります。可能であれば、複数のテストプロジェクトがあり、それらを別々のMSBuildターゲットとして保持したいと考えています。テストが失敗した場合、私は全体的に失敗してビルドしたいと考えています。しかし、たとえいくつかのテストが失敗しても、すべてのテストを実行し続けたいと思います。MSBuildは、いくつか失敗してもすべてのテストを実行するターゲットです。

ContinueOnError="true"と設定すると、テストの成果に関係なくビルドが成功します。私がそれを偽にしておくと、失敗した最初のテストプロジェクトの後にビルドが停止します。

答えて

7

これを行う1つの方法は、NUnitタスクに対してContinueOnError="true"を設定することですが、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> 
+0

FYI、例を実行するためのMSBuild 3.5が必要です。 –

関連する問題