我开始使用hypothesis来编写测试。我喜欢它,但我很难生成某种数据。
我有一个使用数据列表的测试,可以从元组(键,值)构建。
键可以是text,integer或float,值可以是任何可比的。 对于一个测试,所有键必须是相同的类型,并且所有值必须是相同的类型。
我发现生成我想要的数据的唯一方法就是:
@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]
#...
有没有更好的方法来生成我想要测试的所有数据类型组合?
答案 0 :(得分:0)
我首选的方法是在@given
中选择关键值和价值策略,然后选择construct your strategy and draw from it inside your test。 "所有键必须属于这些类型中的相同类型"事情是一个不寻常的要求,但交互式数据非常强大:
@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
中的任何异常都会(最小化)测试失败而不是错误。