如何为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
相关产品推荐
相关产品推荐

