使用@pytest.mark.parametrize進行參數傳遞測試


摘自: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM