通过另一种策略引用一种策略
Referencing one strategy through another
定义策略时,是否可以引用其他策略?
@given(maximum=strategies.floats(min_value=0),
actual=strategies.floats(max_value=maximum))
def foo(maximum, actual):
pass
这会抛出 NameError: 'maximum' not defined'
编辑:
一种解决方法(或者可能是 解决方法)是使用假设的 assume
函数。就我而言,它看起来像:
@given(maximum=strategies.floats(min_value=0),
actual=strategies.floats(min_value=0))
def foo(maximum, actual):
assume(actual <= maximum)
pass
您的选项可以概括为 "do it by rejecting some examples"(.filter()
或 assume()
,或 "do it by construction"。
后者通常效率更高,但可能需要更多代码。如果您 do 想尝试通过构造来满足您的约束,您将需要编写一个 @st.composite
策略来提供多个参数作为元组;或者一直到 st.data()
策略并在测试中交互式绘制。
或者...在这种简单的情况下,您可以将 if actual > maximum: actual, maximum = maximum, actual
放在测试函数的顶部。
定义策略时,是否可以引用其他策略?
@given(maximum=strategies.floats(min_value=0),
actual=strategies.floats(max_value=maximum))
def foo(maximum, actual):
pass
这会抛出 NameError: 'maximum' not defined'
编辑:
一种解决方法(或者可能是 解决方法)是使用假设的 assume
函数。就我而言,它看起来像:
@given(maximum=strategies.floats(min_value=0),
actual=strategies.floats(min_value=0))
def foo(maximum, actual):
assume(actual <= maximum)
pass
您的选项可以概括为 "do it by rejecting some examples"(.filter()
或 assume()
,或 "do it by construction"。
后者通常效率更高,但可能需要更多代码。如果您 do 想尝试通过构造来满足您的约束,您将需要编写一个 @st.composite
策略来提供多个参数作为元组;或者一直到 st.data()
策略并在测试中交互式绘制。
或者...在这种简单的情况下,您可以将 if actual > maximum: actual, maximum = maximum, actual
放在测试函数的顶部。