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

2024-04-20 02:24:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

这是我的代码:

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调用编写了单独的测试函数。
我相信应该有更好的方法来测试这个。在


Tags: 方法keyno代码apicity参数get
3条回答

您可以使用^{} operator

@pytest.mark.parametrize('args,expected', [
    ([], expVal0),
    ([key, "city", 0], expVal1),
    ([key, 'contact_no', 2, {}, policy], expVal2)
    ([key, "contact_no", 0], expVal3)
    ([key, "contact_no", 1, {}, policy, ""], expVal4)
    ([key, "contact_no", 0, 888], expVal5)
])
def test_list_get(args, expected):
    assert list_get(*args) == expected

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

我假设你的函数头看起来像这样:

def list_get(key=None, city=None, contact_no=None, policy=None):
    ...

在测试中,定义要测试的参数组合列表:

^{pr2}$

除了@forge和@ezequiel muns的答案之外,我建议使用^{}中的一些糖: 在

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)))

相关问题 更多 >