Nunit与CruiseControl.NET的合作非常好,但有一件事让我很烦恼。 如果有一个导致Nunit崩溃的测试,我只会得到关于崩溃的很少信息,因为Nunit的XML报告没有机会被创建并被合并到CruiseControl报告中。
即使Nunit在执行期间崩溃,我也需要一种报告进度的方法。
我试图强制每个测试将一些信息输出到控制台以解决此问题。我已经考虑过使用SetUp方法,但是我还没有找到任何好方法来获取当前运行测试的名称。
答案 0 :(得分:1)
我认为更好的答案是创建一个NUnit外接程序,它实现EventListener接口以捕获TestStarted事件,以将进度输出到控制台或文件。
在NUnit网站上记录了EventListener接口:http://nunit.org/index.php?p=eventListeners&r=2.5
此外,即使NUnit在执行期间崩溃,我们也可以使Dashboard报告更好。我们可以使用以下过程来确保DashBoard始终显示有关测试的内容。
答案 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来处理报告。