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

在之前的文章中主要分享了 pytest 的實(shí)用特性,接下來講 Pytest 參數(shù)化用例的構(gòu)建财异。
如果待測(cè)試的輸入與輸出是一組數(shù)據(jù),可以把測(cè)試數(shù)據(jù)組織起來用不同的測(cè)試數(shù)據(jù)調(diào)用相同的測(cè)試方法。參數(shù)化顧名思義就是把不同的參數(shù)名船,寫到一個(gè)集合里,然后程序會(huì)自動(dòng)取值運(yùn)行用例旨怠,直到集合為空便結(jié)束渠驼。pytest 中可以使用@pytest.mark.parametrize來參數(shù)化。
parametrize( ) 方法源碼:

def parametrize(self,argnames, argvalues, indirect=False, ids=None,
scope=None):
主要參數(shù)說明
argsnames :參數(shù)名鉴腻,是個(gè)字符串迷扇,如中間用逗號(hào)分隔則表示為多個(gè)參數(shù)名
argsvalues :參數(shù)值百揭,參數(shù)組成的列表,列表中有幾個(gè)元素蜓席,就會(huì)生成幾條用例
使用方法
使用 @pytest.mark.paramtrize() 裝飾測(cè)試方法
parametrize(‘data’, param) 中的 “data” 是自定義的參數(shù)名器一,param 是引入的參數(shù)列表
將自定義的參數(shù)名 data 作為參數(shù)傳給測(cè)試用例 test_func
然后就可以在測(cè)試用例內(nèi)部使用 data 的參數(shù)了
創(chuàng)建測(cè)試用例,傳入三組參數(shù)瓮床,每組兩個(gè)元素盹舞,判斷每組參數(shù)里面表達(dá)式和值是否相等,代碼如下:
@pytest.mark.parametrize("test_input,expected",[("3+5",8),("2+5",7),("7*5",30)])
def test_eval(test_input,expected):
# eval 將字符串str當(dāng)成有效的表達(dá)式來求值隘庄,并返回結(jié)果
assert eval(test_input) == expected

運(yùn)行結(jié)果:

plugins: html-2.0.1, rerunfailures-8.0, xdist-1.31.0, ordering-0.6,
forked-1.1.3, allure-pytest-2.8.11, metadata-1.8.0
collecting ... collected 3 items

test_mark_paramize.py::test_eval[3+5-8]
test_mark_paramize.py::test_eval[2+5-7]
test_mark_paramize.py::test_eval[7*5-35]

============================== 3 passed in 0.02s ===============================

整個(gè)執(zhí)行過程中踢步,pytest 將參數(shù)列表 [(“3+5”,8),(“2+5”,7),("75",30)] 中的三組數(shù)據(jù)取出來,每組數(shù)據(jù)生成一條測(cè)試用例丑掺,并且將每組數(shù)據(jù)中的兩個(gè)元素分別賦值到方法中获印,作為測(cè)試方法的參數(shù)由測(cè)試用例使用。
同一個(gè)測(cè)試用例還可以同時(shí)添加多個(gè) @pytest.mark.parametrize 裝飾器, 多個(gè) parametrize 的所有元素互相組合(類似笛卡兒乘積)街州,生成大量測(cè)試用例兼丰。
場(chǎng)景:比如登錄場(chǎng)景,用戶名輸入情況有 n 種唆缴,密碼的輸入情況有 m 種鳍征,希望驗(yàn)證用戶名和密碼,就會(huì)涉及到 nm 種組合的測(cè)試用例面徽,如果把這些數(shù)據(jù)一一的列出來艳丛,工作量也是非常大的。pytest 提供了一種參數(shù)化的方式趟紊,將多組測(cè)試數(shù)據(jù)自動(dòng)組合氮双,生成大量的測(cè)試用例。示例代碼如下:

@pytest.mark.parametrize("x",[1,2])
@pytest.mark.parametrize("y",[8,10,11])
def test_foo(x,y):
print(f"測(cè)試數(shù)據(jù)組合x: {x} , y:{y}")

運(yùn)行結(jié)果:

plugins: html-2.0.1, rerunfailures-8.0, xdist-1.31.0, ordering-0.6,
forked-1.1.3, allure-pytest-2.8.11, metadata-1.8.0
collecting ... collected 6 items

test_mark_paramize.py::test_foo[8-1]
test_mark_paramize.py::test_foo[8-2]
test_mark_paramize.py::test_foo[10-1]
test_mark_paramize.py::test_foo[10-2]
test_mark_paramize.py::test_foo[11-1]
test_mark_paramize.py::test_foo[11-2]

分析如上運(yùn)行結(jié)果霎匈,測(cè)試方法 test_foo( ) 添加了兩個(gè) @pytest.mark.parametrize() 裝飾器戴差,兩個(gè)裝飾器分別提供兩個(gè)參數(shù)值的列表,2 * 3 = 6 種結(jié)合铛嘱,pytest 便會(huì)生成 6 條測(cè)試用例暖释。在測(cè)試中通常使用這種方法是所有變量、所有取值的完全組合弄痹,可以實(shí)現(xiàn)全面的測(cè)試饭入。
下面講結(jié)合 @pytest.fixture 與 @pytest.mark.parametrize 實(shí)現(xiàn)參數(shù)化。
如果測(cè)試數(shù)據(jù)需要在 fixture 方法中使用肛真,同時(shí)也需要在測(cè)試用例中使用谐丢,可以在使用 parametrize 的時(shí)候添加一個(gè)參數(shù) indirect=True,pytest 可以實(shí)現(xiàn)將參數(shù)傳入到 fixture 方法中,也可以在當(dāng)前的測(cè)試用例中使用乾忱。
parametrize 源碼:

def parametrize(self,argnames, argvalues, indirect=False, ids=None, scope=None):

indirect 參數(shù)設(shè)置為 True讥珍,pytest 會(huì)把 argnames 當(dāng)作函數(shù)去執(zhí)行,將 argvalues 作為參數(shù)傳入到 argnames 這個(gè)函數(shù)里窄瘟。創(chuàng)建“test_param.py”文件衷佃,代碼如下:

方法名作為參數(shù)

test_user_data = ['Tome', 'Jerry']
@pytest.fixture(scope="module")
def login_r(request):
# 通過request.param獲取參數(shù)
user = request.param
print(f"\n 登錄用戶:{user}")
return user

@pytest.mark.parametrize("login_r", test_user_data,indirect=True)
def test_login(login_r):
a = login_r
print(f"測(cè)試用例中l(wèi)ogin的返回值; {a}")
assert a != ""
運(yùn)行結(jié)果:

plugins: html-2.0.1, rerunfailures-8.0, xdist-1.31.0, ordering-0.6,
forked-1.1.3, allure-pytest-2.8.11, metadata-1.8.0
collecting ... collected 2 items

test_mark_paramize.py::test_login[Tome]
test_mark_paramize.py::test_login[Jerry]

============================== 2 passed in 0.02s ===============================

Process finished with exit code 0

登錄用戶:Tome PASSED [ 50%]測(cè)試用例中l(wèi)ogin的返回值; Tome

登錄用戶:Jerry PASSED [100%]測(cè)試用例中l(wèi)ogin的返回值; Jerry

上面的結(jié)果可以看出,當(dāng) indirect=True 時(shí)蹄葱,會(huì)將 login_r 作為參數(shù)氏义,test_user_data 被當(dāng)作參數(shù)傳入到 login_r 方法中,生成多條測(cè)試用例图云。通過 return 將結(jié)果返回惯悠,當(dāng)調(diào)用 login_r 可以獲取到 login_r 這個(gè)方法的返回?cái)?shù)據(jù)。
【相關(guān)閱讀】

Python 測(cè)試開發(fā)實(shí)戰(zhàn)進(jìn)階竣况,挑戰(zhàn)阿里P6+克婶,年薪50W+!
干貨 | 一文搞定 pytest 自動(dòng)化測(cè)試框架(一)
干貨 | 一文搞定 pytest 自動(dòng)化測(cè)試框架(二)
干貨 | 一文搞定 Linux 常用高頻命令

獲取更多相關(guān)資料:請(qǐng)?zhí)砑觱x,ceshiren001
https://qrcode.ceba.ceshiren.com/link?name=article&project_id=qrcode&from=jianshu&timestamp=1652686087&author=MM

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末丹泉,一起剝皮案震驚了整個(gè)濱河市情萤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摹恨,老刑警劉巖筋岛,帶你破解...
    沈念sama閱讀 212,657評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異晒哄,居然都是意外死亡泉蝌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,662評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門揩晴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贪磺,你說我怎么就攤上這事硫兰。” “怎么了寒锚?”我有些...
    開封第一講書人閱讀 158,143評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵劫映,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我刹前,道長(zhǎng)泳赋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,732評(píng)論 1 284
  • 正文 為了忘掉前任喇喉,我火速辦了婚禮祖今,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己千诬,他們只是感情好耍目,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,837評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著徐绑,像睡著了一般邪驮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上傲茄,一...
    開封第一講書人閱讀 50,036評(píng)論 1 291
  • 那天毅访,我揣著相機(jī)與錄音,去河邊找鬼盘榨。 笑死喻粹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的较曼。 我是一名探鬼主播磷斧,決...
    沈念sama閱讀 39,126評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼捷犹!你這毒婦竟也來了弛饭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,868評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤萍歉,失蹤者是張志新(化名)和其女友劉穎侣颂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枪孩,經(jīng)...
    沈念sama閱讀 44,315評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡憔晒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,641評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蔑舞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拒担。...
    茶點(diǎn)故事閱讀 38,773評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖攻询,靈堂內(nèi)的尸體忽然破棺而出从撼,到底是詐尸還是另有隱情,我是刑警寧澤钧栖,帶...
    沈念sama閱讀 34,470評(píng)論 4 333
  • 正文 年R本政府宣布低零,位于F島的核電站,受9級(jí)特大地震影響拯杠,放射性物質(zhì)發(fā)生泄漏掏婶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評(píng)論 3 317
  • 文/蒙蒙 一潭陪、第九天 我趴在偏房一處隱蔽的房頂上張望雄妥。 院中可真熱鬧最蕾,春花似錦、人聲如沸茎芭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,859評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梅桩。三九已至壹粟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宿百,已是汗流浹背趁仙。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留垦页,地道東北人雀费。 一個(gè)月前我還...
    沈念sama閱讀 46,584評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像痊焊,于是被迫代替她去往敵國(guó)和親盏袄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,676評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容