Pytest - 如何在测试时传递默认值

Pytest - How to pass defaults while testing

假设我有一个函数如下

def add_vals(a, b=1, c=2):
    result = a + b + c
    return result

设测试数据如下

test_data = [(1, 2, 3), (6),
(2, ,4), (7)
]

对于第二个测试,我希望函数使用 b 的默认值,即 b=1 我该怎么做?

为了测试我正在使用以下函数。

@pytest.mark.parametrize("inp,expected", testdata)
def test_add_vals(inp, expected):
    res = historical_returns(*inp)

    assert res == expected

编辑

基于使用 **kwargs 传递默认参数的建议。有语法问题无法找出错误。下面是代码

def add_vals(a, b=1, c=2):
    result = a + b + c
    return result


testdata = [(1, 'b'=9, 12),
            (2, 'c'=5, 8)
            ]


@pytest.mark.parametrize("args, kwargs, expected", testdata)
def test_add_vals(args, kwargs, expected):
    for key, value in kwargs.items():
        res = add_vals(*args, key=value)

    assert res == expected

错误如下

E       testdata = [((1), ('b' = 1), (6)),
E                              ^
E   SyntaxError: invalid syntax

正如所建议的那样,您可以使用列表或参数 (args) 和关键字参数字典 (kwargs) 的组合,如下所示:

import pytest


def add_vals(a, b=1, c=2):
    result = a + b + c
    return result


testdata = [([1], {"b": 9}, 12),
            ([2], {"c": 5}, 8),
            ([0, 1, 2], {}, 3),
            ([], {"c": 3, "b": -3, "a": 0}, 0)
            ]


@pytest.mark.parametrize("args, kwargs, expected", testdata)
def test_add_vals(args, kwargs, expected):
    res = add_vals(*args, **kwargs)
    assert res == expected

进一步阅读:https://book.pythontips.com/en/latest/args_and_kwargs.html