返回类实例的策略使用:指定测试用例生成及@example正确性验证
回答:是的,
@example装饰器完全可以实现你的需求 你提到的两种特定测试场景,都能通过Hypothesis的@example装饰器强制触发,同时还能保留@given自动生成测试用例的能力。下面是针对你的需求给出的具体实现方案:
先梳理你的原始代码(修正了策略绘制的细节)
import hypothesis.strategies as st from hypothesis import given, example # 假设object_a是你定义的目标类/数据结构 class object_a: def __init__(self, **kwargs): self.__dict__.update(kwargs) class A(st.SearchStrategy): def do_draw(self, data): # 注意:策略需要通过draw(data)生成具体值,而非直接返回策略对象 return object_a(b=st.integers().draw(data), c=st.boolean().draw(data)) class B(st.SearchStrategy): def do_draw(self, data): return object_a(d=st.boolean().draw(data), e=st.boolean().draw(data)) @given(a=A(), b=B()) def test_A_and_B(a, b): # 你的测试逻辑示例 assert isinstance(a, object_a) assert isinstance(b, object_a)
实现需求1:强制生成a = A(b=<任意整数>, c=True)的用例
你提到b可为任意值,结合需求描述,应该是希望a的c固定为True,b可以是任意整数。我们可以通过@example直接构造符合要求的实例,同时保留原有策略的灵活性:
@given(a=A(), b=B()) # 直接构造c=True的a实例,b用默认策略生成的任意实例 @example(a=object_a(b=5, c=True), b=B().example()) # 若需要覆盖更多b的取值,可添加多个@example @example(a=object_a(b=100, c=True), b=B().example()) def test_A_and_B(a, b): # 测试逻辑 pass
如果想要批量生成多个b值的用例,还可以用@examples(复数形式,需额外导入):
from hypothesis import examples @given(a=A(), b=B()) @examples(a=object_a(b=n, c=True), b=B().example()) for n in [5, 10, 15, 20]) def test_A_and_B(a, b): pass
实现需求2:强制生成a = A(b=10, c=True)且b = B(d=<True/False>, e=<任意值>)的用例
这里需要同时指定a的具体值,以及b的部分参数固定、部分参数灵活的情况。我们可以分别构造符合要求的a和b实例:
@given(a=A(), b=B()) # 覆盖d=True和d=False两种情况,e用随机生成的布尔值 @example(a=object_a(b=10, c=True), b=object_a(d=True, e=st.boolean().example())) @example(a=object_a(b=10, c=True), b=object_a(d=False, e=st.boolean().example())) def test_A_and_B(a, b): # 测试逻辑 pass
额外说明
@example的核心作用是强制Hypothesis运行你指定的测试用例,这些用例会和@given自动生成的用例一起执行,确保你关心的特定场景被覆盖。- 如果你需要长期让
A生成c=True的实例,修改A类的策略会更高效,但@example更适合快速添加临时的特定测试场景。
内容的提问来源于stack exchange,提问作者curious_george
相关产品推荐
相关产品推荐

