How to execute xUnit class tests in parallel using common fixture?

Viewed 427

I understand that by default xUnit will execute tasks within a class in series, but will execute tasks across classes in parallel.

I've created 3 test classes, but They each need common setup data (in a db - yes i know including a db is an unfortunate circumstance, but that inclusion can't change).

So to initialize the data set in the db, I created a fixture:

/// <summary>
/// This fixture is used to initialize a known state of test data in the database
/// </summary>
public class DBFixture
{
    /// <summary>
    /// Clear out and create new test data.  Ensure we have a known state of input data.
    /// </summary>
    public DBFixture()
    {
        string script = File.ReadAllText("Database\\DataSetup.sql");
        using (SqlConnection con = new SqlConnection(...))
        {
            var result = con.QueryMultiple(script);
        }
    }
}

Then to associate the fixture to multiple classes, I create a class that associates the fixture to a collection.

/// <summary>
/// 
/// </summary>
/// <see cref="https://xunit.net/docs/shared-context"/>
[CollectionDefinition("My Collection")]
public class MyCollection: ICollectionFixture<DBFixture>
{
    // This class has no code, and is never created. Its purpose is simply
    // to be the place to apply [CollectionDefinition] and all the
    // ICollectionFixture<> interfaces.

    //This class, and it's CollectionDefinition attribute tell the xUnit framework that any Test class that has a Collection attribute with the same collection name, will use the same instance of DBFixture.
}

Then I create my test classes, with my tests, and associate them to my collection.

[Collection("My Collection")]
public class MyTests
{
    ...
}
[Collection("My Collection")]
public class MyTests2
{
    ...
}

When I run all my tests, there does not appear to be any parallelization, and I think it's because now all my test classes are part of the same collection. Is there a way to have a common fixture instance across test class & have parallel execution?

1 Answers

I use Assembly Fixture (Nuget)

Refer

public class TestClass : IAssemblyFixture<TestFixture>
{
    private readonly TestFixture fixture;

    public MyTest(TestFixture fixture)
    {
        this.fixture = fixture;
    }

    [Fact]
    public void MyTest()
    {
        // test code here
    }
}

Register TestFramework replacement in AssemblyInfo.cs file:

[assembly: TestFramework("Xunit.Extensions.Ordering.TestFramework", "Xunit.Extensions.Ordering")]
Related