如何在xUnit中执行全局设置/拆卸并并行运行测试?

时间:2018-02-01 07:31:41

标签: c# parallel-processing initialization nunit xunit

以下是我想用xUnit实现的目标:

  1. 运行初始化代码。
  2. 并行运行测试。
  3. 执行拆解。
  4. 我试过[CollectionDefinition] / [Collection] / ICollectionFixture 接近described here,但它已禁用并行执行,这对我来说至关重要。

    有没有办法并行运行测试并且能够在xUnit中编写全局设置/拆卸代码?

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

2 个答案:

答案 0 :(得分:0)

NUnit支持此方案。对于全局设置,请在其中一个根命名空间中创建一个类,并为其添加[SetupFixture]属性。然后向该类添加[OneTimeSetUp]方法。对于该命名空间和子命名空间中的所有测试,此方法将运行一次。这允许您具有其他命名空间特定的一次性设置。

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

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

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

[assembly: Parallelizable(ParallelScope.All)]

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

答案 1 :(得分:0)

某种基本的解决方案是使用带有静态构造函数并订阅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
    }
}

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