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

Pytest如何将测试获取的file_id传递给fixture实现测试后云文件清理

实现方案

你可以通过以下两种简单的方式把测试函数中拿到的file_id传递给fixture执行清理:

方案1:通过fixture返回的容器传递(最直观)

fixture可以直接返回一个可变容器(比如列表),你在测试函数中往容器里添加待删除的file_id,fixture在测试结束后读取容器内容执行清理即可。

示例代码:

fixture部分

import pytest

@pytest.fixture(scope="function")
def cleanup_for_testing():
    # 初始化空列表存储待删除的文件ID
    to_delete_files = []
    # 把列表返回给测试函数使用
    yield to_delete_files
    # 测试结束后执行清理逻辑,支持单测试生成多个文件的场景
    for file_id in to_delete_files:
        # 此处替换为你自己的删除逻辑:本地删除/调用云端删除接口都可以
        print(f"已清理临时文件: {file_id}")

测试函数部分

import json
from your_app import app # 替换为你自己的Flask应用导入路径

@pytest.mark.parametrize("radius, length, ang, status, error_message_template", [
    ('10', '10', '10', 200, 'null')
])
def test_footparam(cleanup_for_testing, radius, length, ang, status, error_message_template):
    client = app.test_client()
    data = {"radius": radius, "length": length, "ang": ang}
    response = client.post('/generate', content_type='application/json', data=json.dumps(data))
    response_data = json.loads(response.data)

    # 把接口返回的file_id添加到fixture返回的清理列表中
    if response.status_code == 200 and "file_id" in response_data:
        cleanup_for_testing.append(response_data["file_id"])
    
    # 原有断言逻辑不变
    if error_message_template == 'null':
        assert response.status_code == 200
    else:
        my_error_message = response_data["error_message"]
        assert (response.status_code == status) and (my_error_message == error_message_template)

方案2:通过pytest的request对象传递

如果你的场景需要在多个fixture之间共享数据,可以用pytest内置的request对象作为载体存储file_id。

示例代码:

fixture部分

import pytest

@pytest.fixture(scope="function")
def cleanup_for_testing(request):
    # 初始化存储待删除文件的属性
    request.node.to_delete_files = []
    yield
    # 测试结束后执行清理
    for file_id in request.node.to_delete_files:
        print(f"已清理临时文件: {file_id}")

测试函数部分
只需要在测试函数参数中加入request,拿到file_id后存入request对象即可:

def test_footparam(cleanup_for_testing, request, radius, length, ang, status, error_message_template):
    # ... 省略原有接口请求逻辑
    if response.status_code == 200 and "file_id" in response_data:
        request.node.to_delete_files.append(response_data["file_id"])
    # ... 省略原有断言逻辑

注意事项

pytest的fixture teardown逻辑(yield之后的代码)无论测试用例执行成功还是失败都会运行,不会出现测试异常导致临时文件遗漏清理的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:24:03