在定义策略时,是否可以引用其他策略?
@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
答案 0 :(得分:1)
您的选项可以概括为“通过拒绝某些示例来完成”(使用.filter()
或assume()
,或“通过构造来完成”。
尽管后者可能需要更多代码,但后者通常更为有效。如果您想通过构造来满足约束,则需要编写一种@st.composite
策略,该策略以元组形式提供几个参数;或一直使用st.data()
策略并在测试内部进行交互绘制。
或者...在这种简单情况下,您可以将if actual > maximum: actual, maximum = maximum, actual
放在测试函数的顶部。