如何自定义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
相关产品推荐
相关产品推荐

