如何通过代码执行 XUnit 测试

2024-02-22

我使用 InlineData 和 MemberData 属性在 XUnit 中编写了测试。我想通过项目中其他地方的代码运行测试,并让属性自动填充测试数据,就像通过 VS 测试运行程序运行时通常所做的那样。

如果没有属性,我会像任何其他普通方法一样直接调用这些方法。断言仍在检查并且功能正常。但是,如果我直接调用具有属性的方法,则属性将被忽略,并且我必须通过代码手动提供所有测试数据。 XUnit 中是否有某种测试运行器类可以重用来完成此任务?我一直在尝试挖掘他们的 API,但没有成功。

为什么我要这样做需要一些解释,但请耐心等待。我正在针对特定接口而不是其具体实现编写测试(例如,考虑标准集合接口)。有很多东西需要测试,我不想为每个具体实现者(可能有几十个)复制粘贴它们。我编写一次测试,然后将接口的每个具体实现作为测试的第一个参数传递,这是测试的主题。

但这留下了一个问题。 XUnit 看到测试并想要运行它,但它不能,因为这一层没有可用的具体实现,只有接口。因此,我想在更高层编写测试,仅更新具体实现,然后调用传入新主题的接口测试。对于只接受 1 个参数(主题)的测试,我可以轻松地执行此操作,但是对于我也使用 InlineData 或 MemberData 的测试,我想重用已经提供的那些测试用例,只需将主题添加为第一个参数。


可供参考的是GitHub问题如何以编程方式运行 XUnit 测试 https://github.com/xunit/xunit/issues/542来自 xUnit.net 项目。

班上AssemblyRunner is 现在是 Xunit.Runner.Utility 的一部分 https://github.com/xunit/xunit/blob/2.4.1/src/xunit.runner.utility/Runners/AssemblyRunner.cs.

从链接的问题中,xUnit.net 贡献者 Brad Wilson 提供了样品跑者 https://github.com/xunit/samples.xunit/blob/master/TestRunner/Program.cs in the GitHub 上的示例.xunit 项目 https://github.com/xunit/samples.xunit。该程序演示了本期中描述的技术。即,在发现测试后负责运行测试的部分如下:

    using (var runner = AssemblyRunner.WithAppDomain(testAssembly))
    {
        runner.OnDiscoveryComplete = OnDiscoveryComplete;
        runner.OnExecutionComplete = OnExecutionComplete;
        runner.OnTestFailed = OnTestFailed;
        runner.OnTestSkipped = OnTestSkipped;
        
        Console.WriteLine("Discovering...");
        runner.Start(typeName);
        
        finished.WaitOne();  // A ManualResetEvent
        finished.Dispose();
        
        return result;
    }

为了更深入地研究,他描述了一种使用的方法XunitFrontController and TestDiscoveryVisitor查找并运行测试。这是什么AssemblyRunner为其实施做准备。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过代码执行 XUnit 测试 的相关文章

随机推荐