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
相关产品推荐
相关产品推荐

