如何在@given中参数化假设策略

时间:2019-08-09 19:50:16

标签: python python-hypothesis

我正在测试REST API,该API可以处理不同的请求,例如过时的和无日期的。请求具有一个名为request_type的字段。我想知道在假设中编写测试的最佳方法是什么:

我可以写两个睾丸,一个是有日期的,另一个是无日期的。

但是对于一个公共属性,我可以编写一个与pytest.mark.parametrize结合使用的测试。问题在于请求策略如何使用req_type中的参数@given

@pytest.mark.parameterize('req_type', ['dated', 'dateless'])
@given(req=requests())
def test_process_request(req, req_type):
   # override the parameter req_type in req with input req_type
   pass

是否有一种像@given(req=requests(req_type))这样的参数化方法?还是我应该随机生成带有日期和无日期的请求并通过测试?

1 个答案:

答案 0 :(得分:1)

您不能在外部装饰器中完成所有操作,因为它们在导入时(延迟)评估,但是您可以使用data()策略在测试函数中绘制一个值。

@pytest.mark.parameterize('req_type', ['dated', 'dateless'])
@given(data=st.data())
def test_process_request(req_type, data):
    req = data.draw(requests(req_type))
    ...

或者,如果您可以从req_type对象中获得req,则生成这两种类型并将其传递到测试中可能更合适:

@given(req=st.one_of(requests(dateless), requests(dated)))
def test_process_request(req):
    req_type = req.type
    ...

我更喜欢后者,因为它的魔力要少一些,但是前者确实可以工作。