如何使用可选参数为函数编写测试

时间:2016-03-07 13:16:25

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

4 个答案:

答案 0 :(得分:7)

您可以使用* 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

答案 1 :(得分:3)

除了@forge和@ ezequiel-muns的答案,我建议使用pyhamcrest中的一些糖:

if(words[6] == "no") 
{
    int count = 150;
    for (int a = 1 ; a < count; a++)
    {
        Label currentLabel = (Label)this.Controls.Find("lbl"+a,true)[0];    
        //change color of currentLabel
    }
} 

答案 2 :(得分:0)

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

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

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)

答案 3 :(得分:0)

对于未来遇到此问题的读者,他们试图设置 @parameterized 测试以生成一组笛卡尔参数并且有时根本不想传递给定参数(如果可选),然后使用过滤器None 值会有所帮助

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