1

在我的项目中,我Hypothesis用来测试一个功能。被测函数接受一个强制参数调用stop和两个可选参数调用,分别为startstep。如果参数step为零,则被测代码应触发异常。

这是我的测试功能

@given(start=st.integers(min_value=-1000, max_value=1000),
       stop=st.integers(min_value=-1000, max_value=1000),
       step=st.integers(min_value=-1000, max_value=1000))
@settings(settings(verbosity=Verbosity.verbose))
def test_XXX_for_integer(start, stop, step):
    if step == 0:
        with raises(ValueError) as excinfo:
            _ = myrange3(start, stop, step)
        assert 'arg 3 must not be zero' in str(excinfo.value)
    else:
        output = <some code>
        expected = <some output> 
        assert output == expected

我的问题:我还想模拟startandstep是可选的,因此这些参数中的一个或两个都设置为None. 如果不为每个代码变体重新创建专用测试函数,我该如何做到这一点?

4

1 回答 1

1

您可以像加入集合一样加入策略。例子:

strategy_bools_or_ints = st.booleans() | st.integers()

在测试中,您可以st.integers加入st.none

st_input = st.integers(min_value=-1000, max_value=1000)
st_input_optional = st_input | st.none()

@given(start=st_input_optional, stop=st_input, step=st_input_optional)
def test_XXX_for_integer(start, stop, step):
    assert myrange3(stop, start=start, step=step)
于 2018-01-12T08:57:19.820 回答