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

如何为pytest fixture传递自定义items参数?

实现可接收参数的pytest Fixture方法

问题背景

现有create_telemetry_fixture fixture,内部固定生成items数据并创建、清理JSON文件。需要将items作为参数传入,让不同测试用例使用不同的items(如items1、items2),此前尝试@pytest.mark.parametrize结合indirect=True未成功,需正确实现方式。

正确实现步骤

  • 修改Fixture接收参数:给fixture添加request参数,通过request.param获取测试用例传入的items数据
  • 参数化测试用例:使用@pytest.mark.parametrize时,参数名需与fixture名一致,同时设置indirect=True,指定传入的参数值
  • 测试函数引用Fixture:在测试函数中正常引用该fixture即可自动获取传入的参数

完整代码示例

修改后的Fixture代码

import os
import json
import pytest

TEST_DIR_JSON = 'test_data/test_telemetry'

@pytest.fixture
def create_telemetry_fixture(request):
    """Create and delete .json files with customizable items"""
    # 通过request.param获取传入的items参数
    items = request.param
    # 确保目标目录存在,避免文件写入报错
    os.makedirs(TEST_DIR_JSON, exist_ok=True)
    # 创建JSON文件逻辑
    for item in items:
        data = {
            "timestamp": item["ts"],
            "sensors": [{"sensor_id": item["sensor_id"], "value": item["value"]}]
        }
        with open(f"{TEST_DIR_JSON}/sensors_{item['ts_str']}.json", "w", encoding="UTF-8") as file:
            json.dump(data, file)
    yield
    # 清理生成的JSON文件
    for file in os.listdir(TEST_DIR_JSON):
        os.remove(os.path.join(TEST_DIR_JSON, file))

测试用例示例

# 定义不同的测试数据集
items1 = [
    {"ts_str": "2021-07-15_10_00_01", "ts": "2021-07-15 10:00:00", "sensor_id": "sensor1", "value": -61.2105297502},
    {"ts_str": "2021-07-15_10_01_02", "ts": "2021-07-15 10:01:00", "sensor_id": "sensor1", "value": -90.9436886104},
]

items2 = [
    {"ts_str": "2021-07-16_09_00_00", "ts": "2021-07-16 09:00:00", "sensor_id": "sensor2", "value": 25.5},
    {"ts_str": "2021-07-16_09_05_00", "ts": "2021-07-16 09:05:00", "sensor_id": "sensor2", "value": 26.1},
]

# 单个参数测试
@pytest.mark.parametrize("create_telemetry_fixture", [items1], indirect=True)
def test_function_1(create_telemetry_fixture):
    # 验证生成的文件数量是否符合预期
    files = os.listdir(TEST_DIR_JSON)
    assert len(files) == 2
    # 其他业务逻辑断言...

# 多个参数批量测试
@pytest.mark.parametrize("create_telemetry_fixture", [items1, items2], indirect=True)
def test_function_2(create_telemetry_fixture, request):
    # 动态验证文件数量与传入的items长度一致
    assert len(os.listdir(TEST_DIR_JSON)) == len(request.param)
    # 其他业务逻辑断言...

此前无效代码的问题

  • 参数名不匹配:@pytest.mark.parametrize中写的是"avg_telemetry_fixture",但Fixture名称是create_telemetry_fixture,参数名必须完全一致
  • Fixture未正确接收参数:直接给Fixture定义items参数,pytest无法识别,必须通过request对象的param属性获取传入值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 18:45:20