【问题标题】:How to use ITestEventListener in NUnit 3?如何在 NUnit 3 中使用 ITestEventListener?
【发布时间】:2016-08-03 16:39:18
【问题描述】:

我想向 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);
        }

    }

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

【问题讨论】:

    标签: c# nunit


    【解决方案1】:

    你没有说你把这段代码放在哪里,但我怀疑它在你的测试程序集中。如果是这样,那不属于它。 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。仅从 3.4 版开始支持测试侦听器。上面的 EngineVersion 属性此时纯粹是记录性的,因为 3.4 也是第一个识别它的版本。

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

    【讨论】:

    • 我正在更正我的答案以反映用户代码使用了错误的属性这一事实。
    • 谢谢,我已经成功编写了插件。现在的问题是我需要它也可以从 VS 运行,我的理解是它还不支持。我期待着这项改进。
    • 它可能可以在您的本地计算机上运行,​​方法是使用 NuGet 安装并在包目录中创建一个 .addins 文件,其中包含正确的相对路径。但它不会在包还原时自动工作,这在许多环境中都排除了它。除此之外,它必须等到适配器使用标准引擎包,而不是像现在这样使用引擎的自定义副本。
    • Extension 属性在NUnit.Engine.Api nuget 中定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多