pytest -- pytest-retry插件介绍与使用
👎 不要用了!!!还是用pytest-rerunfailures插件吧!!!
简介:
pytest-retry
是一个 Pytest 插件,允许你对失败的测试用例进行自动重试。比 pytest-rerunfailures
更灵活一些,支持针对特定异常类型进行重试。
pytest-retry
已经在 2018年就停止维护,不兼容现代 pytest。不推荐使用了!
- 它无法处理:
yield
fixtureallure.step
parametrize
- 异常在 fixture 中抛出
准备:
安装插件:
pip install pytest-retry
使用:
1、通过 @pytest.mark.retry
标记单个测试
核心参数
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
retries |
int |
1 |
最大重试次数(实际执行次数 = 初始执行 + 重试次数)。 |
delay |
float |
0 |
重试间隔时间(秒),支持小数(如 0.5 表示 500ms)。 |
allowed_exceptions |
tuple |
None |
允许重试的异常类型,默认为所有异常。若指定,则仅匹配列出的异常。 |
condition |
callable |
None |
自定义重试条件函数,返回 True 时重试(优先级高于 allowed_exceptions )。 |
参数详解与示例
import pytest
import requests
@pytest.mark.retry(retries=3, delay=1) # 失败后重试3次,每次间隔1秒
def test_flaky_api():
response = requests.get("https://xxxxx.org/getMessage")
assert response.status_code == 200
@pytest.mark.retry(
retries=3,
delay=1,
allowed_exceptions=(httpx.NetworkError,) # 仅对网络异常重试
)
def test_flaky_api():
response = requests.get("https://xxxxx.org/getMessage")
assert response.status_code == 200
import httpx
def should_retry(exc_info):
exception = exc_info.value
# 情况1:捕获 NetworkError(超时、连接错误等)
if isinstance(exception, httpx.NetworkError):
return True
# 情况2:捕获 HTTP 500-599 状态码
if isinstance(exception, httpx.HTTPStatusError):
return 500 <= exception.response.status_code < 600
# 其他情况不重试
return False
@pytest.mark.retry(
retries=3,
delay=1,
condition=should_retry # 使用自定义条件
)
def test_flaky_api():
response = httpx.get("https://xxxxx.org/getMessage")
response.raise_for_status() # 自动触发 HTTPStatusError(4xx/5xx)
exc_info
是@pytest.mark.retry()
中传入的。
2、通过命令行全局启用重试
优点:无需使用装饰器,比较简洁。
缺点:命令行无法指定异常类型!
pytest --retries 3 --retry-delay 1 # 所有测试失败后重试3次,间隔1秒
3、通过 pytest.ini
文件启用
缺点同2,无法指定异常类型!
[pytest]
# addopts: 指定运行 pytest 时默认附加的命令行选项
addopts =
# pytest-retry 重试次数(对所有异常生效)
--retries 3
# 重试间隔
--retry-delay 1
评论区