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

如何自定义Hypothesis策略生成Thing对象列表用于单元测试?

问题

假设我定义了如下Thing类:

class Thing:
    def __init__(self, x, y):
        ...

同时有一个处理Thing对象列表的函数:

def do_stuff(list_of_things):
    ...

我希望为do_stuff编写单元测试,需要用到不同的Thing对象列表实例。请问能否自定义Hypothesis策略来生成这类测试用例?

回答

当然可以,完全可以通过自定义Hypothesis策略生成Thing对象列表,具体实现步骤如下:

1. 定义单个Thing对象的生成策略

首先要为Thing构造方法的x、y参数生成符合业务逻辑的测试数据,用Hypothesis的st.builds()方法将参数策略和Thing类绑定:

from hypothesis import strategies as st

# 示例:假设x是整数,y是非空字符串,可根据实际需求调整参数策略
thing_strategy = st.builds(Thing, x=st.integers(), y=st.text(min_size=1))

st.builds()会自动调用Thing的构造函数,传入对应策略生成的参数,生成合法的Thing实例。

2. 生成Thing对象列表的策略

用st.lists()将单个Thing的策略包装成列表策略,还能控制列表的长度范围:

# 生成长度在0到10之间的Thing对象列表,长度范围可按需修改
thing_list_strategy = st.lists(thing_strategy, min_size=0, max_size=10)

3. 在单元测试中使用自定义策略

结合pytest和Hypothesis的@given装饰器,就能自动生成多样化的测试用例:

import pytest
from hypothesis import given

@given(thing_list=thing_list_strategy)
def test_do_stuff(thing_list):
    # 执行测试逻辑,调用do_stuff并验证结果
    result = do_stuff(thing_list)
    # 示例断言:假设do_stuff返回列表长度,可根据实际逻辑修改
    # assert len(result) == len(thing_list)

按需优化策略适配业务约束

如果Thing的x、y有特定约束(比如x必须为正整数,y只能是固定枚举值),直接调整参数策略即可:

# 示例:x为正整数,y是枚举选项中的字符串
from enum import Enum

class YOption(Enum):
    A = "option_a"
    B = "option_b"

thing_strategy = st.builds(
    Thing,
    x=st.integers(min_value=1),
    y=st.sampled_from([item.value for item in YOption])
)

内容的提问来源于stack exchange,提问作者Galen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:42:23