在属性基测试(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
相关产品推荐
相关产品推荐

