在与XUnit.net并行运行的测试之间共享状态

时间:2017-01-26 17:04:50

标签: xunit.net

我有一组需要共享状态的xunit.net测试。希望我希望这些测试并行运行。所以我希望跑步者能够做到:

  • 创建共享夹具
  • 使用该灯具
  • 并行运行 所有测试

在阅读xunit doc时,它说要在测试类之间共享状态,我需要定义一个'collection fixture',然后将我的所有测试类定义到新的集合中(例如:[Collection("Database collection")])。但是,当我将我的测试类放在同一个灯具中时,它们不再并行运行,因此它胜过了目的:(

是否有内置方法可以在XUnit中执行我想要的操作?

我的后备将是将我的共享状态放入静态类中。

2 个答案:

答案 0 :(得分:1)

您可以使用AssemblyFixture example从下面粘贴的示例中扩展xUnit,以创建一个夹具,该夹具可以在并行运行时通过测试进行访问。

使用此方法,在测试之前创建夹具,然后将其注入引用它的测试中。我用它来创建一个用户,然后为该特定设置运行共享该用户。

还有一个可用的nuget软件包,源代码:https://github.com/kzu/xunit.assemblyfixture

using System;
using Xunit;

// The custom test framework enables the support
[assembly: TestFramework("AssemblyFixtureExample.XunitExtensions.XunitTestFrameworkWithAssemblyFixture", "AssemblyFixtureExample")]

// Add one of these for every fixture classes for the assembly.
// Just like other fixtures, you can implement IDisposable and it'll
// get cleaned up at the end of the test run.
[assembly: AssemblyFixture(typeof(MyAssemblyFixture))]

public class Sample1
{
    MyAssemblyFixture fixture;

    // Fixtures are injectable into the test classes, just like with class and collection fixtures
    public Sample1(MyAssemblyFixture fixture)
    {
        this.fixture = fixture;
    }

    [Fact]
    public void EnsureSingleton()
    {
        Assert.Equal(1, MyAssemblyFixture.InstantiationCount);
    }
}

public class Sample2
{
    MyAssemblyFixture fixture;

    public Sample2(MyAssemblyFixture fixture)
    {
        this.fixture = fixture;
    }

    [Fact]
    public void EnsureSingleton()
    {
        Assert.Equal(1, MyAssemblyFixture.InstantiationCount);
    }
}

public class MyAssemblyFixture : IDisposable
{
    public static int InstantiationCount;

    public MyAssemblyFixture()
    {
        InstantiationCount++;
    }

    public void Dispose()
    {
        // Uncomment this and it will surface as an assembly cleanup failure
        //throw new DivideByZeroException();
    }
}

答案 1 :(得分:0)

您不希望在测试之间共享状态,您只想共享运行测试所需的设置。您可以在此处阅读有关如何在xUnit中执行此操作的所有内容(有很多示例):http://xunit.github.io/docs/shared-context.html

如果您碰巧使用实体框架,我也在这里写了一些内容:https://robertengdahl.blogspot.com/2017/01/testing-against-entityframework-using.html