詳解pytest中runtestprotocol方法的實(shí)現(xiàn)
前言
在pytest-rerunfailures:優(yōu)化測試穩(wěn)定性的失敗重試工具這篇文章中,我們查看源碼時(shí),看到了這樣一行代碼reports = runtestprotocol(item, nextitem=nextitem, log=False)
,runtestprotocol
這個(gè)函數(shù)是干嘛用的呢?我們帶著疑問一起探索。
runtestprotocol 函數(shù)
runtestprotocol
是 pytest 執(zhí)行測試流程中的一個(gè)核心函數(shù),它主要負(fù)責(zé)調(diào)用測試函數(shù)的“setup”、“call”和“teardown”鉤子函數(shù),并生成對應(yīng)的測試報(bào)告。
runtestprotocol 函數(shù)的基本信息
runtestprotocol
函數(shù)是 pytest 測試框架中用于執(zhí)行測試用例的核心函數(shù)之一,它位于 pytest 的 runner.py
模塊中,定義如下:
def runtestprotocol( ? ?item: Item, log: bool = True, nextitem: Optional[Item] = None ) -> List[TestReport]: ? ?hasrequest = hasattr(item, "_request")
其中,該函數(shù)的參數(shù)包括:
item
: 表示待執(zhí)行的測試用例對象;log
: 控制是否打印日志,在默認(rèn)情況下為 True,即打印日志;nextitem
: 表示下一個(gè)待執(zhí)行的測試用例對象,用于實(shí)現(xiàn)測試順序的控制。
函數(shù)返回一個(gè)包含 pytest.TestReport
對象的列表,每個(gè)對象表示執(zhí)行一個(gè)鉤子函數(shù)的測試結(jié)果。
參數(shù)解析
在上述參數(shù)中,item
是必選參數(shù),表示待執(zhí)行的測試用例對象。該參數(shù)通常由 pytest 測試框架提供,我們無需手動(dòng)傳入該參數(shù)。
log
參數(shù)是一個(gè)布爾值,用于控制是否打印日志。在默認(rèn)情況下,該參數(shù)為 True,即會(huì)打印日志。如果你希望在測試過程中關(guān)閉日志,可以將該參數(shù)設(shè)置為 False。
nextitem
參數(shù)則表示下一個(gè)待執(zhí)行的測試用例對象,用于實(shí)現(xiàn)測試順序的控制。當(dāng) runtestprotocol
函數(shù)執(zhí)行完當(dāng)前測試用例之后,它會(huì)自動(dòng)執(zhí)行下一個(gè)測試用例。如果希望手動(dòng)控制下一個(gè)待執(zhí)行的測試用例,可以使用該參數(shù)。
源碼解讀
下面是對代碼的解釋:
def runtestprotocol( ? ?item: Item, log: bool = True, nextitem: Optional[Item] = None ) -> List[TestReport]: ? ?hasrequest = hasattr(item, "_request") ? ?if hasrequest and not item._request: ?# type: ignore[attr-defined] ? ? ? ?# This only happens if the item is re-run, as is done by ? ? ? ?# pytest-rerunfailures. ? ? ? ?item._initrequest() ?# type: ignore[attr-defined]
首先,我們聲明了 runtestprotocol
函數(shù),并接受三個(gè)參數(shù):item
、log
和 nextitem
。其中,item
是一個(gè)測試項(xiàng)對象,log
是一個(gè)布爾值,表示是否將測試結(jié)果記錄到日志中,nextitem
表示下一個(gè)將要被執(zhí)行的測試項(xiàng)(可選)。
然后,我們使用 hasattr(item, "_request")
判斷 item
對象是否包含 _request
屬性。如果包含,則我們檢查該屬性的值是否為 False
,如果是,則執(zhí)行 item._initrequest()
方法。這段代碼主要是為了處理一種特殊情況:當(dāng)測試項(xiàng)重新運(yùn)行(例如通過 pytest-rerunfailures
插件),可能需要重新初始化 _request
屬性。
接下來,我們調(diào)用 call_and_report
函數(shù)執(zhí)行 setup
鉤子函數(shù),并將其結(jié)果存儲(chǔ)在 rep
變量中:
? ?rep = call_and_report(item, "setup", log)
call_and_report
函數(shù)是一個(gè)輔助函數(shù),用于執(zhí)行鉤子函數(shù)并生成測試報(bào)告(TestReport
對象)。在這里,我們調(diào)用該函數(shù)來執(zhí)行 setup
鉤子函數(shù),并將結(jié)果存儲(chǔ)在 rep
變量中。
然后,我們將 rep
添加到 reports
列表中:
? ?reports = [rep]
reports
列表用于存儲(chǔ)測試過程中生成的所有測試報(bào)告。
接下來,我們判斷上一個(gè)鉤子函數(shù)是否執(zhí)行成功。如果成功,則繼續(xù)執(zhí)行下一個(gè)鉤子函數(shù);否則,直接跳過:
? ?if rep.passed: ? ? ? ?if item.config.getoption("setupshow", False): ? ? ? ? ? ?show_test_item(item) ? ? ? ?if not item.config.getoption("setuponly", False): ? ? ? ? ? ?reports.append(call_and_report(item, "call", log))
首先,我們使用 rep.passed
來判斷上一個(gè)鉤子函數(shù)是否執(zhí)行成功。如果成功,則判斷是否需要在控制臺(tái)顯示該測試項(xiàng)的詳細(xì)信息,如果需要,則調(diào)用 show_test_item
函數(shù)顯示詳細(xì)信息。然后,我們再次使用 call_and_report
來執(zhí)行測試函數(shù)并生成測試報(bào)告,并將其添加到 reports
列表中。
最后,我們再次使用 call_and_report
函數(shù)執(zhí)行 teardown
鉤子函數(shù),并將其結(jié)果存儲(chǔ)在 rep
變量中:
? ?reports.append(call_and_report(item, "teardown", log, nextitem=nextitem))
然后,我們將 rep
添加到 reports
列表中,并返回該列表作為測試結(jié)果。
? ?return reports
當(dāng)所有測試項(xiàng)執(zhí)行完成后,pytest 會(huì)將測試結(jié)果打印到控制臺(tái),并將其寫入日志文件。這樣,我們就可以輕松地進(jìn)行測試并獲取測試報(bào)告。
最后
總之,runtestprotocol
函數(shù)是 pytest 測試框架中非常重要的一個(gè)函數(shù),它用于執(zhí)行測試用例并觸發(fā) pytest 鉤子函數(shù)。當(dāng)然我們實(shí)際場景中通常不會(huì)直接調(diào)用該函數(shù),這里主要做一個(gè)了解,方便查看插件的源碼時(shí)遇到不知道是干啥的。
以上就是詳解pytest中runtestprotocol方法的實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于pytest runtestprotocol方法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python語法學(xué)習(xí)之進(jìn)程的創(chuàng)建與常用方法詳解
本文我們將學(xué)習(xí)一下在?Python?中去創(chuàng)建并使用多進(jìn)程的方法,可以通過創(chuàng)建多個(gè)進(jìn)程來幫助我們提高腳本執(zhí)行的效率,感興趣的可以了解一下2022-04-04基于python3抓取pinpoint應(yīng)用信息入庫
這篇文章主要介紹了基于python3抓取pinpoint應(yīng)用信息入庫,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01Python之print函數(shù)里逗號(hào)和加號(hào)的區(qū)別及說明
這篇文章主要介紹了Python之print函數(shù)里逗號(hào)和加號(hào)的區(qū)別及說明,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02python基于urllib實(shí)現(xiàn)按照百度音樂分類下載mp3的方法
這篇文章主要介紹了python基于urllib實(shí)現(xiàn)按照百度音樂分類下載mp3的方法,涉及Python使用urllib模塊操作頁面元素的相關(guān)技巧,需要的朋友可以參考下2015-05-05python flask基于cookie和session來實(shí)現(xiàn)會(huì)話控制的實(shí)戰(zhàn)代碼
所謂的會(huì)話(session),就是客戶端瀏覽器和服務(wù)端網(wǎng)站之間一次完整的交互過程,本文介紹falsk通過cookie和session來控制http會(huì)話的全部解析,通常我們可以用cookie和session來保持用戶登錄等,感興趣的朋友一起看看吧2024-03-03Python選擇網(wǎng)卡發(fā)包及接收數(shù)據(jù)包
今天小編就為大家分享一篇關(guān)于Python選擇網(wǎng)卡發(fā)包及接收數(shù)據(jù)包,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-04-04Python爬蟲實(shí)戰(zhàn)之虎牙視頻爬取附源碼
讀萬卷書不如行萬里路,學(xué)的扎不扎實(shí)要通過實(shí)戰(zhàn)才能看出來,本篇文章手把手帶你爬取虎牙短視頻數(shù)據(jù),大家可以在實(shí)戰(zhàn)過程中查缺補(bǔ)漏,加深學(xué)習(xí)2021-10-10