gpt4 book ai didi

python - 如何为 py.test 创建一个扩展的 xfail 标记?

转载 作者:行者123 更新时间:2023-11-28 21:06:57 25 4
gpt4 key购买 nike

py.test(版本 4.6.2)中,您有一个标记装饰器用于将测试标记为失败,例如

@pytest.mark.xfail
def test1():
return 1/0

也可以验证异常本身

@pytest.mark.xfail(raises=ZeroDivisionError)

但是否可以通过某种方式验证错误消息本身?

这在您遇到 HTTPError 时很有用,因为可能有很多原因。当您比较错误消息本身时,您可以更具体地了解测试何时失败(例如,区分特定的 Client ErrorServer Error)。

到目前为止,我正在使用以下结构:

def test_fail_request(self):      
with pytest.raises(requests.exceptions.HTTPError) as excinfo:
response = requests.something
assert '403 Client Error: Not Found' in str(excinfo.value)

但当然,像下面这样的测试将更具可读性、紧凑性,并且可以由 py.test 正确处理:

 @pytest.mark.xfail(expected_error = "403 Client Error: Not Found"):
def test_fail_request(self):
response = requests.something

有没有办法实现这个行为/功能?

澄清一下,最后一个代码示例预计会失败,但仅当错误消息包含特定消息时才会失败(例如:400 Client Error: Bad Request)。在这种情况下,测试将报告为 XFAIL

但是如果测试失败并创建了一个不同的错误消息(即使是相同的异常,但是例如错误消息中的 500 Server Error),测试必须被报告为“意外通过”(XPASS)。

最佳答案

如果失败是正常行为,您可以创建自己的装饰器,例如:

import functools
def expect_http_error(func=None, *, expected_error):
def wrapper(func):
@functools.wraps(func)
def inner(*args, **kwargs):
with pytest.raises(requests.exceptions.HTTPError) as excinfo:
func(*args, **kwargs)
assert expected_error in str(excinfo.value)

return inner

return wrapper if func is None else wrapper(func)

然后你像这样使用它:

@expect_http_error(expected_error = "403 Client Error: Not Found")
def test_fail_request(self):
response = requests.something

关于python - 如何为 py.test 创建一个扩展的 xfail 标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56832169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com