我有使用InlineData和MemberData属性用XUnit编写的测试。我想通过我项目中其他地方的代码运行测试,并让属性自动填充测试数据,就像它们在运行VS测试运行器时通常所做的那样。
如果不是属性,我会像其他普通方法一样直接调用这些方法。断言仍然被检查,并且它运行良好。但是,如果我直接调用具有这些属性的方法,这些属性将被忽略,并且我必须通过代码手动提供所有测试数据。在XUnit中有没有某种类型的测试运行器类,我可以重用来完成这个任务?我一直在尝试挖掘他们的API,但没有结果。
我为什么要这样做需要一些解释,但请耐心等待。我正在编写针对特定接口的测试,而不是针对它们的具体实现(例如,考虑标准集合接口)。有很多东西需要测试,我不想为每个具体的实现者复制粘贴它们(可能有几十个)。我只编写一次测试,然后将接口的每个具体实现作为测试的第一个参数传递给测试对象。
但这留下了一个问题。XUnit看到了测试并想要运行它,但它不能,因为在这一层没有具体的实现可用,只有接口。因此,我想在更高层编写新的具体实现的测试,然后调用传入新主题的接口测试。对于只接受一个参数的测试,我可以很容易地做到这一点,但对于我也使用InlineData或MemberData的测试,我希望重用已经提供的那些测试用例,只需将主题添加为第一个参数。
发布于 2017-07-18 05:13:16
可供参考的是来自xUnit.net项目的GitHub issue How to programmatically run XUnit tests。
类AssemblyRunner是now part of Xunit.Runner.Utility。
从链接的问题,xUnit.net贡献者布拉德·威尔逊在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;
    }为了深入研究,他描述了一种使用XunitFrontController和TestDiscoveryVisitor来查找和运行测试的方法。这就是AssemblyRunner为其实现所做的事情。
发布于 2015-03-26 01:05:44
不要紧,我想通了。仔细观察XUnit的属性层次结构,我发现DataAttributes (InlineData、MemberData等)有一个GetData方法,您可以调用它来检索它们所表示的数据集。通过一点反射,我可以轻松地找到我的测试类中的所有测试并调用测试方法,调用data属性的get data方法(如果存在),并通过我自己的代码以这种方式执行测试。如果我必须扮演我自己版本的GetData部分,那就会困难得多。感谢XUnit的作者们没有强迫我这么做。
https://stackoverflow.com/questions/29246860
复制相似问题