首页 > 解决方案 > 通过另一种策略引用一种策略

问题描述

在定义策略时,是否可以参考其他策略?

@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

标签: pythonpython-hypothesis

解决方案


您的选择可以概括为“通过拒绝一些示例来实现”(使用.filter()orassume()或“通过构造来实现”。

后者通常更有效,尽管它可能需要更多代码。如果您确实想尝试通过构造来满足您的约束,您需要编写一个@st.composite策略,将多个参数作为元组提供;或者一直到st.data()策略并在测试中交互绘制。

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


推荐阅读