c# - 运行 Fixtures 但不是并行 NUnit 中的方法

标签 c# unit-testing testing parallel-processing nunit

我有一个关于使用 NUnit 3.8.0.0、.NET 4.0 和 C# 的参数化装置和方法进行测试并行化的问题。

我目前正在开发一个测试套件,该套件使用一组资源中的每个资源运行测试。由于初始化这些资源非常耗时,而且资源不保持状态,我想在我的测试用例之间共享它们,以提高性能。多个测试不能同时使用这些资源。

为了做到这一点,我制作了一个带有一个参数的构造函数的基础夹具,这使得夹具指向正确的资源。此夹具的实际测试夹具子类。

我有一个测试夹具,它使用构造函数参数(传递给基类)和测试用例参数。基类根据参数初始化一些资源。这些资源不能同时使用。

现在我尝试以这样一种方式并行化这些测试用例,即类 MyParameterizedTestFixture(V1)MyParameterizedTestFixture(V2) 生成的不同夹具中的测试.可以同时运行,但不能同时运行同一夹具中的测试(因为不能同时使用资源)。此外,不同的夹具类可能并行运行。

我的代码如下所示(抽象了细节):

[TestFixture]
[TestFixtureSource(typeof(TestData), "FixtureParams")]
public class MyParameterizedTestFixture : BaseFixture
{
     public MyParameterizedTestFixture(Resource resource) : base (resource) { }

     [Test]
     public void Test1() { /* run test using Resource */ }

     [TestCaseSource("Params")]
     public void TestParameterized(object param) { /* run test using Resource and param */ }
}

我尝试将 Parallelizable(ParallelScope.Self)] 添加到我的派生装置中,但这会导致来自不同装置的测试使用相同的资源(即具有相同的版本) fixture参数,同时运行(只选择一个fixture时有效)。

使用[Parallelizable(ParallelScope.Fixture)]肯定是不正确的,因为它会导致不同的fixture一起运行。使用 [Parallelizable(ParallelScope.Children)] 也是不正确的,因为它会导致 fixture 中的不同测试用例一起运行,而不是来自同一类的不同 fixture。

现在我想知道是否可以通过使用“分层”方法(以某种方式标记可并行化的装置,以另一种方式标记可并行化的方法)来归档我想要的东西,或者是否可以定义自定义并行范围?

最佳答案

NUnit 允许您并行或不并行地运行任何夹具。当一个夹具并行运行时,它可能与任何其他并行夹具同时运行。一些可以一起运行但不能与其他灯具一起运行的灯具分组方式将是一个很好的功能,但我们现在没有这种功能

当你有同一个夹具的多个实例时——即通用或参数化夹具——NUnit 对待这些实例的方式与它对待任何夹具的方式完全相同。也就是说,如果 fixture 是可并行的,则这些实例可以与任何其他实例以及不同 fixture 的实例同时运行。

同样,您可以并行或不并行运行测试用例(方法)。如果并行案例包含在非并行夹具中,则它仅与该夹具的其他方法并行运行。如果它包含在并行夹具中,那么它可以与任何其他并行方法同时运行。

换句话说,对于我们目前拥有的功能,无论是套件、夹具还是测试用例,每个测试的并行性基本上都是全有或全无。这可能会随着 future 版本的增强而改变。

关于c# - 运行 Fixtures 但不是并行 NUnit 中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45733313/

相关文章:

c++ - 谷歌测试装置

c# - 每次在 property getter 中返回新的 ICommand 不好吗?

c# - JSON 响应自定义 .NET Core Web API

unit-testing - 如何扁平化IO(IO())?

unit-testing - 如何覆盖/控制 JVM 获取系统日期的方式?

testing - 如何在 Flutter 小部件中测试回调函数

javascript - onCleanUp() vs onComplete() vs afterLaunch()

c# - SSL 证书预取 .NET

c# - 如何在单个事务中将文件写入磁盘并插入数据库记录?

c++ - 使用 gmock 返回模拟方法参数