詳解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ù),它主要負(fù)責(zé)調(diào)用測試函數(shù)的“setup”、“call”和“teardown”鉤子函數(shù),并生成對應(yīng)的測試報告。
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: 表示下一個待執(zhí)行的測試用例對象,用于實現(xiàn)測試順序的控制。
函數(shù)返回一個包含 pytest.TestReport 對象的列表,每個對象表示執(zhí)行一個鉤子函數(shù)的測試結(jié)果。
參數(shù)解析
在上述參數(shù)中,item 是必選參數(shù),表示待執(zhí)行的測試用例對象。該參數(shù)通常由 pytest 測試框架提供,我們無需手動傳入該參數(shù)。
log 參數(shù)是一個布爾值,用于控制是否打印日志。在默認(rèn)情況下,該參數(shù)為 True,即會打印日志。如果你希望在測試過程中關(guān)閉日志,可以將該參數(shù)設(shè)置為 False。
nextitem 參數(shù)則表示下一個待執(zhí)行的測試用例對象,用于實現(xiàn)測試順序的控制。當(dāng) runtestprotocol 函數(shù)執(zhí)行完當(dāng)前測試用例之后,它會自動執(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 是一個布爾值,表示是否將測試結(jié)果記錄到日志中,nextitem 表示下一個將要被執(zhí)行的測試項(可選)。
然后,我們使用 hasattr(item, "_request") 判斷 item 對象是否包含 _request 屬性。如果包含,則我們檢查該屬性的值是否為 False,如果是,則執(zhí)行 item._initrequest() 方法。這段代碼主要是為了處理一種特殊情況:當(dāng)測試項重新運行(例如通過 pytest-rerunfailures 插件),可能需要重新初始化 _request 屬性。
接下來,我們調(diào)用 call_and_report 函數(shù)執(zhí)行 setup 鉤子函數(shù),并將其結(jié)果存儲在 rep 變量中:
? ?rep = call_and_report(item, "setup", log)
call_and_report 函數(shù)是一個輔助函數(shù),用于執(zhí)行鉤子函數(shù)并生成測試報告(TestReport 對象)。在這里,我們調(diào)用該函數(shù)來執(zhí)行 setup 鉤子函數(shù),并將結(jié)果存儲在 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í)行成功。如果成功,則判斷是否需要在控制臺顯示該測試項的詳細(xì)信息,如果需要,則調(diào)用 show_test_item 函數(shù)顯示詳細(xì)信息。然后,我們再次使用 call_and_report 來執(zhí)行測試函數(shù)并生成測試報告,并將其添加到 reports 列表中。
最后,我們再次使用 call_and_report 函數(shù)執(zhí)行 teardown 鉤子函數(shù),并將其結(jié)果存儲在 rep 變量中:
? ?reports.append(call_and_report(item, "teardown", log, nextitem=nextitem))
然后,我們將 rep 添加到 reports 列表中,并返回該列表作為測試結(jié)果。
? ?return reports
當(dāng)所有測試項執(zhí)行完成后,pytest 會將測試結(jié)果打印到控制臺,并將其寫入日志文件。這樣,我們就可以輕松地進(jìn)行測試并獲取測試報告。
最后
總之,runtestprotocol 函數(shù)是 pytest 測試框架中非常重要的一個函數(shù),它用于執(zhí)行測試用例并觸發(fā) pytest 鉤子函數(shù)。當(dāng)然我們實際場景中通常不會直接調(diào)用該函數(shù),這里主要做一個了解,方便查看插件的源碼時遇到不知道是干啥的。
以上就是詳解pytest中runtestprotocol方法的實現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于pytest runtestprotocol方法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python字典dict常用內(nèi)置函數(shù)詳解
這篇文章主要介紹了Python字典dict常用內(nèi)置函數(shù)詳解,dict是Python中的一種內(nèi)置數(shù)據(jù)類型,它是一種鍵值對的集合,類似于Java中的Map或其他語言中的字典,需要的朋友可以參考下2023-07-07
淺談Python3中datetime不同時區(qū)轉(zhuǎn)換介紹與踩坑
最近的項目需要根據(jù)用戶所屬時區(qū)制定一些特定策略,學(xué)習(xí)、應(yīng)用了若干python3的時區(qū)轉(zhuǎn)換相關(guān)知識,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
Python實現(xiàn)Word文檔自動化排版的完整流程
這篇文章主要為大家詳細(xì)介紹了Python實現(xiàn)Word文檔自動化排版的完整流程,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的小伙伴可以了解下2026-01-01
python實現(xiàn)在函數(shù)圖像上添加文字和標(biāo)注的方法
今天小編就為大家分享一篇python實現(xiàn)在函數(shù)圖像上添加文字和標(biāo)注的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07

