我正在测试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))
这样的参数化方法?还是我应该随机生成带有日期和无日期的请求并通过测试?
答案 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
...
我更喜欢后者,因为它的魔力要少一些,但是前者确实可以工作。