使用pytest参数化键和值列表的字典映射中的所有键/值对吗?

时间:2019-10-17 14:20:00

标签: python pytest

我有一个字典,其中包含可能的有效值的映射。如何使用此映射测试验证功能是否正常工作?我不知道如何在pytest中为此地图正确使用@parameterize选项。

我的第一次尝试是

TEST_MAP = {
    'key1': ['val1', 'val2', 'val3'],
    'key2': ['val1', 'val2', 'val4', 'val5'],
    'key3': ['val2', 'val4'],
    'key4': ['val3', 'val4', 'val6'],
}

@pytest.mark.parametrize("map", TEST_MAP)
def test_map(self, map):
    ...
    validate()
    assert ...

此问题是仅在键上进行迭代。我还想遍历每个键的值。我需要测试键/值组合。

如何调整此测试用例的参数化,以测试映射中的调用键/值对?

我不想遍历测试中每个键的值。我希望每个键/值都是它自己的唯一测试。

3 个答案:

答案 0 :(得分:1)

根据评论进行了更新,以使用生成器来获取所需的组合:

def get_items():
TEST_MAP = {
    'key1': ['val1', 'val2', 'val3'],
    'key2': ['val1', 'val2', 'val4', 'val5'],
    'key3': ['val2', 'val4'],
    'key4': ['val3', 'val4', 'val6'],
}
for key, value in TEST_MAP.items():
    for val in value:
        yield key, val


@pytest.mark.parametrize("items", get_items())
def test_map(items):
    key, value = items
    print(key, value)
    assert len(value) > 1

答案 1 :(得分:1)

使用嵌套循环解压缩参数集显然很必要

[(k, x) for k, v in TEST_MAP.items() for x in v]

将列表的字典解压缩为2个元组

答案 2 :(得分:0)

Pi带Amit编写的内容,您不需要单独的函数即可从字典中获取项目。 @pytest.mark.parametrize("map", TEST_MAP.items())可以。或者,您可以在print(TEST_MAP.items())函数中使用test_map

我收到的输出在运行时的格式如下:

'key1', ['val1', 'val2', 'val3']
'key2', ['val1', 'val2', 'val4', 'val5']
'key3', ['val2', 'val4']
'key4', ['val3', 'val4', 'val6']