xunit以编程方式添加新测试/“[Facts]”?

时间:2012-10-25 06:40:01

标签: unit-testing nunit xunit

我们有一个充满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文件的数量和名称时,我想添加它们。

1 个答案:

答案 0 :(得分:1)

简单的答案是: ,不是直接的。但是存在一种虽然有点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(...)]方法。有关进一步说明,请参阅链接的要点。

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