【问题标题】:xunit programmatically add new tests/"[Facts]"?xunit 以编程方式添加新测试/“[Facts]”?
【发布时间】:2012-10-15 07:19:40
【问题描述】:

我们有一个包含 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 指定“这里,只运行 this 特定的测试”。它目前的构建方式是全有或全无。

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

【问题讨论】:

    标签: unit-testing nunit xunit


    【解决方案1】:

    简单的答案是: ,不直接。但是有一个解决方法,尽管有点老套,如下所示。

    当前情况(从 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 动态生成一个带有测试类的程序集,其中包含每个输入文件的专用测试方法。

    每个生成的方法唯一要做的就是在指定[EnumerateFilesFixture(...)] 属性的类上调用RunTest(string fileName) 方法。有关进一步说明,请参阅链接的要点。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      相关资源
      最近更新 更多