在每次测试之后,让NUnit控制台在测试运行期间报告测试结果

时间:2014-02-27 13:36:45

标签: c# nunit nunit-console

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

2 个答案:

答案 0 :(得分:3)

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

唯一的另一个选择是您打折的选项,即编写自己的EventListener实现的选项。 The documentation about that interface有点轻松,但如果你改变主意,那么the NUnit documentation about writing an NUnit add-in assembly就足以让你开始。

答案 1 :(得分:0)

首先,在不久的将来,NUnit开箱即可提供此类日志记录 - 此功能已被请求 - Write partial results XML as tests happen instead of at the end

在完成之前,我们需要编写一些自定义代码,以防你使用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接口。