Python 自動化測試(三): pytest 參數(shù)化測試用例構(gòu)建

在之前的文章中主要分享了 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ù)。