摘自:https://blog.csdn.net/sunny_happy08/article/details/83658661
最近因工作需要用到@pytest.mark.parametrize()傳多個參數,實現執行不同數據。
我的需求
數據源是excel,excel的每一行都是一條測試用例,已實現讀取測試用例和處理測試用例的邏輯。接下來就是將這些測試數據通過pytest.mark.parametrize()傳入測試函數,循環執行這些測試數據,每次執行時都需要assert用例結果, 以便將測試結果展示到pytest的結果文件中(通過pytest --html=./report/report.html)
實現可行性
上篇文章已經很詳細的指出了用@pytest.mark.parametrize()傳多個參數實現執行不同數據的情況。通過上篇文章的例子,我們發現,pytest會自動執行循環,且對用戶是透明的,用戶不需要自己去寫循環邏輯。直接將測試的list丟進去,就會循環執行,這是我們所期望的。也是符合我的需求的。
遇到問題
安照這個邏輯,我只需要將excel讀出來的所有數據當做一個list傳到測試函數里就可以了,等着pytest自行調度執行,最后assert每條執行結果是True還是False就成了。實際是:pytest的確是執行了每條測試案例,雖然每條案例也寫了assert,但是pytest把所有案例執行完了當做一個整體返回assert結果。pytest的執行記錄里顯示的也是只有一個案例。這個結果與我的預期是不一樣的。怎么辦?
解決方案
想不出原因,只好硬着頭皮去寫試驗代碼,由結果猜測原因了。
難道不支持多個參數?不太可能,因為明明是寫着多個參數的。那就是多個參數寫法的問題咯。翻了代碼發現,當傳多個參 數時,第二個參數是多個元組組成的list。一一列出來寫的。我是將這個元組參數化了,用一個形參穿進去的。有了這個猜 測,就寫代碼驗證下,果然是這么個樣子。
通過執行試驗代碼發現,一一列出來寫,是把每個元組的元素作為形參傳進去的;按形參傳是吧一個list傳進去的,所以,一一列出會每個元素都會有一個結果,按形參傳入就整個list執行完了才出結果。ok,問題解決。
實驗代碼
執行結果
PS:當有多個參數都是list,且list的長度不一致時,要這樣一一列出來就略尷尬了,記錄一下pytest.mark.parametrize()的局限性的。另外,當@pytest.mark.parametrize()只一個參數時,是把list的每個元素當做形參傳入的,會assert每次執行結果。
傳一個參數時,兩種寫法都可以,具體看以下實例
寫法一:
@pytest.mark.parametrize('name', ['sunny', 'kevinse', 'jacky'])
def test_name(name):
print name
寫法二:
name_list = ['sunny', 'kevinse', 'jacky']
@pytest.mark.parametrize('name', name_list)
def test_name(name):
print name