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

Hypothesis的from_regex策略不遵守min_size与max_size限制

问题原因与解决方案

你误解了st.text中min_size和max_size参数的含义:这两个参数控制的是从alphabet中选取的元素数量,而非最终生成字符串的总字符长度。

具体分析

你的alphabet通过st.from_regex(r"^[a-z][b-z]$", fullmatch=True)生成,每个元素都是长度为2的字符串(正则要求必须匹配两个小写字母,第一个为a-z,第二个为b-z)。当st.text的max_size=15时,意味着Hypothesis最多会选取15个这样的元素拼接成最终字符串,总长度最多可达15*2=30,远超过你断言的20,因此出现了长度为22的测试用例。

解决方法

如果你需要限制最终字符串的总字符长度,有两种可靠方式:

方式1:根据单个元素长度调整max_size

既然每个alphabet元素长度固定为2,要让总长度≤20,只需将max_size设为10(10*2=20):

@given(
    st.text(
        alphabet=st.from_regex(regex=r"^[a-z][b-z]$", fullmatch=True),
        min_size=0,
        max_size=10,  # 10个元素 × 2字符 = 20字符上限
    )
)
def test_foobar(username: str):
    assert len(username) <= 20

方式2:直接用正则限制总长度

如果alphabet元素长度不固定,或者想更直观地控制总长度,直接用st.from_regex定义符合长度要求的字符串规则:

@given(
    st.from_regex(r"^([a-z][b-z]){0,10}$", fullmatch=True)
)
def test_foobar(username: str):
    assert len(username) <= 20

这里的正则([a-z][b-z]){0,10}表示允许0到10组双字符组合,总长度自然在0到20之间。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:10:31