如何在jqwik中指定@ForAll注解的非零整数取值范围?
实现方案
- 方案1:快速实现(适合少量使用场景)
直接在测试方法中添加过滤假设即可,代码如下:
import net.jqwik.api.ForAll; import net.jqwik.api.Property; import static net.jqwik.api.Assume.that; public class NonZeroIntTest { @Property void yourTestMethod(@ForAll int input) { // 直接过滤掉值为0的用例 that(input != 0); // 后续测试逻辑 } }
注意:该方案会在生成0时直接跳过当前用例,若用例生成逻辑中0的占比过高可能会影响测试执行效率,适合非高频使用的场景。
- 方案2:自定义生成器(推荐,性能更优)
通过自定义Arbitrary提供器直接生成仅包含正整数和负整数的取值集合,从生成源头避免出现0,效率更高,适合高频使用的场景:
import net.jqwik.api.Arbitraries; import net.jqwik.api.Arbitrary; import net.jqwik.api.ForAll; import net.jqwik.api.Property; import net.jqwik.api.Provide; public class NonZeroIntTest { // 定义非零整数生成器 @Provide Arbitrary<Integer> nonZeroIntegers() { return Arbitraries.oneOf( // 生成所有正整数 Arbitraries.integers().positive(), // 生成所有负整数 Arbitraries.integers().negative() ); } @Property void yourTestMethod(@ForAll("nonZeroIntegers") int input) { // 此处input必然为非零整数,无需额外判断 // 后续测试逻辑 } }
如果需要多次复用该非零整数约束,还可以封装为自定义约束注解,直接标注在参数上使用,无需每次单独定义生成器。
内容的提问来源于stack exchange,提问作者Leponzo
相关产品推荐
相关产品推荐

