Verify.XunitV3 参数化测试详解:从基础到高级应用

Verify.XunitV3 参数化测试详解:从基础到高级应用

Verify Verify - 一个快照工具,用于简化复杂数据模型和文档的断言,适合从事自动化测试和持续集成/持续部署(CI/CD)的程序员。 Verify 项目地址: https://gitcode.com/gh_mirrors/ve/Verify

引言

在单元测试中,参数化测试是一种非常强大的技术,它允许我们使用不同的输入参数多次运行同一个测试方法。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

最佳实践

  1. 简单参数:对于内置类型,直接使用 InlineData 或 MemberData
  2. 复杂参数:使用 UseParameters 显式指定参数
  3. 自定义显示:为复杂类型定义 NameForParameter
  4. 统一验证:当多个测试用例应有相同结果时,使用 IgnoreParametersForVerified
  5. 参数子集:只选择影响测试结果的参数用于文件名生成

常见问题

Q: 为什么我的复杂参数测试无法生成正确的文件名? A: 对于自定义类型,必须使用 UseParameters 或定义 NameForParameter

Q: 如何让多个测试用例共享同一个验证文件? A: 使用 IgnoreParametersForVerified 方法

Q: 参数顺序会影响文件名吗? A: 是的,参数会按照它们在 UseParameters 中的顺序出现在文件名中

通过掌握这些技术,您可以充分利用 Verify.XunitV3 的参数化测试功能,编写更清晰、更强大的单元测试。

Verify Verify - 一个快照工具,用于简化复杂数据模型和文档的断言,适合从事自动化测试和持续集成/持续部署(CI/CD)的程序员。 Verify 项目地址: https://gitcode.com/gh_mirrors/ve/Verify

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咎旗盼Jewel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值