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']