2009-07-12 59 views
2

Nunit在CruiseControl.NET中运行得很好,但有一件事情让我非常恼火。 如果存在导致Nunit崩溃的测试,我只会收到有关崩溃的信息,因为Nunit的XML报告没有机会创建并合并到CruiseControl报告中。如何在CruiseControl.NET服务器上的NUnit测试崩溃时报告进度?

即使Nunit在执行过程中崩溃,我也需要一种方式来报告进度。

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

回答

0

如果获取当前正在运行的测试的名称是你在做什么,你可以用下面的抓住它后:

using System.Diagnostics; 

... 

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

} 
+1

此方法使用起来很繁琐,因为必须修改每个测试以包含这些行。 – user95319 2009-07-13 22:46:13

0

CruiseControl.net建议您使用NUnit通过你的建设者(即恶性/ MSBuild的)。见这里:http://confluence.public.thoughtworks.org/display/CCNET/NUnit+Task。正如他们所描述的那样 - 它将允许您首先在本地运行这些测试 - 这会给您一个例外,您可以清除。

这就是说 - 您的开发人员是否在签入代码之前运行这些单元测试?这可以缓解这个问题。如果它的集成问题 - 我会建议抓住最新的代码库,并在本地运行测试,看看有什么不同。

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

+0

事实上,即使任务崩溃也没有意义,所以创建一个XML报告是不合理的,因为这会导致xml报告不完整。我们需要的是将进度写入控制台,这也将记录在CruiseControl日志中,以便我们可以轻松识别碰撞测试。 – user95319 2009-07-13 22:50:00

+1

要在本地运行测试将是这个问题的一个很好的解决方案,但它不适合我们的需求。我们使用的测试非常复杂,需要超过20分钟才能运行。更糟的是有时候这个问题只会在服务器上显示出来,这使得调试变得更加困难。 – user95319 2009-07-15 02:10:29

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来处理报告。

1

我认为一个更好的答案是创建一个NUnit加载项,该插件实现EventListener接口来捕获TestStarted事件以将进度输出到控制台或文件。

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

另外,我们可以使仪表板报告甚至更好时,NUnit的执行过程中崩溃。我们可以使用以下程序来确保DashBoard始终显示有关测试的信息。

  1. 有输出的进展到一个单独的文件
  2. 运行测试后,将事件监听运行测试,使用另一个程序来检查文件
  3. 如果该文件不包含特定的“端线”,生成基于该文件的特殊XML报告并将其合并到CruiseControl日志中
相关问题