2009-06-29 95 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