在pytest中对关键字参数使用parametrize

8 投票
2 回答
12251 浏览
提问于 2025-04-18 05:04

我正在学习pytest,并尝试使用pytest.mark.parametrize来处理关键字参数。

这是一个没有使用pytest.mark.parametrize的简单例子:

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.mark.parametrize但没有成功的一个例子。虽然它没有工作,但有助于我理解我想要实现的目标:

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

2 个回答

5

在扩展Matthew的回答时,下面的代码可以同时处理位置参数和关键字参数:

@pytest.mark.parametrize("args, kwargs, expecting", [
    ([100,10], {'is_test':True} , [90, 110]),
    ([100, .2], {'is_test':False} , [80, 120]),
])
def test_fn(args, kwargs, expecting):
    print(args, kwargs)
    assert fn(*args, **kwargs) == expecting

def fn(a, b, c=False):
   if c:
      return a-c, a+c
   else:
      return a - (a*c), a+ a*c
20

这个函数 f 可以接受关键字参数,所以你需要把测试参数分配给这些关键字。幸运的是,Python 提供了一种非常方便的方法来将关键字参数传递给函数,那就是使用字典:

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

d 前面加上 ** 符号,会把字典“拆开”,把每一个键值对作为关键字参数传递给函数。

对于你的 pytest 示例,这意味着你只需要把字符串参数换成一个字典,并把 test_f2 中的 eval 替换成关键字拆包器:

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

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

撰写回答