尽管仅执行一个测试用例,但TestCaseSource多次执行

时间:2018-09-20 14:16:06

标签: c# nunit

我正在使用NUnit 3执行我的测试用例。这里 ContextualTestData成为我的测试数据读取器,并将其传递给测试用例 `

public class ContextualTestData<T> where T : class
    {
        public static T[] ExtractData()
        {
         // Read xml data and serialize then return

        }
}

` 现在我有3个测试用例,引用了这个(ContextualTestData)通用方法来检索数据

[Test, TestCaseSource(typeof(ContextualTestData<Shipping>), nameof(ContextualTestData<Shipping>.ExtractData))]
    public void Should_ExecuteShippingInformationOnce(Shipping shipping)
    {
        // Arrange
        // Act
           Execute(shipping)
        // Assert
    }

与上述订单和销售类似。

在执行这些测试用例之一的测试用例期间,nunit触发ContextualTestData类3次,而不是触发3次,即执行装运测试用例时,它将首先触发Order,然后进行销售,最后进行装运,然后将装运数据传递给交付测试用例,尽管前两个执行不触发其各自的测试用例,但随后却浪费了执行。无论如何,是否将ContextualTestData w.r.t的执行限制为当前正在执行的测试用例。

1 个答案:

答案 0 :(得分:0)

NUnit首先发现(即构造)测试用例,然后执行它们。您的TestCaseSource参与了案例的构建。

测试用例的过滤非常普遍。它可以对测试用例的测试名称,类别或属性进行操作。因此,为了起作用,必须首先构造所有情况。因此,建议您不要使用TestCaseSource方法执行资源密集型工作。

有两种方法可以解决您的问题,甚至可以将它们一起使用...

  1. NUnit 3.11版本将包含使用预过滤的功能。预过滤在发现测试之前进行,并且仅限于选择要包含的特定名称空间,类或方法。其他类和方法将被忽略。不幸的是,该功能尚未发布,仅在使用NUnitLite时可用。已计划为控制台运行程序和vs适配器实施。

  2. 最小化测试用例源正在完成的工作。您可以通过序列化TestCaseSource中的XML数据来实现。取而代之的是,只需检索单个数据项(它们要么需要在单独的文件中,要么至少需要在单个文件中的单独行中,然后将其作为字符串传递给测试。让您的测试调用一种解释数据的方法。 / p>