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

How to parametrize Hypothesis strategy in @given

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

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

但是对于一个普通的属性,我能写一个结合pytest.mark.parametrize的测试吗?问题是请求策略如何在 @given.

中使用该参数 req_type
@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))那样进行参数化?或者我应该随机生成带日期和无日期的请求并通过测试?

你不能在外部装饰器中完成这一切,因为它们在导入时被(懒惰地)评估,但你可以使用 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 对象中获取 req_type,则生成任一类型并将它们传递到测试中可能更优雅:

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

我更喜欢后者,因为它不那么神奇,但如果你需要,前者确实有用。