Verify.XunitV3 参数化测试详解:从基础到高级应用
引言
在单元测试中,参数化测试是一种非常强大的技术,它允许我们使用不同的输入参数多次运行同一个测试方法。Verify.XunitV3 提供了丰富的参数化测试支持,本文将深入探讨其核心功能和高级用法。
基础参数化测试
InlineData 基础用法
对于简单的内置类型参数(如 string、int、bool 等),Verify.XunitV3 能够自动识别方法参数并生成相应的验证文件名:
[Theory]
[InlineData("Value1")]
[InlineData("Value2")]
public Task InlineDataUsage(string arg) =>
Verify(arg);
这种用法会生成类似 ClassName.InlineDataUsage_arg=Value1.verified.txt
的验证文件。
MemberData 进阶用法
当测试数据较复杂时,可以使用 MemberData 从方法中获取测试数据:
[Theory]
[MemberData(nameof(GetData))]
public Task MemberDataUsage(string arg) =>
Verify(arg);
public static IEnumerable<object[]> GetData()
{
yield return ["Value1"];
yield return ["Value2"];
}
复杂参数处理
UseParameters 方法
对于复杂参数类型,我们需要使用 UseParameters()
方法来显式指定哪些参数应该用于文件名生成:
[Theory]
[InlineData("Value1")]
[InlineData("Value2")]
public Task UseParametersUsage(string arg)
{
var somethingToVerify = $"{arg} some text";
return Verify(somethingToVerify)
.UseParameters(arg);
}
参数子集选择
有时我们不需要使用所有参数,可以只选择部分参数:
[Theory]
[InlineData("Value1", "Value2", "Value3")]
public Task UseParametersSubSet(string arg1, string arg2, string arg3)
{
var somethingToVerify = $"{arg1} {arg2} {arg3} some text";
return Verify(somethingToVerify)
.UseParameters(arg1, arg2);
}
这会生成类似 ParametersSample.UseParametersSubSet_arg1=Value1_arg2=Value2.verified.txt
的文件名。
自定义参数显示
为复杂类型定义显示名称
对于自定义类型,我们可以通过 NameForParameter
方法指定如何显示参数:
public class ComplexParametersSample
{
[ModuleInitializer]
public static void Initialize()
{
VerifierSettings.NameForParameter<ComplexData>(_ => _.Value);
}
[Theory]
[MemberData(nameof(GetData))]
public Task ComplexMemberData(ComplexData arg) =>
Verify(arg).UseParameters(arg);
public static IEnumerable<object[]> GetData()
{
yield return [new ComplexData("Value1")];
yield return [new ComplexData("Value2")];
}
public record ComplexData(string Value);
}
高级文件名控制
自定义参数文本
使用 UseTextForParameters
可以完全控制文件名中的参数部分:
[Theory]
[InlineData("Value1")]
[InlineData("Value2")]
public Task UseTextForParametersFluent(string arg) =>
Verify(arg + "UseTextForParametersFluent")
.UseTextForParameters(arg);
忽略参数生成统一文件名
有时我们希望所有测试用例使用同一个验证文件,可以使用 IgnoreParametersForVerified
:
[Theory]
[InlineData("One")]
[InlineData("Two")]
public Task IgnoreParametersForVerifiedFluent(string arg) =>
Verify("value")
.IgnoreParametersForVerified(arg);
这会生成:
NamerTests.IgnoreParametersForVerifiedFluent_arg=One.received.txt
NamerTests.IgnoreParametersForVerifiedFluent_arg=Two.received.txt
- 但验证文件统一为
NamerTests.IgnoreParametersForVerifiedFluent.verified.txt
最佳实践
- 简单参数:对于内置类型,直接使用 InlineData 或 MemberData
- 复杂参数:使用 UseParameters 显式指定参数
- 自定义显示:为复杂类型定义 NameForParameter
- 统一验证:当多个测试用例应有相同结果时,使用 IgnoreParametersForVerified
- 参数子集:只选择影响测试结果的参数用于文件名生成
常见问题
Q: 为什么我的复杂参数测试无法生成正确的文件名? A: 对于自定义类型,必须使用 UseParameters 或定义 NameForParameter
Q: 如何让多个测试用例共享同一个验证文件? A: 使用 IgnoreParametersForVerified 方法
Q: 参数顺序会影响文件名吗? A: 是的,参数会按照它们在 UseParameters 中的顺序出现在文件名中
通过掌握这些技术,您可以充分利用 Verify.XunitV3 的参数化测试功能,编写更清晰、更强大的单元测试。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考