通过另一种策略引用一种策略

时间:2019-05-26 22:58:18

标签: python python-hypothesis

在定义策略时,是否可以引用其他策略?

@given(maximum=strategies.floats(min_value=0),
       actual=strategies.floats(max_value=maximum))
def foo(maximum, actual):
    pass

这会抛出NameError: 'maximum' not defined'

编辑:

一种解决方法(或者也许是 the 解决方法)是使用假设的assume函数。就我而言,它看起来像:

@given(maximum=strategies.floats(min_value=0),
       actual=strategies.floats(min_value=0))
def foo(maximum, actual):
    assume(actual <= maximum)
    pass

1 个答案:

答案 0 :(得分:1)

您的选项可以概括为“通过拒绝某些示例来完成”(使用.filter()assume(),或“通过构造来完成”。

尽管后者可能需要更多代码,但后者通常更为有效。如果您想通过构造来满足约束,则需要编写一种@st.composite策略,该策略以元组形式提供几个参数;或一直使用st.data()策略并在测试内部进行交互绘制。

或者...在这种简单情况下,您可以将if actual > maximum: actual, maximum = maximum, actual放在测试函数的顶部。