3

我在我的测试程序集上运行 NUnit 控制台,但有时我的 NUnit 崩溃(我目前正在找出原因)。当 nunit 崩溃时,没有创建 xml 报告,我实际上没有任何测试报告。试运行时间很长,如果我丢失了整个试运行报告,情况就很糟糕。有没有办法告诉 NUIt 在运行时(每次测试后)写入 xml 日志文件。即使这意味着 xml 文件不会正确关闭。我知道可以使用 NUnit TestListener。但是是否有一个开关或不包括自己编写额外代码的东西。

4

2 回答 2

3

nunit-console您可以使用/labels命令行开关调用。这将导致它在运行时将每个测试的(完全限定的)名称写入控制台,尽管输出不包括测试结果。但是,它会向您显示哪些测试已成功运行。

唯一的其他选择是您打折的选择,即编写自己的EventListener实现。关于该接口的文档有点简单,但是如果您改变主意,关于编写 NUnit 插件程序集的 NUnit 文档应该足以让您入门。

于 2014-05-06T22:04:28.793 回答
0

首先,在不久的将来,NUnit 将提供开箱即用的日志记录——这个特性已经被请求了——在测试发生而不是最后写入部分结果 XML

在完成之前,我们需要编写一些自定义代码,如果你使用 NUnit < 3.x,它非常简单:
1)你需要创建一个实现 EventListener 接口的事件监听器
2)这个接口为不同的测试执行状态提供通知,例如. RunStarted、RunFinished 或 TestFinished。您所需要做的只是实现与您的案例相关的日志记录。我的代码片段:

 public void RunStarted(string name, int testCount)
 {
     try
     {
         _instanceId = Environment.GetEnvironmentVariable("InstanceId");
         _buildId = Environment.GetEnvironmentVariable("BuildId");
         _browser = Environment.GetEnvironmentVariable("BrowserToTest");
         _template = Environment.GetEnvironmentVariable("TemplateToTest");
     }
     catch { }
 }

 public void TestFinished(TestResult result)
 {
     if (result.ResultState == ResultState.Ignored)
     {
         return;
     }
     var r = new TestingWorkerData
     {
         BuildId = _buildId,
         InstanceId = _instanceId,
         TestName = result.FullName,
         Success = result.IsSuccess,
         TimeTaken = result.Time.ToString(CultureInfo.InvariantCulture),
         Message = result.Message,
         StackTrace = result.StackTrace,
         Browser = _browser,
         Template = _template
     };         
     File.AppendAllLines(@"z:\\results.txt", new[] {JsonConvert.SerializeObject(r)});
 }

 public class TestingWorkerData
 {
     public string TestName { get; set; }
     public bool Success { get; set; }
     public string TimeTaken { get; set; }
     public string Message { get; set; }
     public string StackTrace { get; set; }
     public string InstanceId { get; set; }
     public string Browser { get; set; }
     public string Template { get; set; }
     public string BuildId { get; set; }
 }

3)最后一件事是创建 NUnit 插件:

[NUnitAddin]
public class ProgressReporterNugetAddin : IAddin
{
    public bool Install(IExtensionHost host)
    {
        var listeners = host.GetExtensionPoint("EventListeners");
        listeners.Install(new ProgressReporterEventListener());
        return true;
    }
}

注意:有一篇很好的文章http://jimmykeen.net/2015/02/28/logging-test-results-with-nunit/涵盖了类似的方法等等。
不幸的是,它仅适用于NUnit < 3.x,因为 NUnit3 被大量重写 - 例如。没有 EventListener 接口了。

于 2016-06-19T20:17:20.720 回答