2009-06-29 90 views
3

作爲build automation of running xUnit.net tests with MSBuild的一部分,我遇到了一個需要遍歷一批項目的情況。在MSBuild中捕獲錯誤狀態

在循環內部,我需要檢測迭代是否失敗,但是我想繼續執行而不管。然後在批處理之後,我需要知道是否發生了一個或多個錯誤,以便將結果報告給TeamBuild。

督察,在僞代碼:

Task Name=RunTests 
    CreateItems 
    ForEach item CallTarget Target=RunTest ContinueOnError=true 
    CombineNUnitResults 
    Report success/failure 

Task Name=RunTest 
    XUnit item 

我希望這能夠在不自定義任務來實現(或黑客攻擊xunit.net MSBuild任務爲Jonne一樣)。 (但願意使用的MSBuild社區或SDC任務)

而且@BradWilson:我這是心不是可以做乾淨,我會找Jonne的變化一拉NUnit的任務也使它成爲了xUnit的任務

參見:How do I get Team Build to show test results and coverage for xUnit.net test suite?

回答

6

這是我們做什麼:

<NUnit Assemblies="@(TestAssemblies)" 
    ToolPath="$(NUnitPath)" 
    WorkingDirectory="%(TestAssemblies.RootDir)%(TestAssemblies.Directory)" 
    OutputXmlFile="@(TestAssemblies->'%(FullPath).$(NUnitFile)')" 
    Condition="'@(TestAssemblies)' != ''" 
    ExcludeCategory="$(ExcludeNUnitCategories)" 
    ContinueOnError="true"> 
    <Output TaskParameter="ExitCode" ItemName="NUnitExitCodes"/> 
</NUnit> 

<Error Text="Test error(s) occured" Code="%(NUnitExitCodes.Identity)" Condition=" '%(NUnitExitCodes.Identity)' != '0' And '@(TestAssemblies)' != ''"/> 

這將運行所有的單元測試,無論失敗的,但之後如果有任何故障都已經運行將失敗。注意ContinueOnError="true"確保它們全部運行並且結尾處的錯誤檢查它們中的任何一個是否失敗(在nunit 0表示成功,其他任何情況都是失敗)。

注意:這是使用MSBuildCommunityTasks NUnit任務,但如果你只是使用exec與nunit exe,你可以得到相同的效果。輸出「ExitCode」對於從ToolTask​​繼承的任何任務都是通用的。

+0

嗨邁克,感謝您花時間回覆。從我的閱讀中,ExitCode是一個自定義的NUnit任務屬性,它並未在xUnit任務中實現。 (NUnit任務還需要多個程序集(xUnit doesnt,這就是爲什麼它的參數被稱爲Assembly,並且討論了xUnit codeplex討論))。現在我已經閱讀了筆記,我發現我需要做更多的研究。當我這樣做時(我曾經認爲ExitCode只在NUnit和Exec上),將刪除此評論並將其替換爲更明智的內容。好的工作,我有MSPress的書在路上! – 2009-06-29 18:53:53

+0

啊 - 非常好的一點,xunit Task不是從ToolTask​​派生的,所以在codeplex網站上創建一個[請求它的問題](http://xunit.codeplex.com/WorkItem/View.aspx?WorkItemId=7954)。完成之後,我只需要做一些乾淨的MSBuild東西來遍歷程序集列表併合並XML – 2009-06-30 09:27:13