通过基类中的共享对象初始化确保测试的安全并行执行

问题描述 投票:0回答:1

我正在开发一个使用 NUnit 进行测试的 .NET 项目。我有一个基测试类

BaseA
,它在其构造函数中初始化共享对象。我的派生类
A
包含几个测试方法。我使用
[Parallelizable(ParallelScope.Self)]
属性来允许在此类中并行执行测试。这是我的设置的简化版本:

public class BaseA
{
    protected IMyInterface sharedObject;

    public BaseA()
    {
        sharedObject = new MyClass(); // Initialization in the base constructor
    }
}

[TestFixture]
[Parallelizable(ParallelScope.Self)]
public class A : BaseA
{
    [Test]
    public void Test1()
    {
        sharedObject.Method1();
        // Other operations with sharedObject
    }

    [Test]
    public void Test2()
    {
        sharedObject.Method2();
        // Other operations with sharedObject
    }

    // Additional tests
}

我想确保每个测试方法都会收到自己的

sharedObject
实例,以避免并行执行期间发生冲突。我的问题是:

  1. 每个测试方法都会在当前设置下获得

    sharedObject
    的新实例吗?

  2. 如果没有,修改设置以确保每个测试方法获得单独实例的最佳方法是什么?

我考虑过使用

[SetUp]
方法来初始化
sharedObject
,但我不确定这是否是最好的方法。这是我认为可能有效的方法:

public class BaseA
{
    protected IMyInterface sharedObject;

    [SetUp]
    public void BaseSetup()
    {
        sharedObject = new MyClass(); // Initialization before each test
    }
}

[TestFixture]
[Parallelizable(ParallelScope.Self)]
public class A : BaseA
{
    [Test]
    public void Test1()
    {
        sharedObject.Method1();
        // Other operations with sharedObject
    }

    [Test]
    public void Test2()
    {
        sharedObject.Method2();
        // Other operations with sharedObject
    }

    // Additional tests
}

这种方法能否确保每个测试方法获得一个单独的

sharedObject
实例,从而使测试能够安全地并行执行?对于这种情况还有其他推荐的做法吗?

谢谢您的帮助!

.net nunit
1个回答
0
投票

由于[SetUp]方法在每个测试用例之前运行,因此每个测试用例都将获得一个单独的sharedObject实例。如果sharedObject持有任何非托管资源,您应该在[TearDown]方法中处置它。

但是,您的可并行化属性不允许方法并行运行。 ParallelScope.Self(默认值)意味着该属性适用于它出现的测试,在本例中是您的装置。因此,它表示您的装置可以与其他装置并行运行,而各个方法保留默认值。

© www.soinside.com 2019 - 2024. All rights reserved.