如何在@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
...
我更喜欢后者,因为它不那么神奇,但如果你需要,前者确实有用。
我正在测试 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
...
我更喜欢后者,因为它不那么神奇,但如果你需要,前者确实有用。