当NUnit测试在CruiseControl.NET服务器上崩溃时,如何报告进度?

时间:2009-07-12 14:01:08

标签: nunit continuous-integration cruisecontrol.net

Nunit与CruiseControl.NET的合作非常好,但有一件事让我很烦恼。 如果有一个导致Nunit崩溃的测试,我只会得到关于崩溃的很少信息,因为Nunit的XML报告没有机会被创建并被合并到CruiseControl报告中。

即使Nunit在执行期间崩溃,我也需要一种报告进度的方法。

我试图强制每个测试将一些信息输出到控制台以解决此问题。我已经考虑过使用SetUp方法,但是我还没有找到任何好方法来获取当前运行测试的名称。

4 个答案:

答案 0 :(得分:1)

我认为更好的答案是创建一个NUnit外接程序,它实现EventListener接口以捕获TestStarted事件,以将进度输出到控制台或文件。

在NUnit网站上记录了EventListener接口:http://nunit.org/index.php?p=eventListeners&r=2.5

此外,即使NUnit在执行期间崩溃,我们也可以使Dashboard报告更好。我们可以使用以下过程来确保DashBoard始终显示有关测试的内容。

  1. 使用EventListener运行测试,该测试将进度输出到单独的文件
  2. 运行测试后,使用其他程序检查文件
  3. 如果文件不包含特定的“结束行”,请根据文件生成特殊的XML报告并将其合并到CruiseControl日志中

答案 1 :(得分:0)

如果获取当前正在运行的测试的名称,那么您可以使用以下内容获取它:

using System.Diagnostics;

...

[Test]
public void SomeTestThatWillCrash()
{
    StackFrame sf = new StackFrame();
    Console.WriteLine("Now running method: " + sf.GetMethod().Name);
    ...

} 

答案 2 :(得分:0)

CruiseControl.net建议您通过构建器使用NUnit(即NAnt / MSBuild)。见这里:http://confluence.public.thoughtworks.org/display/CCNET/NUnit+Task。正如他们所描述的那样 - 它将允许您首先在本地运行这些测试 - 这应该为您提供一个可以清理的例外。

话虽如此 - 您的开发人员是否在检入代码之前运行这些单元测试?这可以缓解这个问题。如果它是一个集成问题 - 我建议抓住最新的代码库并在本地运行测试以查看不合适的内容。

我不知道NUnit是否能够创建结果文件,即使它崩溃了。即使它确实如此 - 如果由于崩溃导致该文件格式不正确,您可能会遇到问题。

答案 3 :(得分:0)

您可以使用@jpoh的方法,但在TestSetup方法中执行此操作,这需要您在每个夹具中执行此操作。如果真的需要,你可以写一个基类,你的所有测试装置都继承了实现这个方法。

另一种解决方案是使用MSBuild运行NUnit并使用MSBuildCommunityTasks库中的任务。这允许您继续出错并从NUnit返回错误代码。你不会得到导致问题的方法,但可能有所帮助。这是我的MSBuild目标:

  <Target Name="UnitTest"
            DependsOnTargets="BuildIt">

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

    <!-- Copy the test results for the CCNet build before a possible build failure (see next step) -->
    <CallTarget Targets="CopyTestResults" Condition="'@(TestAssemblies)' != ''"/>
    <Error Text="Test error(s) occured" Code="%(NUnitExitCodes.Identity)" Condition=" '%(NUnitExitCodes.Identity)' != '0' And '@(TestAssemblies)' != ''"/>

  </Target>

这可能不符合您的需求,但是可以尝试和使用。

那就是说,我同意@rifferte的说法,你觉得你需要在本地调试问题,而不是依靠CC.NET来处理报告。