Python 自動化測試(三): pytest 引數化測試用例構建
阿新 • • 發佈:2022-04-21
在之前的文章中主要分享了 pytest 的實用特性,接下來講 Pytest 引數化用例的構建。
如果待測試的輸入與輸出是一組資料,可以把測試資料組織起來用不同的測試資料呼叫相同的測試方法。引數化顧名思義就是把不同的引數,寫到一個集合裡,然後程式會自動取值執行用例,直到集合為空便結束。pytest 中可以使用 @pytest.mark.parametrize 來引數化。
parametrize( ) 方法原始碼:
- 主要引數說明
- argsnames :引數名,是個字串,如中間用逗號分隔則表示為多個引數名
- argsvalues :引數值,引數組成的列表,列表中有幾個元素,就會生成幾條用例
- 使用方法
- 使用 @pytest.mark.paramtrize() 裝飾測試方法
- parametrize('data', param) 中的 “data” 是自定義的引數名,param 是引入的引數列表
- 將自定義的引數名 data 作為引數傳給測試用例 test_func
- 然後就可以在測試用例內部使用 data 的引數了
建立測試用例,傳入三組引數,每組兩個元素,判斷每組引數裡面表示式和值是否相等,程式碼如下:
執行結果:
整個執行過程中,pytest 將引數列表 [("3+5",8),("2+5",7),("75",30)] 中的三組資料取出來,每組資料生成一條測試用例,並且將每組資料中的兩個元素分別賦值到方法中,作為測試方法的引數由測試用例使用。
同一個測試用例還可以同時新增多個 @pytest.mark.parametrize 裝飾器, 多個 parametrize 的所有元素互相組合(類似笛卡兒乘積),生成大量測試用例。
場景:比如登入場景,使用者名稱輸入情況有 n 種,密碼的輸入情況有 m 種,希望驗證使用者名稱和密碼,就會涉及到 n
執行結果:
分析如上執行結果,測試方法 test_foo( ) 添加了兩個 @pytest.mark.parametrize() 裝飾器,兩個裝飾器分別提供兩個引數值的列表,2 * 3 = 6 種結合,pytest 便會生成 6 條測試用例。在測試中通常使用這種方法是所有變數、所有取值的完全組合,可以實現全面的測試。
下面講結合 @pytest.fixture 與 @pytest.mark.parametrize 實現引數化。
如果測試資料需要在 fixture 方法中使用,同時也需要在測試用例中使用,可以在使用 parametrize 的時候新增一個引數 indirect=True,pytest 可以實現將引數傳入到 fixture 方法中,也可以在當前的測試用例中使用。
parametrize 原始碼:
indirect 引數設定為 True,pytest 會把 argnames 當作函式去執行,將 argvalues 作為引數傳入到 argnames 這個函式裡。建立“test_param.py”檔案,程式碼如下:
執行結果:
上面的結果可以看出,當 indirect=True 時,會將 login_r 作為引數,test_user_data 被當作引數傳入到 login_r 方法中,生成多條測試用例。通過 return 將結果返回,當呼叫 login_r 可以獲取到 login_r 這個方法的返回資料。
【相關閱讀】 - Python 測試開發實戰進階,挑戰阿里P6+,年薪50W+!
- 乾貨 | 一文搞定 pytest 自動化測試框架(一)
- 乾貨 | 一文搞定 pytest 自動化測試框架(二)
- 乾貨 | 一文搞定 Linux 常用高頻命令