2009-08-21 44 views

回答

12

目標元素有一個OnError屬性,您可以將其設置爲執行錯誤的目標,但因爲它只在目標出錯時執行,所以它只能解決您的一半情況。

您是否考慮過將目標鏈接在一起以表示要執行的測試「步驟」?

<PropertyGroup> 
    <TestSteps>TestInitialization;Test;TestCleanup</TestSteps> 
</PropertyGroup> 

的「TestInitialization」的目標是在那裏你可以執行任何測試初始化​​,「測試」目標執行的測試中,「TestCleanup」目標是否有任何類型的測試後的清理。

然後,使用CallTarget任務執行這些目標,使用RunEachTargetSeparately屬性設置爲。這將執行全部的目標,無論成功或失敗。

完整的樣品低於:

<Project DefaultTargets = "TestRun" 
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" > 

    <!-- Insert additional tests between TestInitialization and TestCleanup as necessary --> 
    <PropertyGroup> 
     <TestSteps>TestInitialization;Test;TestCleanup</TestSteps> 
    </PropertyGroup> 

    <Target Name = "TestRun"> 

     <CallTarget Targets="$(TestSteps)" RunEachTargetSeparately="True" /> 

    </Target> 

    <Target Name = "TestInitialization"> 
     <Message Text="Executing Setup..."/> 
    </Target> 

    <Target Name = "Test"> 
     <Message Text="Executing Test..."/> 

     <!-- this will fail (or should unless you meet the conditions below on your machine) --> 
     <Copy 
      SourceFiles="test.xml" 
      DestinationFolder="c:\output"/> 
    </Target> 

    <Target Name = "TestCleanup"> 
     <Message Text="Executing Cleanup..."/> 
    </Target> 

</Project> 
+0

剛剛來測試這個現在,它完美的作品。感謝這個相當完整的例子。 – ripper234 2009-10-07 15:28:14

+0

np!很高興工作! – 2009-10-07 18:29:22

+1

好的答案,儘管知道如何「重新拋出」,繼續嘗試/最後的比喻會很好。清理可能需要執行,無論如何,但構建仍然失敗。 – 2012-05-04 17:15:16

0

或者使用<OnError>打電話給你的目標在錯誤的情況下,和DependsOnTargetsCallTarget打電話給你相同的目標在正常情況下。