
Hypothesis 不支持为 @given 定义的部分参数提供 @example,所有 @example 必须显式指定与 @given 策略完全一致的参数名和数量。
hypothesis 不支持为 `@given` 定义的部分参数提供 `@example`,所有 `@example` 必须显式指定与 `@given` 策略完全一致的参数名和数量。
在 Hypothesis 中,@example 装饰器的设计原则是完全确定性覆盖:每个示例必须明确提供函数签名中所有参数的值,以确保可复现性和与 @given 策略的一致性校验。当你写成:
@given(a=st.integers(), b=st.integers())
@example(a=0) # ❌ 错误:缺少 b
def test_example(a, b):
assert a + b > -100
Hypothesis 会在运行时抛出 InvalidArgument 异常,提示 "Inconsistent args: @given() got strategies for 'a', 'b', but @example() got arguments for 'a'" —— 这是因为内部校验严格比对了 @given 声明的参数键({'a', 'b'})与 @example 提供的关键字({'a'}),二者不匹配即拒绝执行。
✅ 正确做法是补全所有参数。若希望某个参数在示例中“占位但不约束”,可结合自定义哨兵值(sentinel)或使用 st.just(...) 在 @given 中预设默认行为,但 @example 本身不允许省略任何参数:
from hypothesis import given, example, strategies as st
# ✅ 正确:显式提供全部参数
@given(a=st.integers(), b=st.integers())
@example(a=0, b=42) # 全参数指定
@example(a=-5, b=0) # 全参数指定
def test_example(a, b):
assert isinstance(a, int) and isinstance(b, int)
⚠️ 注意事项:
-
@example不支持None、...或object()作为“忽略”占位符——它们会被当作真实传入值参与测试逻辑; - 若需灵活控制某些参数的示例值,建议改用
@given配合st.just()或st.sampled_from()实现“固定+随机”混合策略,例如:@given(a=st.just(0), b=st.integers()) # a 固定为 0,b 仍随机生成 def test_example(a, b): ... - 多个
@example可叠加使用,但每个都必须满足全参数要求; - 所有
@example将在@given生成的随机用例之前优先执行(FIFO 顺序)。
总结:Hypothesis 的 @example 是强契约式示例机制,不是“部分填充”的快捷方式。保持参数完整性既是设计约束,也是保障测试可靠性的关键前提。











