如何在NUnit 3中使用ITestEventListener?

3
我想要向NUnit添加一个自定义测试报告器。我已经在NUnit2中完成了这个任务,但现在我需要使用NUnit3。
为了实现报告器,我需要从框架中获取各种事件,如测试的开始、结束和失败等。
在NUnit2中,我使用了“NUnitHook”来注册我的“EventListener”,并且它的效果非常好。
在NUnit3中,我需要使用“扩展点机制”,但是当我将扩展点添加到项目中时,VisualStudio(2012 ultimate)立即无法发现NUnit测试。
[TypeExtensionPoint(Description = "Test Reporter Extension")]
    public class MyTestEventListener : ITestEventListener
    {

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

    }

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

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

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

    }

我做错了什么吗?有更好的方法来实现它吗?

1个回答

8
您没有说明您要将这段代码放在哪里,但我怀疑它是在您的测试程序集中。如果是这样,那就不应该放在那里。NUnit 引擎扩展需要安装到 NUnit 引擎中,因此需要在一个单独的程序集中。一旦您拥有了一个单独的程序集,您需要告诉引擎它在哪里。目前,您需要在与引擎相同的目录中创建一个 .addins 类型的文件来完成这个步骤。(您可以修改现有的文件,但这会引入未来的维护问题)
未来的版本将提供更简单的方法来安装插件,但它们仍将完全独立于您的测试。
另外一个问题是您正在使用 TypeExtensionPointAttribute。我最初没有注意到这个错误,但它可能是最大的错误,所以现在我添加了这个信息。
“ExtensionPoint” 是您要扩展的对象。NUnit 定义 ExtensionPoints,而您创建 Extenisons 来扩展它们。TypeExtensionPointAttribute 用于在 NUnit 中定义扩展点。您不需要使用它。您应该使用 ExtensionAttribute 来定义您的扩展。
您的扩展应该类似于以下内容:
[Extension(Description = "Test Reporter Extension", EngineVersion="3.4")]
public class MyTestEventListener : ITestEventListener
{
    public void OnTestEvent(string report)
    {
        Console.WriteLine(report);
    }
}

您没有提供您使用的 NUnit 版本。Test Listeners 仅支持从版本 3.4 开始。上面的 EngineVersion 属性目前纯粹是文档性质,因为 3.4 也是第一个识别它的版本。

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


我正在更正我的答案以反映用户代码使用了错误的属性。 - Charlie
1
谢谢,我已经成功编写了插件。现在的问题是,我需要它也能从VS中运行,但我的理解是这还不被支持。我期待着这个增强功能的到来。 - Itai Agmon
1
你可以使用NuGet安装并在包目录中创建一个包含正确相对路径的.addins文件,将其应用到本地机器上。但是它不能在包恢复时自动工作,在许多环境下也无法使用。除此之外,必须等到适配器使用标准引擎包而不是当前使用的定制引擎副本,才能进一步推进。 - Charlie
1
Extension 属性在 NUnit.Engine.Api NuGet 中定义。 - Dejan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接