6

我正在测试一个 REST 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))?还是我应该随机生成带有日期和无日期的请求并通过测试?

4

1 回答 1

6

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

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

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

于 2019-08-11T03:57:07.310 回答