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

