代码之家  ›  专栏  ›  技术社区  ›  damd

来自_regex的假设策略不尊重min_size和max_size

  •  0
  • damd  · 技术社区  · 2 年前

    我遇到了不尊重给定最小/最大大小的假设生成字符串的问题。示例:

    @given(
        st.text(
            alphabet=st.from_regex(regex=r"^[a-z][b-z]$", fullmatch=True),
            min_size=0,
            max_size=15,
        )
    )
    def test_foobar(username: str):
        assert len(username) <= 20
    

    输出:

    >       assert len(username) <= 20
    E       AssertionError: assert 22 <= 20
    E        +  where 22 = len('ababababababababababab')
    E       Falsifying example: test_foobar(
    E           username='ababababababababababab',
    E       )
    

    我试过使用 \A \Z 而不是 ^ $ 也一样,但似乎没有什么帮助。

    我正在运行它:

    $ pytest --hypothesis-seed=2
    

    我有关于Python 3.9的Pytest 7.2.0和假设6.56.4。

    我错过了什么?

    0 回复  |  直到 2 年前
        1
  •  1
  •   DeepSpace    2 年前

    根据 text strategy docs :

    。。。 alphabet ,应该是 长度为1的字符串或生成此类字符串的策略

    您正在使用策略( st.from_regex(regex=r"^[a-z][b-z]$", fullmatch=True) 产生长度 字符串。

    如果你真的需要测试字符串是那种形式,你需要将 max_size :

    @given(
        st.text(
            alphabet=st.from_regex(regex=r"^[a-z][b-z]$", fullmatch=True),
            min_size=0,
            max_size=7,  # <======
        )
    )
    def test_foobar(username: str):
        print(username)
        assert len(username) <= 20
    

    然后

    $ pytest --hypothesis-seed=2
    == test session starts ==
    plugins: hypothesis-6.56.4
    collected 1 item                                                                                                                                                                         
    
    test_.py .                                                                                                                                                                         [100%]
    
    == 1 passed in 0.33s ==