2014-02-27 84 views
3

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

回答

3

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

唯一的其他选择是你打折的那个,写你自己的EventListener实施。 The documentation about that interface有点亮,但如果你改变了主意,the NUnit documentation about writing an NUnit add-in assembly应该足以让你开始。

0

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

,直到其完成,我们需要编写一些自定义代码,并在案件u使用NUnit的< 3.x中它很简单:
1)你需要创建一个事件监听器实现事件监听接口
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接口了。