python假设中相同函数参数的多种策略
Multiple strategies for same function parameter in python hypothesis
我正在使用 Hypothesis 包在 Python 中编写一个简单的测试代码。有没有办法对同一个函数参数使用多种策略?例如,使用 integers()
和 floats()
来测试我的 values
参数而不编写两个单独的测试函数?
from hypothesis import given
from hypothesis.strategies import lists, integers, floats, sampled_from
@given(
integers() ,floats()
)
def test_lt_operator_interval_bin_numerical(values):
interval_bin = IntervalBin(10, 20, IntervalClosing.Both)
assert (interval_bin < values) == (interval_bin.right < values)
上面的代码不起作用,但它代表了我想要实现的目标。
注意:我已经尝试过使用两种不同策略创建两个不同测试的简单解决方案:
def _test_lt(values):
interval_bin = IntervalBin(10, 20, IntervalClosing.Both)
assert (interval_bin < values) == (interval_bin.right < values)
test_lt_operator_interval_bin_int = given(integers())(_test_lt)
test_lt_operator_interval_bin_float = given(floats())(_test_lt)
但是我想知道是否有更好的方法来做到这一点:当策略的数量变多时,它作为代码是非常冗余的。
一般来说,如果您需要您的价值观是几件事之一(例如您的示例中的 int
s 或 float
s),那么我们可以将单独事物的策略与 |
运算符(其操作类似于 set
s 的运算符——联合运算符并通过调用 __or__
magic method 来工作):
from hypothesis import given
from hypothesis.strategies import integers, floats
@given(
integers() | floats()
)
def test_lt_operator_interval_bin_numerical(values):
interval_bin = IntervalBin(10, 20, IntervalClosing.Both)
assert (interval_bin < values) == (interval_bin.right < values)
或者您可以使用 strategies.one_of
作为 @Zac Hatfield-Dodds 提到的,它做的事情几乎相同:
from hypothesis import given
from hypothesis.strategies import integers, floats, one_of
@given(
one_of(integers(), floats())
)
def test_lt_operator_interval_bin_numerical(values):
interval_bin = IntervalBin(10, 20, IntervalClosing.Both)
assert (interval_bin < values) == (interval_bin.right < values)
我正在使用 Hypothesis 包在 Python 中编写一个简单的测试代码。有没有办法对同一个函数参数使用多种策略?例如,使用 integers()
和 floats()
来测试我的 values
参数而不编写两个单独的测试函数?
from hypothesis import given
from hypothesis.strategies import lists, integers, floats, sampled_from
@given(
integers() ,floats()
)
def test_lt_operator_interval_bin_numerical(values):
interval_bin = IntervalBin(10, 20, IntervalClosing.Both)
assert (interval_bin < values) == (interval_bin.right < values)
上面的代码不起作用,但它代表了我想要实现的目标。
注意:我已经尝试过使用两种不同策略创建两个不同测试的简单解决方案:
def _test_lt(values):
interval_bin = IntervalBin(10, 20, IntervalClosing.Both)
assert (interval_bin < values) == (interval_bin.right < values)
test_lt_operator_interval_bin_int = given(integers())(_test_lt)
test_lt_operator_interval_bin_float = given(floats())(_test_lt)
但是我想知道是否有更好的方法来做到这一点:当策略的数量变多时,它作为代码是非常冗余的。
一般来说,如果您需要您的价值观是几件事之一(例如您的示例中的 int
s 或 float
s),那么我们可以将单独事物的策略与 |
运算符(其操作类似于 set
s 的运算符——联合运算符并通过调用 __or__
magic method 来工作):
from hypothesis import given
from hypothesis.strategies import integers, floats
@given(
integers() | floats()
)
def test_lt_operator_interval_bin_numerical(values):
interval_bin = IntervalBin(10, 20, IntervalClosing.Both)
assert (interval_bin < values) == (interval_bin.right < values)
或者您可以使用 strategies.one_of
作为 @Zac Hatfield-Dodds 提到的,它做的事情几乎相同:
from hypothesis import given
from hypothesis.strategies import integers, floats, one_of
@given(
one_of(integers(), floats())
)
def test_lt_operator_interval_bin_numerical(values):
interval_bin = IntervalBin(10, 20, IntervalClosing.Both)
assert (interval_bin < values) == (interval_bin.right < values)