与测试相同的程序集中的 nUnit 扩展

nUnit extension in the same assembly as tests

History: nUnit 3. 我有复杂继承的测试。在 SetUpOneTimeSetUp 内创建了某个对象。这些方法是虚拟的。当此对象未关闭时,会发生泄漏。

问题:对象在TearDownOneTimeTearDown中被销毁,但仅在SetUp或[=12=时调用】 成功。因此,当 TearDownOneTimeTearDown 中某处发生异常时,就会发生泄漏。正如我提到的,有多个继承级别,因此异常和关键对象的创建可能发生在不同的 classes 中,在不同的堆栈帧上。

我想做什么:我想要ITestEventListener在初始化完成之前对失败做出反应并清理关键对象。

我尝试了什么在我的测试程序集中我创建了class:

namespace My.Whatever.Tests.Web.Util
{
    [Extension(EngineVersion = "3.4")]
    public class NunitEventListener : ITestEventListener
    {
        public void OnTestEvent(string report)
        {
            Debug.WriteLine(report);
        }
    }
}

然后我通过

尝试了 运行 测试

None 似乎加载了扩展程序。

问题:我做错了什么?

信息来源:https://github.com/nunit/docs/wiki/Event-Listeners , https://github.com/nunit/docs/wiki/Writing-Engine-Extensions

有关扩展位置的信息可在 https://github.com/nunit/docs/wiki/Engine-Extensibility#locating-addins 中找到,该链接来自您提到的两个参考文献中的第二个。

未在您的测试程序集中搜索扩展。我们在 V2 中为 NUnit Addins 提供了它作为测试扩展的简单方法,但是对于引擎扩展来说这样做有点复杂。在我看来,如果我们能让它工作,那将是一个很好的功能,但它涉及使所有扩展都能够加载和卸载,因为新的测试程序集是 运行。这是我们扩展服务的重大内部变化。

在包含引擎组件的目录中,您可能会找到一个或多个 .addins 类型的文件。是否有,有多少以及它们包含什么取决于您如何安装 运行ner 和引擎。该文件的条目指向为该特定引擎副本安装的扩展。详情见上面的参考页。

在两种情况下,由于 .addins 文件中存在通配符条目,扩展的位置或多或少是自动的:

  1. 如果您使用 NuGet 安装控制台 运行ner,则会找到作为 nuget 包安装的任何扩展。

  2. 如果您使用 Chocolatey 安装控制台 运行ner,将找到由 chocolatey 安装的任何扩展。

在所有其他情况下,恐怕您必须手动编辑 .addins 文件。

在适配器的特定情况下,没有 .addins 文件,因此不会加载任何扩展。理论上,您可以手动创建这样的文件并加载您的扩展,至少如果引擎安装在您有权访问的目录中。如果您使用的是 nuget 包,情况就是如此。我建议您先尝试在控制台下识别您的扩展程序 运行ner,然后再尝试,因为这会涉及额外的复杂性。

顺便说一句,并非所有第三方 运行 用户都使用该引擎。如果他们根本不使用引擎,当然不可能提供扩展。

更新:我只注意到你说 TearDownOneTimeTearDown 只有 运行 当 SetUp orOneTimeSetUp` 成功时。那不是真实的陈述。两种拆解都只有运行如果对应的setup是运行,不管成功与否。当然,您的拆解必须考虑到相应的设置可能没有 运行 完成的事实,这可能很棘手。