【问题标题】:How to execute XUnit tests via code如何通过代码执行 XUnit 测试
【发布时间】:2015-05-28 14:29:54
【问题描述】:

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

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

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

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

【问题讨论】:

  • 出于好奇,为什么要自己调用测试方法?
  • 我在问题中添加了解释,因为它需要的不仅仅是几个词。我希望我在这里寻找的东西是有意义的。

标签: c# xunit xunit.net


【解决方案1】:

可供参考的是来自 xUnit.net 项目的 GitHub 问题 How to programmatically run XUnit tests

AssemblyRunner 的类是 now part of Xunit.Runner.Utility

在链接问题中,xUnit.net 贡献者 Brad Wilson 在samples.xunit project on GitHub 中提供了sample runner。该程序演示了问题中描述的技术。即发现后负责运行测试的部分如下:

    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;
    }

为了更深入地了解,他描述了一种使用XunitFrontControllerTestDiscoveryVisitor 来查找和运行测试的方法。这就是AssemblyRunner 的实现方式。

【讨论】:

    【解决方案2】:

    没关系,我想通了。仔细查看 XUnit 的属性层次结构,我发现 DataAttributes(InlineData、MemberData 等)有一个 GetData 方法,您可以调用它来检索它们所代表的数据集。通过一点思考,我可以轻松地找到我的测试类中的所有测试并调用测试方法,如果有的话,调用 data 属性的 get data 方法,然后通过我自己的代码执行测试。如果我必须扮演自己的角色,GetData 部分会更加困难。感谢 XUnit 作者没有强迫我这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 2022-12-10
      • 1970-01-01
      相关资源
      最近更新 更多