Параметризация всех пар ключ / значение в словарном отображении ключа и списка значений с использованием pytest? - PullRequest
0 голосов
/ 17 октября 2019

У меня есть словарь, содержащий сопоставление возможных допустимых значений. Как я могу проверить, что моя функция проверки работает с использованием этой карты? Я не могу понять, как правильно использовать параметр @parameterize в pytest для этой карты.

Моя первая попытка была такой:

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 ]

1 голос
/ 18 октября 2019

явно необходимо распаковать набор параметров с помощью вложенного цикла

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

распаковывает набор списков в 2 кортежа

1 голос
/ 17 октября 2019

Обновлено на основе комментариев, чтобы использовать генератор для получения необходимых комбинаций:

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
0 голосов
/ 17 октября 2019

В сочетании с тем, что написал Амит, вам не нужна отдельная функция для получения элементов из словаря. @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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...