如何通过代码执行XUnit测试



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

如果不是因为属性,我只会像其他普通方法一样直接调用这些方法。断言仍然被检查,并且它运行良好。但是,如果我直接调用一个具有属性的方法,则会忽略这些属性,并且我必须通过代码手动提供所有测试数据。XUnit中是否有某种测试运行程序类可以重用来实现这一点?我一直在努力挖掘他们的API,但没有成功。

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

但这留下了一个问题。XUnit看到了测试并想运行它,但它做不到,因为这一层没有可用的具体实现,只有接口。因此,我想在更高层编写测试,这些测试只是具体实现的新内容,然后调用传入新主题的接口测试。对于只接受一个参数(主题)的测试,我可以很容易地做到这一点,但对于我也使用InlineData或MemberData的测试,我们希望重用已经提供的测试用例,并将主题添加为第一个参数。

可供参考的是GitHub问题如何从XUnit.net项目中以编程方式运行XUnit测试。

AssemblyRunner现在是Xuit.Runner.Utility.的一部分

从链接的问题来看,xUnit.net的贡献者Brad Wilson在GitHub上的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;
    }

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

无论如何,我都想明白了。仔细查看XUnit的属性层次结构,我发现DataAttributes(InlineData、MemberData等)有一个GetData方法,您可以调用它来检索它们所代表的数据集。通过一点反射,我可以很容易地在我的测试类中找到所有测试并调用测试方法,如果存在的话,调用data属性的get data方法,并通过我自己的代码执行测试。如果我必须扮演自己版本的GetData,它的部分会更加困难。感谢XUnit的作者没有强迫我这么做。

相关内容

  • 没有找到相关文章

最新更新