Ste*_*man 6 c# xunit xunit.net
我有使用InlineData和MemberData属性在XUnit中编写的测试.我想通过我项目中其他地方的代码运行测试,并让属性自动填充测试数据,就像通常在VS测试运行器中运行时一样.
如果它不是属性,我会像任何其他常规方法一样直接调用方法.断言仍然被检查,它运行正常.但是,如果我直接调用具有属性的方法,则忽略属性,并且必须通过代码手动提供所有测试数据.在XUnit中是否有某种类型的测试运行器类可以重用来实现这一目标?我一直试图挖掘他们的API无济于事.
为什么我要这样做会得到一些解释,但请耐心等待.我正在针对特定接口而不是具体实现编写测试(例如,考虑标准集合接口).那里有足够的测试,我不想为每个具体的实施者复制粘贴它们(可能是几十个).我编写测试一次,然后将接口的每个具体实现作为测试的第一个参数传递,这是一个要测试的主题.
但这留下了一个问题.XUnit看到了测试并希望运行它,但它不能,因为在这一层没有具体的实现,只有接口.所以我想在更高层编写测试,只是新建具体实现,然后调用传递新主题的接口测试.我可以轻松地为只接受1个参数的测试做主题,但是对于我正在使用InlineData或MemberData的测试,我想重用已经提供的测试用例,并且只是将主题添加为第一个参数.
可供参考的是GitHub问题如何从xUnit.net项目以编程方式运行 XUnit 测试.
类AssemblyRunner是现在Xunit.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;
}
Run Code Online (Sandbox Code Playgroud)
为了更深入的了解,他描述了一种使用XunitFrontController和TestDiscoveryVisitor查找并运行测试的方法.这就是AssemblyRunner它的实现.
没关系,我已经弄清楚了。仔细观察 XUnit 的属性层次结构,我发现 DataAttributes(InlineData、MemberData 等)有一个 GetData 方法,您可以调用它来检索它们表示的数据集。经过一点反思,我可以轻松找到测试类中的所有测试并调用测试方法,如果存在任何数据属性的获取数据方法,则调用它,并通过我自己的代码以这种方式执行测试。如果我必须使用我自己的版本,那么 GetData 部分会困难得多。感谢 XUnit 作者没有强迫我这样做。