如何在NUnit 3中使用ITestEventListener?

Ita*_*mon 2 c# nunit

我想向NUnit添加一个自定义测试报告器。我已经用NUnit2完成了,但是现在我需要使用NUnit3。

要实现报告程序,我需要从框架中获取各种事件,例如测试的开始,结束和失败。

在NUnit2中,我曾经NUnitHook注册EventListener过它,效果很好。

在NUnit3中,我需要使用扩展点机制,但是当我将扩展点添加到项目中时,VisualStudio(2012旗舰版)立即无法发现NUnit测试。

[TypeExtensionPoint(Description = "Test Reporter Extension")]
    public class MyTestEventListener : ITestEventListener
    {

        public void OnTestEvent(string report)
        {
            Console.WriteLine(report);
        }

    }
Run Code Online (Sandbox Code Playgroud)

如果我从类中删除ITestEventListener实现声明,它将完美地重新发现测试。

[TypeExtensionPoint(Description = "Test Reporter Extension")]
    public class MyTestEventListener //: ITestEventListener
    {

        public void OnTestEvent(string report)
        {
            Console.WriteLine(report);
        }

    }
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?有没有更好的方法来实现呢?

Cha*_*lie 5

您没有说要把这段代码放在哪里,但是我怀疑它在您的测试程序集中。如果是这样,那不属于它。NUnit引擎扩展已安装到NUnit引擎中,因此它们需要在单独的程序集中。一旦有了单独的组件,就需要告诉引擎它在哪里。当前,您可以通过.addins在与引擎相同的目录中创建一个类型为type的文件来执行此操作。(您可以修改现有文件,但是将来会带来维护问题)

将来的发行版将具有一种更简单的安装插件的方法,但是它们仍将与测试完全分开。

另一个问题是您正在使用TypeExtensionPointAttribute。我最初没有在您的代码中注意到这一点,这可能是最大的错误,所以我现在添加此信息。

“ ExtensionPoint”是您要扩展的东西。NUnit定义扩展点,同时您创建扩展以扩展它们。TypeExtensionPointAttribute在NUnit内部用于定义扩展点。您不使用它。您使用ExtensionAttribute来定义扩展名。

您的扩展名应定义如下:

[Extension(Description = "Test Reporter Extension", EngineVersion="3.4")]
public class MyTestEventListener : ITestEventListener
{
    public void OnTestEvent(string report)
    {
        Console.WriteLine(report);
    }
}
Run Code Online (Sandbox Code Playgroud)

您没有说正在运行什么版本的NUnit。从版本3.4开始仅支持测试监听器。到目前为止,上面的EngineVersion属性纯粹是记录性的,因为3.4也是第一个识别它的版本。

NUnit文档中有一个新的文章可能会有所帮助:https : //github.com/nunit/docs/wiki/Writing-Engine-Extensions