我有一个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=True
的parametrize
要求特性的参数名称恰好是"请求";没有别的词了。
我创建了一个简化版本的代码,我使用这种方法。你可以试试:
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)