You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置pytest Fixture实现可控制的keyring清理逻辑?

实现可配置清理的Keyring测试Fixture

步骤1:解决清理报错问题

首先在调用keyring.delete_password时捕获PasswordDeleteError,避免因目标凭据不存在而抛出异常中断测试流程。

步骤2:添加可外部配置的cleanup参数

通过pytest命令行选项和测试标记实现配置,默认保持自动清理的原有行为,无需修改任何现有测试代码。


完整实现代码

  1. 在conftest.py中添加命令行选项:
def pytest_addoption(parser):
    parser.addoption(
        "--no-keyring-cleanup",
        action="store_true",
        default=False,
        help="禁用测试后清理Keyring凭据(默认启用清理)"
    )
  1. 修改你的测试Fixture(可放在conftest.py或测试文件中):
import pytest
import keyring
from keyring.errors import PasswordDeleteError

@pytest.fixture
def test_service(request):
    # 优先级:测试函数标记 > 命令行选项,默认启用清理
    cleanup_marker = request.node.get_closest_marker("keyring_cleanup")
    if cleanup_marker:
        cleanup = cleanup_marker.args[0]
    else:
        cleanup = not request.config.getoption("--no-keyring-cleanup")

    # 定义测试用服务名
    service_name = "test_keyring_service"
    yield service_name

    # 执行清理逻辑(仅当cleanup为True时)
    if cleanup:
        try:
            # 替换为你测试中实际使用的用户名
            keyring.delete_password(service_name, "test_user")
        except PasswordDeleteError:
            # 无对应凭据时直接忽略错误
            pass

使用方式

  • 默认行为:直接运行pytest即可,会自动清理凭据,且不会因无凭据存在报错。
  • 全局禁用清理:通过命令行参数关闭所有测试的清理操作:
    pytest --no-keyring-cleanup
    
  • 单个测试禁用清理:给特定测试添加标记,覆盖全局配置:
    @pytest.mark.keyring_cleanup(False)
    def test_skip_cleanup(test_service):
        # 该测试执行后不会清理相关凭据
        pass
    

内容的提问来源于stack exchange,提问作者HomerusJa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 19:01:15