我正在开发一个使用 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
实例,以避免并行执行期间发生冲突。我的问题是:
每个测试方法都会在当前设置下获得
sharedObject
的新实例吗?
如果没有,修改设置以确保每个测试方法获得单独实例的最佳方法是什么?
我考虑过使用
[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
实例,从而使测试能够安全地并行执行?对于这种情况还有其他推荐的做法吗?
谢谢您的帮助!
由于[SetUp]方法在每个测试用例之前运行,因此每个测试用例都将获得一个单独的sharedObject实例。如果sharedObject持有任何非托管资源,您应该在[TearDown]方法中处置它。
但是,您的可并行化属性不允许方法并行运行。 ParallelScope.Self(默认值)意味着该属性适用于它出现的测试,在本例中是您的装置。因此,它表示您的装置可以与其他装置并行运行,而各个方法保留默认值。