我有一组需要共享状态的xunit.net测试。希望我希望这些测试并行运行。所以我希望跑步者能够做到:
在阅读xunit doc时,它说要在测试类之间共享状态,我需要定义一个'collection fixture',然后将我的所有测试类定义到新的集合中(例如:[Collection("Database collection")]
)。但是,当我将我的测试类放在同一个灯具中时,它们不再并行运行,因此它胜过了目的:(
是否有内置方法可以在XUnit中执行我想要的操作?
我的后备将是将我的共享状态放入静态类中。
答案 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