如何在 xUnit 中并行执行全局 setup/teardown 和 运行 测试?
How to perform global setup/teardown in xUnit and run tests in parallel?
这是我想用 xUnit 实现的目标:
- 运行初始化代码。
- 运行 并行测试。
- 执行拆解。
我试过 [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
}
}
除了在首次使用时或首次使用之前,无法保证何时调用静态构造函数。
这是我想用 xUnit 实现的目标:
- 运行初始化代码。
- 运行 并行测试。
- 执行拆解。
我试过 [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
}
}
除了在首次使用时或首次使用之前,无法保证何时调用静态构造函数。