在MSBuild中捕获错误状态

Rub*_*ink 3 msbuild xunit.net team-build exit-code

作为使用MSBuild运行xUnit.net测试的一些构建自动化的一部分,我遇到了需要循环遍历一批项目的情况.

在循环内部,我需要检测迭代是否失败,我想继续执行,无论如何.然后在批处理后,我需要知道是否发生了一个或多个错误,以便向TeamBuild报告结果.

IOW,伪代码:

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

Task Name=RunTest
   XUnit item
Run Code Online (Sandbox Code Playgroud)

我希望这可以在没有自定义任务的情况下实现(或者像Jonne那样攻击xunit.net MSBuild任务).(但愿意使用MSBuild社区或Sdc任务)

和@BradWilson:我不可能干净利落地做,我会在NUnit任务中找到Jonne的变化,也可以让它进入xunit任务

另请参阅:如何让Team Build显示xUnit.net测试套件的测试结果和覆盖范围?

Mik*_*ike 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)' != ''"/>
Run Code Online (Sandbox Code Playgroud)

这将运行所有单元测试,无论出现何种故障,但如果出现任何故障,将在所有单元测试运行后失败.注意ContinueOnError="true"确保它们全部运行并且最后的错误检查它们是否有任何失败(在nunit 0中表示成功,其他任何事情都是失败).

注意:这是使用MSBuildCommunityTasks NUnit任务,但如果您只是将exec与nunit exe一起使用,则可以获得相同的效果.输出"ExitCode"对于从ToolTask​​继承的任何Task都是通用的.