[圖片上傳失敗...(image-30ab0d-1652667728633)]
在之前的文章中主要分享了 pytest 的實用特性栓始,接下來講 Pytest 參數(shù)化用例的構(gòu)建救欧。
如果待測試的輸入與輸出是一組數(shù)據(jù),可以把測試數(shù)據(jù)組織起來用不同的測試數(shù)據(jù)調(diào)用相同的測試方法歇攻。參數(shù)化顧名思義就是把不同的參數(shù)牌捷,寫到一個集合里洲守,然后程序會自動取值運行用例,直到集合為空便結(jié)束儿奶。pytest 中可以使用 @pytest.mark.parametrize 來參數(shù)化框往。
parametrize( ) 方法源碼:
- 主要參數(shù)說明
- argsnames :參數(shù)名,是個字符串廓握,如中間用逗號分隔則表示為多個參數(shù)名
- argsvalues :參數(shù)值搅窿,參數(shù)組成的列表,列表中有幾個元素隙券,就會生成幾條用例
- 使用方法
- 使用 @pytest.mark.paramtrize() 裝飾測試方法
- parametrize('data', param) 中的 “data” 是自定義的參數(shù)名男应,param 是引入的參數(shù)列表
- 將自定義的參數(shù)名 data 作為參數(shù)傳給測試用例 test_func
- 然后就可以在測試用例內(nèi)部使用 data 的參數(shù)了
創(chuàng)建測試用例,傳入三組參數(shù)娱仔,每組兩個元素沐飘,判斷每組參數(shù)里面表達式和值是否相等,代碼如下:
運行結(jié)果:
整個執(zhí)行過程中牲迫,pytest 將參數(shù)列表 [("3+5",8),("2+5",7),("75",30)] 中的三組數(shù)據(jù)取出來耐朴,每組數(shù)據(jù)生成一條測試用例,并且將每組數(shù)據(jù)中的兩個元素分別賦值到方法中盹憎,作為測試方法的參數(shù)由測試用例使用泽示。
同一個測試用例還可以同時添加多個 @pytest.mark.parametrize 裝飾器, 多個 parametrize 的所有元素互相組合(類似笛卡兒乘積),生成大量測試用例夜只。
場景:比如登錄場景迷守,用戶名輸入情況有 n 種,密碼的輸入情況有 m 種檩禾,希望驗證用戶名和密碼挂签,就會涉及到 nm 種組合的測試用例,如果把這些數(shù)據(jù)一一的列出來盼产,工作量也是非常大的饵婆。pytest 提供了一種參數(shù)化的方式,將多組測試數(shù)據(jù)自動組合戏售,生成大量的測試用例侨核。示例代碼如下:
運行結(jié)果:
分析如上運行結(jié)果草穆,測試方法 test_foo( ) 添加了兩個 @pytest.mark.parametrize() 裝飾器,兩個裝飾器分別提供兩個參數(shù)值的列表芹关,2 * 3 = 6 種結(jié)合续挟,pytest 便會生成 6 條測試用例。在測試中通常使用這種方法是所有變量侥衬、所有取值的完全組合诗祸,可以實現(xiàn)全面的測試。
下面講結(jié)合 @pytest.fixture 與 @pytest.mark.parametrize 實現(xiàn)參數(shù)化轴总。
如果測試數(shù)據(jù)需要在 fixture 方法中使用直颅,同時也需要在測試用例中使用,可以在使用 parametrize 的時候添加一個參數(shù) indirect=True怀樟,pytest 可以實現(xiàn)將參數(shù)傳入到 fixture 方法中功偿,也可以在當(dāng)前的測試用例中使用。
parametrize 源碼:
indirect 參數(shù)設(shè)置為 True往堡,pytest 會把 argnames 當(dāng)作函數(shù)去執(zhí)行械荷,將 argvalues 作為參數(shù)傳入到 argnames 這個函數(shù)里。創(chuàng)建“test_param.py”文件虑灰,代碼如下:
運行結(jié)果:
上面的結(jié)果可以看出吨瞎,當(dāng) indirect=True 時,會將 login_r 作為參數(shù)穆咐,test_user_data 被當(dāng)作參數(shù)傳入到 login_r 方法中颤诀,生成多條測試用例。通過 return 將結(jié)果返回对湃,當(dāng)調(diào)用 login_r 可以獲取到 login_r 這個方法的返回數(shù)據(jù)崖叫。
【相關(guān)閱讀】 - Python 測試開發(fā)實戰(zhàn)進階,挑戰(zhàn)阿里P6+拍柒,年薪50W+心傀!
- 干貨 | 一文搞定 pytest 自動化測試框架(一)
- 干貨 | 一文搞定 pytest 自動化測試框架(二)
- 干貨 | 一文搞定 Linux 常用高頻命令