上一節(jié)講到如何安裝和使用第三方插件 , 用法很簡單 。接下來解讀下如何自己開發(fā)pytest插件 。
但是 , 由于一個(gè)插件包含一個(gè)或多個(gè)鉤子函數(shù)開發(fā)而來 , 所以在具體開發(fā)插件之前還需要先學(xué)習(xí)hooks函數(shù) 。
一、什么是 hooks 函數(shù)簡單來說 , 在 pytest 的代碼中 , 預(yù)留出了一些函數(shù)供我們修改 , 以便來改變pytest工作方式 , 這些函數(shù)就是hooks函數(shù) , 我們可以直接重寫函數(shù)里的內(nèi)容 。
比如 , 在 pytest代碼路徑\Lib\site-packages\_pytest\hookspec.py中 , 可以看到 pytest 定義好的 hook 規(guī)范 , 方便我們?cè)陂_發(fā)插件的時(shí)候參考規(guī)范來調(diào)用對(duì)應(yīng)的hooks函數(shù) 。

文章插圖
二、hooks 函數(shù)的分類【鉤子 【pytest官方文檔】解讀-插件開發(fā)之hooks 函數(shù)】從
hooks函數(shù)的職責(zé)分類來看 , 大概如下幾類:- Bootstrapping hooks:引導(dǎo)類鉤子 , 用來調(diào)用已經(jīng)早就注冊(cè)好的內(nèi)部插件和第三方插件 。
- Collection hooks:集合類鉤子 , pytest 調(diào)用集合鉤子來收集文件和目錄 。
- Test running (runtest) hooks:測(cè)試運(yùn)行相關(guān)的鉤子 , 所有與測(cè)試運(yùn)行相關(guān)的鉤子都接收一個(gè)
pytest.Item對(duì)象 。 - Reporting hooks:與Session 會(huì)話相關(guān)的鉤子 。
- Debugging/Interaction hooks:調(diào)試/交互鉤子 , 少有的可以用于特殊的報(bào)告或與異常交互的鉤子函數(shù) 。
三、編寫 hooks 函數(shù)開發(fā)本地插件寫一個(gè)插件示例 。
比如我們平時(shí)執(zhí)行case的時(shí)候 , 一通跑完可能會(huì)出現(xiàn)不少失敗的case , 那通常我可能就會(huì)翻控制臺(tái)的輸出來找出哪些case失敗了 。
但是控制臺(tái)里輸出的信息有很多 , 于是乎我想直接把測(cè)試失敗的case信息存到一個(gè)本地文件里 , 我直接打開就可以看到所有失敗的case 。
先寫一個(gè)case文件里的建議測(cè)試用例:
# content of mytest/tests.pydef test_failed():assert Falsedef test_passed():assert Truedef test_failed2():assert False然后再同級(jí)目錄下創(chuàng)建一個(gè)conftest文件 , 之前聊fixture時(shí)候就說過 , conftest里的內(nèi)容就是本地插件了 。先直接放上插件代碼:
# content of mytest/conftest.pyimport pytestfrom pathlib import Pathfrom _pytest.main import Sessionfrom _pytest.nodes import Itemfrom _pytest.runner import CallInfofrom _pytest.terminal import TerminalReporterFAILURES_FILE = Path() / "failures.txt"@pytest.hookimpl()def pytest_sessionstart(session: Session):print("Hello 把蘋果咬哭")if FAILURES_FILE.exists():FAILURES_FILE.unlink()FAILURES_FILE.touch()@pytest.hookimpl(hookwrapper=True)def pytest_runtest_makereport(item: Item, call: CallInfo):outcome = yieldresult = outcome.get_result()if result.when == "call" and result.failed:try:with open(str(FAILURES_FILE), "a") as f:f.write(result.nodeid + "\n")except Exception as e:print("ERROR", e)pass解析1. 重寫鉤子函數(shù)首先 , 關(guān)于
pathlib模塊就是用來做一些路徑操作的庫 , 因?yàn)槲乙诒镜芈窂街羞M(jìn)行文件相關(guān)操作 。def pytest_sessionstart()中做的事情就是先看下本地是否存在這個(gè)名字叫failures.txt的文件 , 有的話就刪除 , 沒有就新建 。
經(jīng)驗(yàn)總結(jié)擴(kuò)展閱讀
- 五 微軟出品自動(dòng)化神器【Playwright+Java】系列 之常見點(diǎn)擊事件操作
- 湯圓凍太久里面有硬塊煮不熟
- 涼粉怎么保存
- 黃龍溪屬于成都還是眉山
- 今夏蚊子都熱死了嗎 蚊子也怕熱嗎
- 空調(diào)吹出酸臭味如何解決
- 干豆皮曬干了能放幾年
- 有什么藥可以把馬蜂全部殺死
- 生菜焯水多久
- 降真香是什么
