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

Pydantic自定义类型调用Hypothesis build策略返回空值问题咨询

问题根因

你遇到的问题本质是Hypothesis没有为你自定义的CountryTimeZone类型注册对应的生成策略,只能默认按照父类的规则生成最简单的样本值。

1. 自定义类型无法生成合法时区值的原因

Pydantic 内置的PaymentCardNumber、EmailStr等自定义类型可以直接生成有效值,是因为Pydantic的Hypothesis插件已经为这些内置类型单独实现并注册了对应的生成策略,会严格按照类型的校验规则生成符合要求的值。
而你自己实现的CountryTimeZone属于自定义类型,Hypothesis没有对应的生成规则,只会继承父类StrictStr的默认生成逻辑,生成的字符串自然不会匹配时区校验规则。

2. StrictStr/str默认生成空字符串的原因

StrictStr本身的校验逻辑仅限制值必须是原生字符串类型,不包含非空、长度、格式等额外约束,Hypothesis针对该类型的默认生成策略本身包含空字符串。且Hypothesis默认会优先输出最小、最简单的符合规则的测试用例,空字符串是最短的合法字符串,所以会频繁返回空值。你改为直接继承str基类也是同理,str的默认生成逻辑同样包含空字符串,在没有额外约束的情况下会优先生成空值。

解决方案

有两种常用方式解决生成问题:

方式1:全局注册自定义类型的生成策略

在测试代码运行前,为CountryTimeZone注册全局生成策略,后续所有调用st.builds生成该类型的地方都会自动使用指定规则:

from hypothesis import strategies as st
import pytz

st.register_type_strategy(
    CountryTimeZone,
    # 从合法时区集合中随机采样生成值
    st.sampled_from(sorted(pytz.common_timezones_set))
)

# 注册后原有测试代码无需修改即可正常生成合法值
@given(st.builds(Foo))
def test_something_interesting(schema) -> None:
    # 你的断言逻辑
    ...

方式2:生成时手动指定字段策略

如果不想全局注册,也可以在调用st.builds时单独指定bar字段的生成规则:

@given(
    st.builds(
        Foo, 
        bar=st.sampled_from(sorted(TIMEZONES))
    )
)
def test_something_interesting(schema) -> None:
    # 你的断言逻辑
    ...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:36:03