Python假设包:我可以确保使用某些值吗



问题陈述

下面是一个玩具的例子,这是接近我正在尝试做的。

@given(
idx_start=integers(min_value=0, max_value=100000),
idx_window=integers(min_value=0, max_value=100000),
)
def test_calc_max(conftest_df, idx_start, idx_window):
row_idxs = conftest_df.index[idx_start : (idx_start + idx_window)]
assert calc_max(conftest_df.loc[row_idxs, "my_column"]) >= 0

conftest_df是我在conftest.pyfixture文件中提供的一个Dataframe,它表示我正在为包使用的一部分真实数据。

这个数据帧中只有非常少的NaN值。我想使用hypothesis,因为它非常棒,我坚信这是正确的做事方式。

但我也想确保测试中的方法和函数适用于NaN。我真的不想只说NaNs,将来可能会出现其他东西(比如,一个用逗号而不是句点表示小数的数字(。


通过hypothesis的理想解决方案

我宁愿能够做这样的事情:

@given(
idx_start=integers(min_value=0, max_value=100000, includes=[5, 4000, 80000]),
idx_window=integers(min_value=0, max_value=100000, includes=[20]),
)
.
.
.

并有一种方法确保通过includes参数考虑某些值。

我知道hypothesis会跟踪失败的值,但根据我的经验,它似乎不能保证它们的使用。

有办法做我想做的事吗?

您可以使用@example装饰器来确保测试某些示例。

这是假设快速入门指南中的例子:

from hypothesis import given, example
from hypothesis.strategies import text
@given(text())
@example('')
def test_decode_inverts_encode(s):
assert decode(encode(s)) == s

这里,@example('')确保测试将以空字符串为例运行。

我还没有完全理解你的场景的细节,但也许你可以根据自己的需求调整这个例子。

最新更新