2014-05-02 50 views
2

我正在學習pytest,我正在嘗試使用pytest.mark.parametrize作爲關鍵字參數。在pytest中爲關鍵字參數使用parametrize

這是不pytest.mark.parametrize簡單的例子:

G = 10 
H = 2 

def f(g=G, h=H): 
    return 5 * g + h 

def test_f1(): 
    assert f(h=4) == 54 
    assert f(g=20) == 102 

這是我使用pytest.mark.parametrize不成功的路徑之一。它不工作,但它有助於瞭解我想實現什麼:

import pytest 

G = 10 
H = 2 

def f(g=G, h=H): 
    return 5 * g + h 

@pytest.mark.parametrize("arg, expected", [ 
    ("h=4", 54), 
    ("g=20", 102), 
    ]) 

def test_f2(arg, expected): 
    assert f(eval(arg)) == expected 

回答

6

功能f接受關鍵字參數,所以你需要指定測試參數的關鍵字。幸運的是,Python提供傳遞關鍵字參數的函數......字典的一個非常方便的方法:

d = {'h': 4} 
f(**d) 

d**前綴將「解包」的字典,傳遞每個鍵/值對作爲關鍵字參數到功能。

爲了您pytest例如,這意味着你只需要更換一個字典字符串參數,並在test_f2eval用關鍵字解包:

@pytest.mark.parametrize("arg,expected", [ 
    ({'h':4}, 54), 
    ({'g':20}, 102), 
    ]) 

def test_f2(arg, expected): 
    assert f(**arg) == expected