我正在学习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
Run Code Online (Sandbox Code Playgroud)
这是我使用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
Run Code Online (Sandbox Code Playgroud)
Mat*_*vor 11
该函数f接受关键字参数,因此您需要将测试参数分配给关键字.幸运的是,Python提供了一种非常方便的方法来将关键字参数传递给函数...字典:
d = {'h': 4}
f(**d)
Run Code Online (Sandbox Code Playgroud)
**之前的前缀d将"解包"字典,将每个键/值对作为关键字参数传递给函数.
对于您的pytest示例,这意味着您只需要使用字典替换字符串参数,并使用关键字unpacker 替换evalin test_f2:
@pytest.mark.parametrize("arg,expected", [
({'h':4}, 54),
({'g':20}, 102),
])
def test_f2(arg, expected):
assert f(**arg) == expected
Run Code Online (Sandbox Code Playgroud)
扩展 Matthew 的答案,同时提供 args 和 kwargs:
@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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2761 次 |
| 最近记录: |