目前单元测试就只用过 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]