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

返回类实例的策略使用:指定测试用例生成及@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:42:46