Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何为带有可选参数的函数编写测试_Python_Pytest_Optional Parameters_Optional Arguments - Fatal编程技术网

Python 如何为带有可选参数的函数编写测试

Python 如何为带有可选参数的函数编写测试,python,pytest,optional-parameters,optional-arguments,Python,Pytest,Optional Parameters,Optional Arguments,我想用可选参数测试函数调用 这是我的密码: list_get() list_get(key, "city", 0) list_get(key, 'contact_no', 2, {}, policy) list_get(key, "contact_no", 0) list_get(key, "contact_no", 1, {}, policy, "") list_get(key, "contact_no", 0, 888) 由于可选参数,我无法对其进行参数化,因此我在pytest中为每个ap

我想用可选参数测试函数调用

这是我的密码:

list_get()
list_get(key, "city", 0)
list_get(key, 'contact_no', 2, {}, policy)
list_get(key, "contact_no", 0)
list_get(key, "contact_no", 1, {}, policy, "")
list_get(key, "contact_no", 0, 888)
由于可选参数,我无法对其进行参数化,因此我在
pytest
中为每个api调用编写了单独的测试函数

我相信应该有更好的方法来测试这个

您可以使用:


我认为你所做的很好,但我建议传递键值参数,这样你就不会混淆参数的顺序

我假设您的函数头如下所示:

def list_get(key=None, city=None, contact_no=None, policy=None):
    ...
在测试中,定义要测试的参数组合列表:

kwargs = {'key': '..', 'city': '..', 'contact_no': '..', 'policy': '..'} 
list_get(**kwargs) 

kwargs_all_default_values = {}
list_get(**kwargs_all_default_values)

除了回答@forge和@ezequiel-muns之外,我建议使用以下糖:


对于将来遇到此问题的读者,如果他们试图设置
@parameterize
d测试以生成笛卡尔参数集,并且有时根本不想传递给定的参数(如果可选),那么在
值上使用过滤器将有所帮助

def function_under_test(foo="foo-default", bar="bar-default"):
    print([locals()[arg] for arg in inspect.getargspec(function_under_test).args])


@pytest.mark.parametrize("foo", [None, 1, 2])
@pytest.mark.parametrize("bar", [None, "a", "b"])
def test_optional_params(foo, bar):
    args = locals()
    filtered = {k: v for k, v in args.items() if v is not None}
    function_under_test(**filtered)  # <-- Notice the double star

你能不能用一些星形魔法,例如list_get(*args)使它与参数化测试一起工作?很好,去看看这个库!
import pytest
from hamcrest import assert_that, calling, is_not, raises

@pytest.mark.parametrize('func, args, kwargs', [
    [list_get, (), {}],
    [list_get, (key, "city", 0), {}],
    [list_get, (key, "contact_no", 1, {}, policy, ""), {}],
    [list_get, (), {'key': key}],
])
def test_func_dont_raises(func, args, kwargs):
    assert_that(calling(func).with_args(*args, **kwargs), is_not(raises(Exception)))
def function_under_test(foo="foo-default", bar="bar-default"):
    print([locals()[arg] for arg in inspect.getargspec(function_under_test).args])


@pytest.mark.parametrize("foo", [None, 1, 2])
@pytest.mark.parametrize("bar", [None, "a", "b"])
def test_optional_params(foo, bar):
    args = locals()
    filtered = {k: v for k, v in args.items() if v is not None}
    function_under_test(**filtered)  # <-- Notice the double star
PASSED   [ 11%]['foo-default', 'bar-default']
PASSED   [ 22%][1, 'bar-default']
PASSED   [ 33%][2, 'bar-default']
PASSED   [ 44%]['foo-default', 'a']
PASSED   [ 55%][1, 'a']
PASSED   [ 66%][2, 'a']
PASSED   [ 77%]['foo-default', 'b']
PASSED   [ 88%][1, 'b']
PASSED   [100%][2, 'b']