Hypothesis能否压缩自身未发现的失败测试用例?
如何用Hypothesis进一步压缩手动缩减的失败测试用例
当然可以用Hypothesis进一步压缩这个45元素的失败测试用例,核心是利用Hypothesis的**自动简化(shrinking)**能力,以下是具体操作步骤:
给测试函数绑定已知失败用例
把你手动缩减后的45元素列表,通过@example装饰器加到测试函数上,让Hypothesis优先运行这个确定会失败的输入:from hypothesis import given, example from hypothesis.strategies import lists, tuples, floats @given(data=lists(tuples(floats()))) @example(data=你的45元素列表) # 替换成你实际的列表数据 def test_percentile(data): # 原测试逻辑:调用目标函数并验证结果 result = percentile_function(data) assert result == expected_value运行测试时,Hypothesis检测到该示例触发失败后,会立刻启动简化流程,自动尝试移除、修改列表元素,直到找到最小规模的能触发bug的输入。
用
find函数手动触发简化
如果@example的方式没达到预期,还可以用hypothesis.find函数直接指定起点和失败条件,强制触发简化:from hypothesis import find def triggers_bug(data): # 定义判断逻辑:输入是否会触发bug try: percentile_function(data) # 若函数无异常但结果错误,此处添加断言判断 assert ... return False except (AssertionError, ValueError): # 替换成实际触发的异常类型 return True # 以45元素列表为起点,找到最小的触发bug的输入 minimal_failure_case = find( lists(tuples(floats())), triggers_bug, example=你的45元素列表 ) print("最小失败用例:", minimal_failure_case)
需要注意:
- 确保测试函数/
triggers_bug函数能准确识别失败场景——只有Hypothesis明确知道输入会导致测试失败时,才能进行有效的简化。 - Hypothesis的简化算法擅长处理结构化数据,会优先保留触发bug的关键元素(比如特定浮点数极值、元组组合),最终可能把45个元素压缩到几个甚至单个元素就能触发bug的程度。
内容的提问来源于stack exchange,提问作者Zac Hatfield-Dodds
相关产品推荐
相关产品推荐

