代码之家  ›  专栏  ›  技术社区  ›  Dejan Scott Dorman

NUnit 3扩展对失败的调试进行失败测试。明确肯定

  •  2
  • Dejan Scott Dorman  · 技术社区  · 8 年前

    我正在尝试编写一个NUnit 3(3.8.1)扩展,如果测试失败,它可以让测试失败 Debug.Assert(...) (而不是静默运行,甚至挂起,因为它显示了失败的断言对话框)。

    在NUnit 2加载项中,我可以通过取消注册所有调试跟踪侦听器并添加我自己的侦听器来实现这一点,而我自己的侦听器只是抛出一个异常(如示例所述) here ). 然而,这似乎不再适用于NUnit 3。

    我能够成功部署扩展,并且它的代码正在执行。

    [Extension(Description = "Failed Assertions Tracker", EngineVersion = "3.4")]
    public class TrackerEventListener : ITestEventListener
    {
        public void OnTestEvent(string report)
        {
            Console.WriteLine(report); // prints -> so I know this method is being called
            Debug.Listeners.Clear();
            Debug.Listeners.Add(new UnitTestTraceListener());
        }
    }
    

    然而,不幸的是,我的单元测试显示 DefaultTraceListener 已安装。

    [Test]
    public void FailingAssertionShouldNotHang()
    {
        foreach (object listener in Debug.Listeners)
        {
            Console.WriteLine(listener.GetType().FullName);
        }
        Debug.Fail("I'm sorry. I've failed.");
    }
    

    因此,测试显示了对话框,而不是简单地失败。

    我做错了什么?我怀疑呼叫静态 Listeners 收集无效,因为实际测试在不同的上下文中运行(不同的AppDomain、进程,?)。但如果是这样,我该如何解决我的问题呢?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Charlie    8 年前

    重要的是要记住,NUnit 3扩展虽然在少数情况下能够替换NUnit 2插件,但实际上是完全不同的技术。NUnit 3扩展扩展扩展了与框架分离的引擎。

    在这种情况下,您的扩展正在设置跟踪侦听器,该侦听器将捕获任何调试跟踪或断言输出 发动机生产 . 如果引擎包含跟踪语句(它不包含),您将获得输出。与此同时,该框架很高兴继续自己运行测试。

    任何成功捕获跟踪的代码都必须是测试的实际框架执行的一部分。这为您提供了两种选择。

    1. 创建将捕获跟踪的自定义属性。自定义属性允许您在创建或执行测试时采取操作。它们是通过实现框架支持的各种接口创建的。在您的情况下,您希望在程序集级别提供属性,以便捕获 全部的 组件产生的输出。

    2. 自己创建代码作为测试的一部分,而不扩展框架。您可能希望在程序集级别捕获跟踪输出 SetUpFixture 使用 OneTimeSetUp 属性并在 OneTimeTearDown 属性因为这种方法比创建自定义属性更简单,所以我会使用这种方法。