SuperAPI AI 工具集

property-based-testing

测试与质量

查看项目

更新于 10-15 21:36

技能介绍

属性测试(Property-Based Testing,PBT)通过生成随机输入并验证属性对所有输入成立,替代针对具体样例的测试方式,核心是测试不变量。

适用场景:序列化配对(encode/decode)、契约清晰的纯函数、校验器与归一化器、数据结构操作。

属性目录:往返 decode(encode(x))==x(序列化、转换配对);幂等 f(f(x))==f(x)(归一化、格式化、排序);不变量(任意变换前后成立);交换律 f(a,b)==f(b,a)(二元/集合操作);结合律;单位元 f(x,identity)==x;逆运算 f(g(x))==x(加解密、压缩解压);预言机 new_impl(x)==reference(x)(优化、重构);易验证 is_sorted(sort(x));无异常(最弱基线)。强度层级由弱到强:无异常→类型保持→不变量→幂等→往返,应尽量选最强适用属性。

模式识别:出现 encode/decode、toJSON/fromJSON、pack/unpack 时优先用往返;normalize/sanitize/canonicalize 用幂等;is_valid 配合归一化器验证归一化后有效;排序与比较器用幂等加顺序;自定义集合用不变量。

不适用:无转换逻辑的简单 CRUD、UI/展示逻辑、需复杂外部环境的集成测试、无法隔离的副作用代码、需求多变的原型、具体样例已足够且边界已知的测试。

库参考:Python 用 Hypothesis(from hypothesis import given, strategies as st);TypeScript/JS 用 fast-check(import fc from 'fast-check');Rust 用 proptest;Go 用 rapid(import "pgregory.net/rapid");Java 用 jqwik;Haskell 用 QuickCheck。

输入策略:尽早把约束构建进策略而非用 assume() 过滤;设置尺寸上限防止测试过慢;使用贴近现实的约束;复用策略定义。设置建议:开发用 max_examples=10,CI 用 200,夜间/发布用 1000 且 deadline=None。

质量检查:断言非重言式、足够强、非空洞、用 @example 覆盖边界、不在断言中重实现函数逻辑、策略约束现实、设置匹配场景。常见错误:测试 mock 行为、在测试中重实现函数、用 assume() 过滤、缺少边界样例、只写一个属性。