Hypothesis能否实现类似PropEr的测试用例样本统计功能?
Hypothesis测试用例分布统计方案
完全可以,Hypothesis 内置的hypothesis.event接口就是专门用来实现这类测试用例分布统计能力的,和PropEr的collect/2功能定位完全匹配。
具体使用方式
- 你只需要在测试逻辑中,针对每一条生成的测试用例,调用
event()方法传入你要统计的分类标签即可,Hypothesis 会在测试运行结束后自动统计每个标签对应的用例占比,输出标准化的分布统计报告。
对应你给出的Erlang PropEr示例,用Hypothesis实现的等效Python代码如下:
from hypothesis import given, event from hypothesis.strategies import lists, tuples, integers, characters # 对应示例中的key、val生成规则,可根据实际测试场景调整 def key(): return characters() def val(): return integers() def to_range(bucket_size, val): # 对应原示例的分桶逻辑,将重复数归到固定步长的区间 lower = (val // bucket_size) * bucket_size upper = lower + bucket_size return f"({lower},{upper})" @given(lists(tuples(key(), val()))) def test_dupes(kv): m = dict(kv) for k, _v in kv: assert k in m # 计算重复键的总数量 dup_count = len(kv) - len({k for k, _ in kv}) # 等效于PropEr的collect方法,上报统计标签 event(f"dupes,{to_range(5, dup_count)}")
输出效果
测试正常通过后,Hypothesis会在测试结果末尾附带事件统计信息,和你给出的PropEr输出逻辑一致,会明确展示每个分类标签对应的用例占比,典型输出如下:
test_dupes: PASSED 100 passing examples, 0 failing examples Event distribution: * 82.0% dupes,(0,5) * 12.0% dupes,(5,10) * 5.0% dupes,(10,15) * 1.0% dupes,(15,20)
扩展说明
- 如果需要做数值类指标的定向观测,可以搭配
hypothesis.target接口使用,支持对生成用例的数值特征做聚合统计;如果需要记录单条用例的调试细节,可以用hypothesis.note接口。 - 如果需要把统计数据上报到内部监控系统,可以自定义Hypothesis执行监听器,在测试生命周期钩子中读取收集到的event数据,自行完成上报逻辑即可。
内容的提问来源于stack exchange,提问作者Yoshi
相关产品推荐
相关产品推荐

