有没有办法测试包括默认参数在内的每个函数调用排列?

Is there a way to test every function call permutation including default params?

假设我有一个这样的函数:def foo(a, b),我可以测试它的调用:

@pytest.mark.parametrize("a", [1,2,3])
@pytest.mark.parametrize("b", [1,2,3])
def test_foo(a, b):
    foo(a, b)

但是,使用默认参数会使事情变得有点复杂。如果我将函数更改为 def foo(a, *, b=0),测试会变得复杂:

@pytest.mark.parametrize("a", [1,2,3])
@pytest.mark.parametrize("b", [1,2,3])
def test_foo(a, b):
    foo(a, b=b)

但我还想验证 b 的默认参数是否有效,即测试调用 foo(a)。是否可以以一种很好的方式调整此测试,以便它也可以测试它?

我唯一的想法是这样的:

@pytest.mark.parametrize("a", [1,2,3])
@pytest.mark.parametrize("b", [1,2,3,None])
def test_foo(a, b):
    if b:
        foo(a, b=b)
    else:
        foo(a)

或将其拆分为多个测试,但它看起来很愚蠢且不优雅。有更好的解决方案吗?

怎么样:

@pytest.mark.parametrize("a", [1,2,3])
@pytest.mark.parametrize("kwargs", [{"b": 1}, {"b": 2}, {"b": 3}, {}])
def test_foo(a, kwargs):
   foo(a, **kwargs)

或者可能更多地保留您最初的想法,但更简洁的调用:

@pytest.mark.parametrize("a", [1,2,3])
@pytest.mark.parametrize("b", [1, 2, 3, None])
def test_foo(a, b):
   kwargs = {"b": b} if b is not None else {}
   foo(a, **kwargs)