首页 > 解决方案 > 假设检验:如何从另一个策略中采样值?

问题描述

我必须使用示例数据测试一些功能:

data = [
    [[10, 20, 30], 10],
    [[20, 30], 20],
    [[40], 30],
]

其中每行中的第一个元素列表包含 N=(1 到 5) 个随机整数元素,这些元素通过以下方式生成:

st.lists(
          st.integers(min_value=10),
          min_size=2,
          max_size=5,
          unique=True)

每行中的第二个元素包含来自所有生成列表的所有唯一整数集合中的随机样本。

所以对于我的data例子:

如何使用假设测试框架实施这样的策略?

这个不起作用:

int_list = st.integers(min_value=10)

@given(st.lists(
    elements=st.tuples(
        int_list, 
        st.sampled_from(int_list))

标签: pythonpython-hypothesis

解决方案


查看有关调整策略的文档- 您可以使用 来执行此操作.flatmap(...),但使用 定义自定义策略@composite可能更简单。

# With flatmap
elem_strat = lists(
    integers(), min_size=2, max_size=5, unique=True
).flatmap(
    lambda xs: tuples(just(xs), sampled_from(xs)).map(list)
)

# With @composite
@composite
def elem_strat_func(draw):
    xs = draw(lists(
        integers(), min_size=2, max_size=5, unique=True
    )
    an_int = draw(sampled_from(xs))
    return [xs, an_int]
elem_strat = elem_strat_func()

# then use either as
@given(lists(elem_strat))
def test_something(xs): ...

推荐阅读