You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 00:49:51