You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在属性基测试(PBT)中管理多类自定义生成器的方案问询

问题:jqwik属性基测试的可复用约束生成方案

背景

我有大量测试用例,原本使用单示例测试输入文件,现在想要转用jqwik框架实现属性基测试(PBT),自动生成多组测试数据。测试资源文件会被反序列化为继承自同一抽象父类的多种POJO实例,因此实际需要生成的是这些实例而非文件。

现有备选方案

1. Arbitrary Builder方案

参考jqwik文档实现,示例代码如下:

// 测试方法
@Property
boolean sentencesEndWithAPoint(@ForAll("someYoungPerson") Person youngPerson) {
    return person.calculateAge() < 21;
}

// 自定义Arbitrary Provider
@Provide
Arbitrary<Person> someYoungPerson() {
    Arbitrary<String> insuranceNumberForStackowerflowInsurance = DomainSpecificArbitraries.stackOwerflowInsuranceNumber();
    Arbitrary<String> names =
        Arbitraries.strings().withCharRange('a', 'z').ofMinLength(3).ofMaxLength(21);
    Arbitrary<Integer> ages = Arbitraries.integers().between(0, 22, null);

    return Builders.withBuilder(() -> new Person(null, -1))
                   .use(names).inSetter(Person::setName)
                   .use(ages).inSetter(Person::setAge)
                   .use(insuranceNumberForStackowerflowInsurance).inSetter(Person::setAge)
                   .build();
}

问题:需要在每个测试文件中编写重复的复杂Provider方法,维护性差。

2. 自定义Domain类方案

示例代码如下:

@Property
@Domain(OldPersonsDomain.class)
void oldPersonCannotBeInsured(@ForAll Person person) {
    //...
}

问题:会产生大量冗余的Domain类,扩展性不足。

期望与困境

我期望能以简洁的链式调用方式指定生成约束,示例如下:

@Property
void oldPersonCannotBeInsured(@ForAll Person person) {
    person.assume()
        .insured(InsuranceCompaniesEnum.STACKOVERFLOW_ACME_INSURANCE)
        .midAge()
        .unemployed()
        .telephoneNumberPattern(TelephoneNumbers.SVK.ORANGE);
}

但由于生成空间过大,无法使用jqwik的Assumptions功能(会过滤大量生成案例)。此前尝试的命名式自定义Provider无法跨类复用,扩展性差,现寻求可维护的简洁解决方案。

内容的提问来源于stack exchange,提问作者LvargaDS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:35:08