以pytest_addoption 為例,講解pytest框架中鉤子函數的應用

鉤子函數(Hook Function)的概念

鉤子函數(Hook Function)是軟件框架中預定義的回調接口,允許開發者在程序執行的特定階段插入自定義邏輯,以擴展或修改框架的默認行為。在 pytest 中,鉤子函數覆蓋了測試生命周期的各個環節(如初始化、用例收集、執行、報告生成等),用戶通過實現這些鉤子函數,可以深度定制測試流程。

pytest_addoption?的作用與運行原理

1.?pytest_addoption?的功能
  • 核心作用:向 pytest?添加自定義命令行參數或配置文件選項,使測試能根據外部輸入動態調整行為。

  • 典型場景

    • 指定測試環境(如?--env=production)。

    • 控制測試模式(如?--headless?無頭模式)。

    • 動態過濾用例(如?--runslow?運行耗時測試)。

2. 鉤子函數的運行原理

鉤子函數的執行遵循以下流程:

2.1 框架初始化階段
  1. 加載插件與?conftest.py
    pytest 啟動時,會遞歸掃描項目目錄下的?conftest.py?文件和已安裝的插件,加載其中的代碼。

  2. 注冊鉤子函數
    框架檢測所有實現了約定名稱的鉤子函數(如?pytest_addoption),并將它們注冊到內部的鉤子管理系統中。

2.2 參數解析階段
  1. 調用?pytest_addoption
    在解析命令行參數前,pytest 主動調用所有已注冊的?pytest_addoption?鉤子函數。開發者在此通過?parser.addoption()?添加自定義參數。

    # conftest.py
    def pytest_addoption(parser):parser.addoption("--env", action="store", default="dev", help="Select environment: dev|staging|production")
  2. 解析命令行/配置文件
    pytest 根據已注冊的參數(包括自定義參數和內置參數)解析用戶的輸入(如?pytest --env=staging),并將結果存儲在?config?對象中。

2.3 參數傳遞與使用
  1. 在測試中獲取參數
    測試用例或 Fixture 通過?request.config.getoption("--env")?訪問參數值:

    # test_demo.py
    def test_env(request):env = request.config.getoption("--env")assert env in ["dev", "staging", "production"]

鉤子函數的本質與設計模式

1. 觀察者模式(Observer Pattern)
  • pytest 的鉤子機制基于觀察者模式:

    • 發布者:pytest 框架,在特定事件(如參數解析)發生時通知鉤子。

    • 訂閱者:用戶實現的鉤子函數(如?pytest_addoption),訂閱感興趣的事件并響應。

2. 控制反轉(Inversion of Control)
  • 框架控制流程,用戶通過鉤子函數注入邏輯,無需直接調用框架代碼。
    例如:用戶無需手動調用?pytest_addoption,框架會在正確時機自動觸發它。

完整示例:自定義參數控制測試行為

1. 定義命令行參數
# conftest.py
def pytest_addoption(parser):parser.addoption("--env",action="store",default="dev",choices=["dev", "staging", "production"],help="Select environment to run tests")parser.addoption("--headless",action="store_true",help="Run browser tests in headless mode")
2. 在 Fixture 中使用參數
# conftest.py
import pytest@pytest.fixture
def browser_env(request):env = request.config.getoption("--env")headless = request.config.getoption("--headless")return {"env": env, "headless": headless}
3. 編寫測試用例
# test_browser.py
def test_browser_settings(browser_env):print(f"Environment: {browser_env['env']}, Headless: {browser_env['headless']}")assert browser_env["env"] != "production"  # 示例斷言
4. 運行測試
# 指定環境和無頭模式
pytest -s --env=staging --headless# 輸出示例
test_browser.py Environment: staging, Headless: True
PASSED

鉤子函數的執行順序與優先級

  1. 插件加載順序
    插件和?conftest.py?的加載順序影響鉤子執行順序。通常:

    • 內置插件最先加載。

    • 外部插件按注冊順序加載。

    • conftest.py?按目錄層級從近到遠加載(最內層優先)。

  2. 鉤子函數疊加
    多個插件或?conftest.py?實現同一鉤子時,所有實現均會被調用。例如,多個?pytest_addoption?可共存,共同添加參數。

常見問題與調試

1. 鉤子未生效
  • 原因:函數名拼寫錯誤、未放置在?conftest.py?或插件中。

  • 調試:使用?pytest --trace-config?查看已加載的鉤子。

2. 參數沖突
  • 原因:多個鉤子添加同名參數。

  • 解決:通過?parser.addoption?的?dest?參數避免命名沖突。

總結

  • 鉤子函數是 pytest 擴展性的核心機制,允許在框架關鍵節點插入邏輯。

  • pytest_addoption?是參數定制的入口,通過解析命令行/配置,驅動測試動態行為。

  • 運行原理基于觀察者模式與控制反轉,框架自動觸發用戶定義的鉤子,實現靈活擴展。

pytest中還有很多鉤子函數,大家可以參考文章

收藏一下Deepseek統計的Pytest中 常用的Hook函數-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82001.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82001.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82001.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

合并兩個有序鏈表 - 簡單

************* C topic: 21. 合并兩個有序鏈表 - 力扣(LeetCode) ************* Give the topic an inspection. Hi, guys, how is your holiday break? I went to 黃山 in the past few days. The mount Huang is really beautiful. 天都峰 is real…

13.Spring boot中使用Actuator 監控

13.Spring boot中使用Actuator 監控 Spring Boot Actuator 是 Spring Boot 提供的一個強大的監控和管理工具,它通過暴露各種端點(Endpoints)來提供應用程序的運行時信息。這些端點可以幫助開發者和管理員監控應用程序的健康狀況、性能指標、…

Python+Scrapy跨境電商爬蟲實戰:從亞馬遜/沃爾瑪數據采集到反爬攻克(附Pangolin API高效方案)

從零實戰到反爬攻克,揭秘跨境數據抓取全流程與Pangolin Scrape API終極方案 在當今數據驅動的跨境電商時代,誰掌握了優質的市場數據,誰就掌握了成功的關鍵。隨著全球電商市場規模持續擴大(據Statista最新報告顯示,2025…

0基礎學習鴻蒙開發-HarmonyOS4

一、初識 1. 開發工具 官網 開發-HarmonyOS NEXT鴻蒙應用開發平臺-華為開發者聯盟 2. ArkTS 二、TypeScript 基本語法 1.變量聲明 2. 條件控制 注意 在TypeScrips中 空字符串數字0、null、undefined 都坡認為是false 其它值則為true if (num) {// num 非空執行 } 3. 循環迭…

深度學習中常用的符號表達式

在論文寫作過程中,常常涉及到一些關鍵的符號的表達,為了更加規范常用的一些符號表達,現將其總結如下(該文件會持續性更新): 數字 x x x : 標量 x \mathbf{x} x : 向量 X \mathbf{X} X : 矩陣 X \mathsf{X}…

react naive 網絡框架源碼解析

本文取 react native 兩個區別很大的版本做分析(0.76.5、0.53.3) 一、0.76.5 版fetch 全流程排查 1、JS 端的實現 隨手寫一個fetch,點開。 我們這里常用的還是手機端,因此選擇 react-native,react-native-windows …

OpenCV 圖形API(81)圖像與通道拼接函數-----透視變換函數warpPerspective()

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 對圖像應用透視變換。 函數 warpPerspective 使用指定的矩陣對源圖像進行變換: dst ( x , y ) src ( M 11 x M 12 y M 13 M 31 x…

深度學習在油氣地震資料反卷積中的應用

深度學習在油氣地震資料反卷積中的應用 基本原理 在油氣地震勘探中,反卷積(Deconvolution)是一種重要的信號處理技術,用于提高地震資料的分辨率。傳統方法(如維納濾波、預測反卷積等)存在對噪聲敏感、假設條件嚴格等局限。深度學習方法通過數據驅動的方…

Java開發者面試實錄:微服務架構與Spring Cloud的應用

面試場景 面試官: 請介紹一下你的基本情況。 程序員: 大家好,我叫張小明,今年27歲,碩士學歷,擁有5年的Java后端開發經驗。主要負責基于Spring Boot開發企業級應用,以及微服務架構的設計和實現。 面試官: 好的&#…

?Spring + Shiro 整合的核心要點及詳細實現說明

在 Spring 項目中集成 Apache Shiro 可以實現輕量級的安全控制(認證、授權、會話管理等)。以下是 ?Spring Shiro 整合的核心要點及詳細實現說明: 一、Spring 與 Shiro 整合的核心組件 ?組件??作用?ShiroFilterFactoryBean創建 Shiro 過…

網絡編程核心技術解析:從Socket基礎到實戰開發

網絡編程核心技術解析:從Socket基礎到實戰開發 一、Socket編程核心基礎 1. 主機字節序與網絡字節序:數據傳輸的統一語言 在計算機系統中,不同架構對多字節數據的存儲順序存在差異,而網絡通信需要統一的字節序標準,這…

SQLark可以支持PostgreSQL了,有哪些新功能?

SQLark(百靈連接)是一款國產的數據庫開發和管理工具,用于快速查詢、創建和管理不同類型的數據庫系統,支持達夢、Oracle 和 MySQL 數據庫。 最新發布的 SQLark V3.4 版本新增了對 PostgreSQL 數據庫的支持。我試用了一下&#xff…

【全面解析】Poco C++ Libraries 模塊詳解與使用指南

Poco(The Portable Components) 是一套現代 C 的跨平臺開發庫,廣泛應用于嵌入式系統、服務端程序、工業控制和 AI 后端服務等領域。其設計理念類似于 Java 的標準庫,為 C 提供“標準的非標準功能”。 本篇文章將帶你全面了解 Poco…

Vue+tdesign t-input-number 設置長度和顯示X號

一、需求 Vuetdesign t-input-number 想要設置input的maxlen和顯示X號 二、實現 t-input&#xff0c;可以直接使用maxlength和clearable屬性 <t-input v-model"value" clearable maxlength10 placeholder"請輸入" clear"onClear" blur&q…

(Go Gin)Gin學習筆記(二):路由配置、基本路由、表單參數、上傳單個文件、上傳多個文件、淺扒路由原理

1. 路由 gin 框架中采用的路優酷是基于httprouter做的 HttpRouter 是一個高性能的 HTTP 請求路由器&#xff0c;適用于 Go 語言。它的設計目標是提供高效的路由匹配和低內存占用&#xff0c;特別適合需要高性能和簡單路由的應用場景。 主要特點 顯式匹配&#xff1a;與其他路由…

Linux下的好玩的命令

在 CentOS 下&#xff0c;有許多有趣且實用的 Linux 命令&#xff0c;可以幫助你更好地了解系統、提升效率或進行娛樂。以下是一些好玩的 Linux 命令及其說明&#xff1a; 1. cowsay 和 cowthink 功能&#xff1a;讓一只牛&#xff08;或其他動物&#xff09;說出你想說的話。…

OpenharmonyOS+RK3568,【編譯燒錄】

文章目錄 1. 摘要 ?2. 代碼下載 &#x1f4e9;3. 編譯 &#x1f5a5;?4. 修改&適配 ??4.1 編譯框架基本概念4.2 vendor & device 目錄4.3 內核編譯4.3.1 如何修改、適配自己的開發板&#xff1f; 4.4 修改外設驅動 5. 燒錄&驗證 &#x1f4cb;參考 1. 摘要 ? …

深度學習模型優化:如何讓數據科學更智能?

深度學習模型優化:如何讓數據科學更智能? 一、引言:為什么優化深度學習模型如此重要? 深度學習的應用已經滲透到數據科學的各個領域,從圖像識別到自然語言處理,從推薦系統到金融風控,每一個智能模型都依賴于數據驅動的訓練。然而,一個模型的性能不僅僅取決于其架構,…

學習Python的第二天之網絡爬蟲

30歲程序員學習Python的第二天之網絡爬蟲的信息提取 BeautifulSoup庫 地址&#xff1a;https://beautifulsoup.readthedocs.io/zh-cn/v4.4.0/ 1、BeautifulSoup4安裝 在windows系統下通過管理員權限運行cmd窗口 運行pip install beautifulsoup4 測試實例 import requests…

n8n 鍵盤快捷鍵和控制鍵

n8n 鍵盤快捷鍵和控制鍵 工作流控制鍵畫布操作移動畫布畫布縮放畫布上的節點操作選中一個或多個節點時的快捷鍵 節點面板操作節點面板分類操作 節點內部操作 n8n 為部分操作提供了鍵盤快捷鍵。 工作流控制鍵 Ctrl Alt n&#xff1a;創建新工作流Ctrl o&#xff1a;打開工作…