有没有办法测试包括默认参数在内的每个函数调用排列?
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)
假设我有一个这样的函数: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)