Использование параметризации для Аргументов ключевых слов в pytest


Я изучаю pytest и пытаюсь использовать pytest.отметка.параметризация для Аргументов ключевых слов.

Это простой пример без pytest.отметка.параметризация:

G = 10
H = 2

def f(g=G, h=H):
    return 5 * g + h

def test_f1():
    assert f(h=4) == 54
    assert f(g=20) == 102

И это один из моих неудачных маршрутов с использованием pytest.отметка.параметризовать. Это не работает, но помогает понять, чего я хотел бы достичь:

import pytest

G = 10
H = 2

def f(g=G, h=H):
    return 5 * g + h  

@pytest.mark.parametrize("arg, expected", [
    ("h=4", 54),
    ("g=20", 102),
    ])

def test_f2(arg, expected):
    assert f(eval(arg)) == expected
1 3

1 ответ:

Функция f принимает аргументы ключевых слов, поэтому вам нужно назначить параметры теста ключевым словам. К счастью, Python предоставляет очень удобный способ передачи аргументов ключевых слов в функцию...словарь:

d = {'h': 4}
f(**d)

Префикс ** Перед d будет "распаковывать" словарь, передавая каждую пару ключ/значение в качестве ключевого аргумента функции.

Для вашего примера pytest это означает, что вам просто нужно заменить строковый параметр словарем, а eval в test_f2 с помощью ключевое слово unpacker:

@pytest.mark.parametrize("arg,expected", [
    ({'h':4}, 54),
    ({'g':20}, 102),
    ])

def test_f2(arg, expected):
    assert f(**arg) == expected