如何编写一个策略来生成具有 python 假设的元组列表?

How to write a strategy to generate list of tuples with python hypothesis?

我开始使用 hypothesis 来编写我的测试。我喜欢它,但我坚持要生成某种数据。

我有一个使用数据列表的测试,它可以从元组(键,值)构造。

键可以是文本、整数或浮点数,值可以是任何可比较的。 对于一个测试,所有键必须是同一类型,所有值必须是同一类型。

我发现生成我想要的数据的唯一方法是这样的:

@given(
    st.one_of(
        st.lists(st.tuples(st.integers(), st.integers())),
        st.lists(st.tuples(st.integers(), st.floats())),
        st.lists(st.tuples(st.integers(), st.text())),
        st.lists(st.tuples(st.floats(), st.integers())),
        st.lists(st.tuples(st.floats(), st.floats())),
        st.lists(st.tuples(st.floats(), st.text())),
        #...
    ))
def test_stuff(lst):
   data = [Mydata(k, v) for k, v in lst]
   #...

是否有更好的方法来生成我要测试的所有数据类型组合?

我的首选方法是在 @given 中选择键和值策略,然后 construct your strategy and draw from it inside your test。 "all keys must be of the same one of these types"这个东西是一个不寻常的需求,但是交互式数据非常强大:

@given(
    st.data(), 
    key_st=st.sampled_from([st.integers(), st.floats(), st.text()]),
    value_st=st.sampled_from([st.integers(), st.floats(), st.text()]),
)
def test_stuff(data, key_st, value_st):
    test_data = data.draw(st.lists(st.builds(Mydata, key_st, value_st)))
    ...  # TODO: assert things about test_data

我还使用了 st.builds() 而不是通过元组 - 因为我们在测试中调用它,所以 Mydata 中的任何异常都将是(最小化的)测试失败而不是错误。