在 pytest 和 Hypothesis 中结合单元和基于 属性 的测试

Combining unit and property-based tests in pytest and Hypothesis

我需要 运行 在 Python 中混合使用单元测试和基于 属性 的测试。我当前的测试代码 运行 将它们分开,因此重复了一些代码:

@pytest.mark.parametrize("values", list_of_values)
def test_my_function(a_value):
    call_test(a_value)

@given(st.arbitrary_values())
def test_hypothesis_my_function(a_value):
    call_test(a_value)

上面有代码重复:test_my_functiontest_hypothesis_my_function是一样的,只是分别由单位和基于属性的基础设施触发。

我希望消除上面的代码重复以获得如下内容:

@pytest.mark.parametrize("values", list_of_values)
@given(st.arbitrary_values())
def test_my_function(a_value):
    call_test(a_value)

能达到这个效果吗?提前致谢。

如果您的参数列表是源代码中的文字,您可以 translate that to a sequence of @example() decorators:

@given(text())
@example("Hello world")
@example(x="Some very long string")
def test_some_code(x):
    pass

如果它是一个显式列表,您可以编写一个辅助函数来为您应用它们:

def parametrize(list_of_args):
    def inner(f):
        for a in list_of_kwargs:
            f = hypothesis.example(*a)(f)
        return f
    return inner

@parametrize(list_of_args_tuples)
@given(text())
def test_some_code(x):
    pass