欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解pytest中runtestprotocol方法的實(shí)現(xiàn)

 更新時(shí)間:2023年10月20日 09:24:56   作者:郝同學(xué)的測開筆記  
runtestprotocol 是 pytest 執(zhí)行測試流程中的一個(gè)核心函數(shù),它主要負(fù)責(zé)調(diào)用測試函數(shù)的“setup”、“call”和“teardown”鉤子函數(shù),并生成對應(yīng)的測試報(bào)告,本文將深入探究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ù):itemlognextitem。其中,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)文章

最新評論