2011-01-14 22 views
5

Tôi có một tập lệnh MSBuild chạy thử nghiệm đơn vị NUnit, sử dụng trình điều khiển Á hậu. Có nhiều dự án thử nghiệm và tôi muốn giữ chúng như là các mục tiêu MSBuild riêng biệt, nếu có thể. Nếu các thử nghiệm thất bại, tôi muốn xây dựng tổng thể thất bại. Tuy nhiên, tôi muốn tiếp tục chạy tất cả các bài kiểm tra, ngay cả khi một số bài kiểm tra thất bại.Mục tiêu MSBuild để chạy tất cả các thử nghiệm, ngay cả khi một số lỗi không

Nếu tôi đặt ContinueOnError="true" thì xây dựng thành công bất kể kết quả thử nghiệm. Nếu tôi để nó sai thì xây dựng sẽ dừng lại sau dự án thử nghiệm đầu tiên thất bại.

Trả lời

7

Một cách để thực hiện việc này là đặt ContinueOnError="true" cho các tác vụ NUnit nhưng lấy mã thoát của quy trình NUnit. Nếu mã thoát là bao giờ hết! = 0 tạo một thuộc tính mới mà bạn có thể sử dụng sau này trong kịch bản để không xây dựng được.

Ví dụ:

<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, ví dụ yêu cầu msbuild 3.5 để chạy. –

Các vấn đề liên quan