5

我们有一个充满 JSON 文本文件的文件夹,需要将其设置为单个 URI。目前,这一切都是用一个 xUnit "[Fact]" 完成的,如下所示

[Fact]
public void TestAllCases()
{
    PileOfTests pot = new PileOfTests();
    pot.RunAll();
}

pot.RunAll() 然后解析文件夹,加载 JSON 文件(比如 50 个文件)。然后每个都针对 URI 进行锤击,以查看每个返回 HTTP 200(“ok”)。如果有任何失败,我们目前正在通过使用将其打印为失败

System.Console.WriteLine("\n >> FAILED ! << " + testname + "\n");

这确实确保了失败引起我们的注意,但 xUnit 认为所有测试都失败了(可以理解)。最重要的是,我们不能对 xunit 指定“这里,只运行这个特定的测试”。它目前的构建方式全有或全无。

如何以编程方式添加测试用例?当我阅读 *.json 文件的数量和名称时,我想添加它们。

4

1 回答 1

3

简单的答案是: ,不直接。但是存在一种解决方法,虽然有点 hacky,如下所示。

当前情况(从 xUnit 1.9.1 开始)

通过指定[RunWith(typeof(CustomRunner))]一个类,可以指示 xUnit 使用必须实现的 CustomRunner 类Xunit.Sdk.ITestClassCommand来枚举用这个属性修饰的测试类上可用的测试。

但不幸的是,虽然测试方法的调用已经与 System.Reflection + 实际方法分离,但将测试传递给测试运行器的方式并没有。

在用于调用特定测试方法的 xUnit 框架代码中的某处,有一个对typeof(YourTestClass).GetMethod(testName).

这意味着,如果实现测试发现的类返回的测试名称不引用测试类上的真实方法,则测试将显示在 xUnit GUI 中 - 但任何运行/调用它的尝试都以TargetInvocationException.

解决方法

如果考虑一下,解决方法本身就相对简单。可以找到它的工作实现here

提出的解决方案首先读取文件的名称,这些文件应该在 xUnit GUI 中显示为不同的测试。然后,它使用System.Reflection.Emit动态生成带有测试类的程序集,该测试类包含每个输入文件的专用测试方法。

每个生成的方法唯一要做的就是调用RunTest(string fileName)指定[EnumerateFilesFixture(...)]属性的类上的方法。请参阅链接的要点以获得进一步的解释。

希望这可以帮助; 如果您愿意,请随意使用示例实现。

于 2013-03-01T17:30:51.270 回答