如何在 xUnit 中并行执行全局 setup/teardown 和 运行 测试?

How to perform global setup/teardown in xUnit and run tests in parallel?

这是我想用 xUnit 实现的目标:

  1. 运行初始化代码。
  2. 运行 并行测试。
  3. 执行拆解。

我试过 [CollectionDefinition]/[Collection]/ICollectionFixture 方法 described here 但它禁用了并行执行,这对我来说很重要。

有什么方法可以 运行 并行测试并能够在 xUnit 中编写全局 setup/tear-down 代码吗?

如果 xUnit 无法实现,NUnit 或 MSUnit 是否支持这种情况?

NUnit 支持这种情况。对于全局设置,在您的根命名空间之一中创建一个 class,并将 [SetupFixture] attribute to it. Then add a [OneTimeSetUp] 方法添加到该 class。对于该名称空间和子名称空间中的所有测试,此方法将获得 运行 一次。这允许您拥有额外的特定于命名空间的一次性设置。

[SetUpFixture]
public class MySetUpClass
{
  [OneTimeSetUp]
  public void RunBeforeAnyTests()
  {
    // ...
  }

  [OneTimeTearDown]
  public void RunAfterAnyTests()
  {
    // ...
  }
}

然后 运行 您的并行测试,在 ParallelScope.All 的程序集级别添加 [Parallelizable] 属性。如果您有不应 运行 与其他测试并行的测试,您可以在较低级别使用 NonParallelizable 属性。

[assembly: Parallelizable(ParallelScope.All)]

运行 NUnit 3.7 及更高版本支持 NUnit 中的并行测试方法。在此之前,它只支持 运行ning test classes 并行。我建议使用最新版本的 NUnit 启动任何项目,以利用错误修复、新功能和改进。

一个比较基本的解决方案是静态的 class,使用静态构造函数并订阅 AppDomain.CurrentDomain.ProcessExit 事件。

public static class StaticFixture
{
    static StaticFixture()
    {
        AppDomain.CurrentDomain.ProcessExit += (o, e) => Dispose();

        // Initialization code here
    }

    private static void Dispose()
    {
        // Teardown code here
    }
}

除了在首次使用时或首次使用之前,无法保证何时调用静态构造函数。