侧边栏壁纸
博主头像
一朵云的博客博主等级

拥抱生活,向阳而生。

  • 累计撰写 107 篇文章
  • 累计创建 28 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

pytest -- pytest-retry插件介绍与使用

一朵云
2024-01-14 / 0 评论 / 0 点赞 / 148 阅读 / 4348 字

pytest -- pytest-retry插件介绍与使用

👎 不要用了!!!还是用pytest-rerunfailures插件吧!!!

简介:

pytest-retry 是一个 Pytest 插件,允许你对失败的测试用例进行自动重试。比 pytest-rerunfailures 更灵活一些,支持针对特定异常类型进行重试。

pytest-retry 已经在 2018年就停止维护,不兼容现代 pytest。不推荐使用了!

  • 它无法处理:
    • yield fixture
    • allure.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

0

评论区