XUnit - 混合理论数据机制、输入和预期数据
XUnit - Mixing theory data mechanisms, input and expected data
在使用 XUnit 创建 Theory 测试用例时,我希望能够包含每个用例的参数和预期结果。我使用了 InlineData 属性,但对于繁重的配置加载,这不是最佳选择,并且不允许重用。
[InlineData(1,2,3,4,5,6,7,...)]
因此,我已将测试配置移出到一个单独的 class 中,现在用 MemberData 和 MemberType 加载它们。
[Theory]
[MemberData(nameof(DataClass.Data), MemberType = typeof(DataClass))]
public void TestValidConfig(Configuration config)
{
...
}
然而,这不允许我像使用基本标签时那样指定预期结果,即
[InlineData("Input1", "Input2", "Input3", "ExpectedResult")]
我不想将预期结果包含在配置数据中,因为这将在多个测试中重复使用。
有没有人找到这个挑战的解决方案?
因此,潜在的挑战是拥有复杂的测试数据,可以在多个地方使用,但又想分离预期的结果。因此,在计算器(坏例子)中,您可能拥有作为测试数据的数字列表。然后可以将这些传递到加法或乘法或减法测试中。这是我想将输入数据和预期输出数据分开的地方。
这里有一个建议:
- 创建一个class生成测试数据:
internal static class TestData
{
public static IList<T> Get<T>(int count = 10)
{
// I'm using NBuilder here to generate test data quickly.
// Use your own logic to create your test data.
return Builder<T>.CreateListOfSize(count).Build();
}
}
现在,您所有的测试 classes 都可以利用它来获得相同的测试数据集。所以,在你的数据 class 中,你会按照
的方式做一些事情
public class DataClass
{
public static IEnumerable<object[]> Data()
{
return new List<object[]>
{
new object[] { TestData.Get(), this.ExpectedResult() }
};
}
}
现在您可以按照原来的方法进行操作:
[Theory]
[MemberData(nameof(DataClass.Data), MemberType = typeof(DataClass))]
public void TestValidConfig(Data input, Configuration expected)
{
...
}
如果您的测试不改变输入数据,您可以将它们收集到固定装置中并通过构造函数注入输入数据。这将加快测试速度,因为您不必为每个测试生成输入数据。查看 shared context 了解更多信息。
在使用 XUnit 创建 Theory 测试用例时,我希望能够包含每个用例的参数和预期结果。我使用了 InlineData 属性,但对于繁重的配置加载,这不是最佳选择,并且不允许重用。
[InlineData(1,2,3,4,5,6,7,...)]
因此,我已将测试配置移出到一个单独的 class 中,现在用 MemberData 和 MemberType 加载它们。
[Theory]
[MemberData(nameof(DataClass.Data), MemberType = typeof(DataClass))]
public void TestValidConfig(Configuration config)
{
...
}
然而,这不允许我像使用基本标签时那样指定预期结果,即
[InlineData("Input1", "Input2", "Input3", "ExpectedResult")]
我不想将预期结果包含在配置数据中,因为这将在多个测试中重复使用。
有没有人找到这个挑战的解决方案?
因此,潜在的挑战是拥有复杂的测试数据,可以在多个地方使用,但又想分离预期的结果。因此,在计算器(坏例子)中,您可能拥有作为测试数据的数字列表。然后可以将这些传递到加法或乘法或减法测试中。这是我想将输入数据和预期输出数据分开的地方。
这里有一个建议:
- 创建一个class生成测试数据:
internal static class TestData
{
public static IList<T> Get<T>(int count = 10)
{
// I'm using NBuilder here to generate test data quickly.
// Use your own logic to create your test data.
return Builder<T>.CreateListOfSize(count).Build();
}
}
现在,您所有的测试 classes 都可以利用它来获得相同的测试数据集。所以,在你的数据 class 中,你会按照
的方式做一些事情public class DataClass
{
public static IEnumerable<object[]> Data()
{
return new List<object[]>
{
new object[] { TestData.Get(), this.ExpectedResult() }
};
}
}
现在您可以按照原来的方法进行操作:
[Theory]
[MemberData(nameof(DataClass.Data), MemberType = typeof(DataClass))]
public void TestValidConfig(Data input, Configuration expected)
{
...
}
如果您的测试不改变输入数据,您可以将它们收集到固定装置中并通过构造函数注入输入数据。这将加快测试速度,因为您不必为每个测试生成输入数据。查看 shared context 了解更多信息。