NUnit 单元测试 + TestContainers = 全局 `OneTimeSetup` 和 `OneTimeTearDown`

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

我正在尝试充分利用 TestContainers 和 NUnit 来运行我的 .NET 测试。 我有两个测试用例,一旦开始,就会获取一个创建的 MongoDb 容器,连接到它,完成它们的工作,然后处理给定的容器。

如下图所示,当前执行时间约为 9 秒,两个测试分别耗时约 5 秒和约 4 秒。

每个测试都继承自基类,该基类具有负责容器生命周期的

OneTimeSetUp
OneTimeTearDown
实现:

[OneTimeSetUp]
public async Task OneTimeSetup()
{
    _testContainer = new MongoDbBuilder().Build();
    await _testContainer.StartAsync();

    _client = new MongoClient(_testContainer.GetConnectionString());
    Database = _client.GetDatabase("test");
}

[OneTimeTearDown]
public async Task OneTimeTeardown() => await _testContainer.DisposeAsync();

如您所见,对于每个测试,都会运行相同的

setup
teardown
,从而导致在每个测试中创建和销毁容器。

我想要实现的是:

Global Setup <==== spin the container here
Test1 Setup <---- uses the newly created container
Test1 Run
Test1 Teardown

Test2 Setup  <---- uses the same container
Test2 Run
Test2 Teardown

Global Teardown <==== destroys the container here

有没有办法可以使用 NUnit 实现这一目标? 谢谢大家!

c# .net nunit
1个回答
0
投票

因为您在基类中进行了拆卸和设置,所以它将在每次设置和拆卸之前运行,就像您所看到的一样......

https://docs.nunit.org/articles/nunit/writing-tests/attributes/onetimesetup.html

继承 OneTimeSetUp 属性是从任何基类继承的。因此,如果基类定义了 OneTimeSetUp 方法,则该方法将在派生类中的任何方法之前调用。 您可以在基类中定义一个 OneTimeSetUp 方法,在派生类中定义另一个方法。 NUnit 将在派生类中的方法之前调用基类 OneTimeSetUp 方法。

您可以有一个一次性设置的拆卸方法来调用基类,但该属性是在继承的类上分配的。

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