xUnit.NET 的共享上下文和数据驱动测试

目前单元测试就只用过 xUnit.NET,有时候写 [Fact] 不够用,所以也看看别的。

共享上下文

如果有一个长耗时属性在每个测试里都用到了,那么可以共享这个属性。如

public class PatientShould
{
    private readonly LongTimeTask _task;

    public PatientShould()
    {
        _task = new LongTimeTask();
    }

    // Fact list…
}

这个 LongTimeTask 耗时比较长,每个测试都要用到,那么只让它构造一次就可以了。 新建以下类:

public class LongTimeTaskFixture: IDisposable
{
    public LongTimeTask Task { get; }

    public LongTimeTaskFixture()
    {
        Task = new LongTimeTask();
    }

    public void Dispose()
    {
    }
}

然后让我们的测试类实现接口 IClassFixture<LongTimeTaskFixture>,在构造函数中添加参数 LongTimeTaskFixture fixture,将原来的 _task = new LongTimeTask() 改为 _task = fixture.Task 即可。

数据驱动测试

Theory 的三种用法。

InlineData 忽略不说。
MemberData

新建以下类:

public class CalculatorTestData
{
    private static readonly List<object[]> Data = new List<object[]>
    {
        new object[] {1, 2, 3},
        new object[] {2, 3, 5}
    }

    public static IEnumerable<object[]> TestData => Data;
}

然后给测试添加属性:

[Theory]
[MemberData(nameof(CalculatorTestData.TestData), MemberType = typeof(CalculatorTestData))]
自定义属性

新建以下类:

public class CalculatorDataAttribute: DataAttribute
{
    public override IEnumerable<object[]> GetData(MethodInfo testMethod)
    {
        yield return new object[] { 0, 1, 2 };
        yield return new object[] { 1, 2, 3 };
    }
}

然后给测试添加属性

[Theory]
[CalculatorData]