【问题标题】:nUnit extension in the same assembly as tests与测试在同一程序集中的 nUnit 扩展
【发布时间】:2017-10-24 15:53:47
【问题描述】:

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

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

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

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

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

然后我尝试通过

运行测试
  • VS(nunit 3 测试适配器)
  • nUnit 控制台

似乎没有加载扩展。

问题:我做错了什么?

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

【问题讨论】:

    标签: c# unit-testing nunit nunit-3.0


    【解决方案1】:

    有关如何定位扩展程序的信息可在 https://github.com/nunit/docs/wiki/Engine-Extensibility#locating-addins 找到,它与您提到的两个参考文献中的第二个链接。

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

    在包含引擎程序集的目录中,您可能会找到一个或多个.addins 类型的文件。是否有一个,有多少以及它们包含的内容将取决于您如何安装跑步者和引擎。该文件具有指向为该特定引擎副本安装的扩展的条目。有关详细信息,请参阅上述参考页面。

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

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

    2. 如果您使用 Chocolatey 安装控制台运行程序,则可以找到所有由 Chocolatey 安装的扩展。

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

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

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

    更新:我只是注意到您的声明,即 TearDownOneTimeTearDown 仅在 SetUp orOneTimeSetUp` 成功时运行。这不是一个真实的说法。这两种拆解只有在相应的设置为 run 时才会运行,无论是否成功。当然,您的拆解必须考虑到相应的设置可能尚未完成,这可能很棘手。

    【讨论】:

    • 谢谢 Poole 先生,我接受这个作为答案,但对于我的情况,也许还有其他方法可以订阅“测试失败”事件?否则到目前为止,我能看到的最简单的事情是使用 AOP 或执行动态发出 IL 并在运行时修补代码。
    • 在我的回答中查看更新。如果您只想注意到测试失败,那么您应该能够在其中一个拆解中做到这一点。具体来说,在最后一次拆解运行中执行此操作,这对应于第一次安装运行。我想不出任何不进行拆解的情况。
    • 您好,Poole 先生,我已经对其进行了多次验证,并且遇到了以下情况:1) 我的测试有 OneTimeSetUp 和 SetUp。 2) SetUp 是基类中的虚方法,被重写为空; 3) OneTimeSetup 创建一个对象。 4) 我在 teamcity 日志中看到的内容:“SetUp Error”指向我的 OneTimeSetup,在对象初始化中带有 invalidOperationException,然后没有任何关于 OneTimeTearDown 正在运行。我的 oneTimeTearDown 期待这种情况,如果被调用(生成日志)就会运行。但事实并非如此。
    • 如果错误是在创建测试夹具对象时,则不会运行 OneTimeSetUp(无论日志说什么),因此不会运行 OneTimeTearDown。 OTOH,如果错误在您的 OneTimeSetUp 内部(例如,如果您在其中实例化某个失败的对象),OneTimeTearDown 将运行。
    • 除非此错误仅出现在 TeamCity 运行中,否则您需要跳出 teamcity 并在桌面上实际调试它才能真正了解发生了什么。
    猜你喜欢
    • 2017-11-30
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多