2016-03-07 94 views
3

我想用可選參數測試函數調用。如何使用可選參數爲函數編寫測試

這裏是我的代碼:

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調用。
我相信應該有更好的方法來測試這一個。

+1

難道你不能使用一些明星魔術list_get(* args)使它與參數化測試一起工作? –

回答

5

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

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

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

不錯,去檢查這個庫了! –

相關問題