如何使用pytest夹具与参数?



我有一个pytest fixture:

TEST_DIR_JSON = 'test_data/test_telemetry'
@pytest.fixture
def create_telemetry_fixture():
    """Create and delete .json files"""
    items = [
        {"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},
    ]
    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
    for file in os.listdir(TEST_DIR_JSON):
        os.remove(os.path.join(TEST_DIR_JSON, file))

和我有测试功能:

def test_function_1(<fixture_1>, create_telemetry_fixture, <fixture_3>):
    #some code
    assert <sequense>

我想把items变量转换为fixture的参数。我该怎么做呢?

items1 = [...]
items2 = [...]
@pytest.fixture
def create_telemetry_fixture(items):
    #some code

我阅读文档https://docs.pytest.org/en/6.2.x/parametrize.html但我认为这不是我的情况。把参数传递给fixture函数

这段代码不起作用

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},
    ]
@pytest.fixture
def create_telemetry_fixture(items):
    for item in items:
        #some code
@pytest.mark.parametrize("avg_telemetry_fixture", [items1], indirect=True)
def test_agv_value(<fixture_1>, create_telemetry_fixture, <fixture_3>):
    #some_code

indirect=Trueparametrize要求特性的参数名称恰好是"请求";没有别的词了。
我创建了一个简化版本的代码,我使用这种方法。你可以试试:

import pytest
items1 = [
        {"ts_str": "item1_ts_str1"},
        {"ts_str": "item1_ts_str2"},
    ]
items2 = [
        {"ts_str": "item2_ts_str1"},
        {"ts_str": "item2_ts_str2"},
    ]

@pytest.fixture
def create_telemetry_fixture(request):
    text = ''
    for item in request.param:
        text += f'{item["ts_str"]}'
    yield text

@pytest.mark.parametrize('create_telemetry_fixture', [items1], indirect=True)
def test_parameters(create_telemetry_fixture):
    print(create_telemetry_fixture)

最新更新