深度解析 Pytest 中的 conftest.py

關注開源優測不迷路

大數據測試過程、策略及挑戰

測試框架原理,構建成功的基石

在自動化測試工作之前,你應該知道的10條建議

在自動化測試中,重要的不是工具

在使用 Pytest 進行測試的過程中,conftest.py 文件扮演著極為重要的角色。它猶如一個隱藏的魔法盒,里面裝滿了各種強大的工具,能讓我們的測試工作變得更加高效、便捷且靈活。今天,我們就來揭開這個魔法盒的神秘面紗,深入了解 conftest.py 的詳細內容。

一、conftest.py 的核心功能概述

1.1 測試夾具(Fixtures)的集中管理

conftest.py 文件是存放測試夾具(Fixtures)的理想場所。測試夾具就像是測試用例執行時的得力助手,能夠為測試提供各種必要的資源,如數據、對象、環境等。通過在 conftest.py 中定義測試夾具,我們可以在多個測試模塊中輕松地共享和復用這些資源,避免了在每個測試文件中重復編寫相同的準備代碼,大大提高了代碼的可維護性和測試效率。


1.2 鉤子函數(Hooks)的定義與實現

除了測試夾具,conftest.py 還允許我們定義各種鉤子函數(Hooks)。這些鉤子函數就像是一個個監聽器,在測試執行的不同階段被觸發,從而讓我們能夠在特定的時機插入自定義的代碼邏輯。例如,我們可以利用鉤子函數在測試開始前進行一些全局的初始化操作,或者在測試結束后進行資源清理和結果收集等工作。鉤子函數為我們提供了一種強大的擴展機制,使得 Pytest 框架能夠更好地適應不同項目的特定需求。


1.3 測試環境的統一配置

在一個復雜的測試項目中,往往需要對測試環境進行統一的配置和管理。conftest.py 文件可以作為一個集中的配置中心,用于設置測試環境的各種參數和選項,如數據庫連接信息、日志記錄級別、測試數據的路徑等。通過在 conftest.py 中進行統一的環境配置,我們能夠確保所有的測試用例在一致的環境下運行,減少因環境差異導致的測試結果不一致性,提高測試的可靠性和穩定性。

二、測試夾具(Fixtures)在 conftest.py 中的運用

2.1 定義測試夾具的基本語法

在 conftest.py 文件中,我們可以使用@pytest.fixture裝飾器來定義測試夾具。下面是一個簡單的示例,展示了如何定義一個返回整數列表的測試夾具:

import pytest@pytest.fixture
def sample_data():return [1, 2, 3, 4, 5]

2.2 測試夾具的作用域(Scope)設置

測試夾具的作用域決定了它的生命周期以及在哪些測試用例中可用。Pytest 提供了多種作用域選項,包括function(函數級)、module(模塊級)、session(會話級)等。

  • 函數級作用域(function):這是默認的作用域設置。每次調用使用該夾具的測試函數時,都會重新創建和銷毀該夾具。例如:

@pytest.fixture(scope='function')def function_scope_fixture():print("創建函數級作用域夾具")yieldprint("銷毀函數級作用域夾具")def test_function_scope(function_scope_fixture):print("執行函數級作用域測試用例")
  • 模塊級作用域(module):在整個測試模塊中,該夾具只會被創建一次,并且在模塊內的所有測試用例中共享。例如:

@pytest.fixture(scope='module')def module_scope_fixture():print("創建模塊級作用域夾具")yieldprint("銷毀模塊級作用域夾具")def test_module_scope_1(module_scope_fixture):print("執行模塊級作用域測試用例1")def test_module_scope_2(module_scope_fixture):print("執行模塊級作用域測試用例2")
  • 會話級作用域(session):整個測試會話中,該夾具只會被創建一次,并且在所有測試模塊中共享。通常用于一些昂貴的資源初始化,如數據庫連接池的創建等。例如:

@pytest.fixture(scope='session')def session_scope_fixture():print("創建會話級作用域夾具")yieldprint("銷毀會話級作用域夾具")def test_session_scope_1(session_scope_fixture):print("執行會話級作用域測試用例1")def test_session_scope_2(session_scope_fixture):print("執行會話級作用域測試用例2")

2.3 測試夾具的參數化

我們還可以對測試夾具進行參數化,以便在不同的測試用例中使用不同的夾具參數。通過@pytest.fixture裝飾器的params參數來實現。例如:

import pytest@pytest.fixture(params=[1, 2, 3])
def parameterized_fixture(request):return request.paramdef test_parameterized(parameterized_fixture):print(f"使用參數化夾具的值:{parameterized_fixture}")

在上述示例中,parameterized_fixture夾具將會被調用三次,每次傳入不同的參數值(1、2、3),對應的測試用例也會執行三次,分別使用不同的參數值進行測試。

2.4 測試夾具的自動使用(autouse)

有時候,我們希望某些測試夾具在所有測試用例中自動被使用,而無需在每個測試函數中顯式地傳入夾具參數。這時候,可以通過設置autouse=True來實現。例如:

import pytest@pytest.fixture(autouse=True)
def setup_and_teardown():print("在所有測試用例之前執行:設置操作")yieldprint("在所有測試用例之后執行:清理操作")def test_example():print("執行測試用例")

在這個例子中,setup_and_teardown夾具會在每個測試用例執行前自動進行設置操作,在測試用例執行后自動進行清理操作,無需在test_example函數中顯式傳入夾具參數。


三、鉤子函數(Hooks)在 conftest.py 中的實現

3.1 常用鉤子函數介紹

Pytest 提供了豐富的鉤子函數,以下是一些常用的鉤子函數及其用途:

  • pytest_configure(config):在測試開始前進行全局的配置操作,可以修改配置對象的屬性,如添加自定義的命令行選項、設置測試結果報告的格式等。

  • pytest_sessionstart(session):在測試會話開始時被調用,用于執行一些一次性的初始化操作,如創建測試結果目錄、初始化數據庫連接等。

  • pytest_sessionfinish(session, exitstatus):在測試會話結束時被調用,可以進行資源清理和測試結果收集等工作,如關閉數據庫連接、生成測試報告等。

  • pytest_collection_modifyitems(items):在測試用例收集完成后被調用,可以對收集到的測試用例列表進行修改和篩選,例如根據標記(mark)過濾某些測試用例、重新排序測試用例等。


3.2 鉤子函數的使用示例

下面是一個簡單的示例,展示了如何在 conftest.py 中使用pytest_sessionstartpytest_sessionfinish鉤子函數來記錄測試會話的開始和結束時間:

?

import pytestimport timedef pytest_sessionstart(session):session.start_time = time.time()print("測試會話開始")def pytest_sessionfinish(session, exitstatus):end_time = time.time()print(f"測試會話結束,耗時:{end_time - session.start_time}秒")

在這個例子中,當測試會話開始時,pytest_sessionstart鉤子函數會記錄當前時間到session.start_time屬性中。當測試會話結束時,pytest_sessionfinish鉤子函數會計算并打印出測試會話的耗時。


四、conftest.py 的作用域與模塊層級關系

4.1 作用域的層次結構

conftest.py 文件的作用域是有層次結構的。在一個項目中,可以存在多個 conftest.py 文件,它們分別位于不同的目錄層級。最頂層的 conftest.py 文件(通常位于項目根目錄)的作用域最廣,其定義的測試夾具和鉤子函數可以在整個項目的所有測試模塊中使用。而位于子目錄中的 conftest.py 文件,其作用域僅限于該子目錄及其子目錄下的測試模塊。


4.2 模塊層級對測試夾具和鉤子函數的影響

這種模塊層級關系對測試夾具和鉤子函數的使用有一定的影響。例如,如果在子目錄中的測試模塊需要使用頂層 conftest.py 中定義的測試夾具,它可以直接使用,無需額外的導入操作。但是,如果子目錄中的 conftest.py 也定義了同名的測試夾具,那么子目錄中的測試模塊將優先使用本地定義的夾具,而不會使用頂層的同名夾具。這為我們在不同層級的測試中提供了靈活的定制和隔離機制,使得我們可以根據具體的測試需求,在不同的層級上合理地定義和使用測試資源。

五、conftest.py 在實際項目中的最佳實踐

5.1 合理組織測試夾具和鉤子函數

在實際項目中,隨著測試用例的增加和測試需求的復雜化,conftest.py 文件可能會變得越來越龐大。為了保持代碼的可讀性和可維護性,我們需要合理地組織測試夾具和鉤子函數。可以按照功能模塊或者測試類型將相關的夾具和鉤子函數分組,通過添加適當的注釋和文檔字符串來解釋其用途和使用方法。


5.2 避免過度使用全局狀態

雖然 conftest.py 提供了一種方便的全局共享資源的方式,但過度使用全局狀態可能會導致測試之間的耦合度增加,使得測試用例變得難以理解和維護。在定義測試夾具和鉤子函數時,要盡量遵循單一職責原則,避免在一個夾具或鉤子函數中做過多無關的操作,同時要注意資源的正確清理和釋放,防止資源泄漏。


5.3 結合插件擴展功能

Pytest 擁有豐富的插件生態系統,我們可以結合一些插件來進一步擴展 conftest.py 的功能。例如,使用pytest-cov插件可以在 conftest.py 中配置代碼覆蓋率統計,使用pytest-xdist插件可以實現測試用例的分布式執行等。通過合理地選擇和使用插件,能夠更好地滿足項目的測試需求,提高測試效率和質量。


5.4 改進和優化

隨著項目的不斷發展,測試需求和環境可能會發生變化。因此,我們需要定期回顧 conftest.py 文件中的代碼,根據實際情況進行優化和調整。刪除不再使用的測試夾具和鉤子函數,修復可能出現的性能問題或兼容性問題,確保 conftest.py 始終能夠有效地支持項目的測試工作。

通過以上對 conftest.py 的詳細解析,我們可以看到它在 Pytest 測試框架中是一個非常強大且靈活的工具。熟練掌握 conftest.py 的使用方法,能夠幫助我們更好地組織測試代碼、管理測試資源、擴展測試功能,從而提高測試效率和質量,為項目的穩定發展提供有力的保障。

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

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

相關文章

【python】銀行客戶流失預測預處理部分,獨熱編碼·標簽編碼·數據離散化處理·數據篩選·數據分割

數據預處理 通過網盤分享的文件:銀行流失預測數據和代碼 鏈接: https://pan.baidu.com/s/1loiB8rMvZArfjJccu4KW6w?pwdpfcs 提取碼: pfcs 非數值特征處理 目的:將非數值特征轉換為數值型,以便模型能夠處理。方法: 地理位置&am…

回歸預測 | MATLAB實現CNN-LSSVM卷積神經網絡結合最小二乘支持向量機多輸入單輸出回歸預測

回歸預測 | MATLAB實現CNN-LSSVM卷積神經網絡結合最小二乘支持向量機多輸入單輸出回歸預測 目錄 回歸預測 | MATLAB實現CNN-LSSVM卷積神經網絡結合最小二乘支持向量機多輸入單輸出回歸預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 回歸預測 | MATLAB實現CNN-LSSVM…

slam學習筆記7---狀態量求導相關數學公式

前言:本來打算只是歸納一下數學求導相關公式,后面也寫了旋轉求導相關內容,哈哈。感覺有點發散把握不住呀。水平有限,歡迎評論區點出。 一、基本初等函數求導公式 ( C ) ′ 0 , C (C)0,C (C)′0,C為常數 ( x μ ) ′ μ x μ ?…

32單片機串口數據接收、空閑IDLE中斷詳解

一、前提說明 一開始寫單片機程序的時候不太清楚空閑中斷這個東西,每次用串口接收數據,都要再開一個定時器,在定時器內進行倒計時,每次接收數據就重置計時時間,計時結束就觸發中斷,再判斷所有接收的數據&am…

深入探討 Go 中的高級表單驗證與翻譯:Gin 與 Validator 的實踐之道20241223

深入探討 Go 中的高級表單驗證與翻譯:Gin 與 Validator 的實踐之道 在現代后端開發中,表單驗證是保證數據完整性和服務穩定性的核心環節。如何優雅、高效地實現表單驗證,同時提供人性化的錯誤提示,是每位開發者的必修課。在本文中…

掌握 Ansys ACP 中的參考方向:簡化復雜的復合材料設計

概括 在復合材料分析領域,精度至關重要,尤其是在定義纖維方向和鋪層時。Ansys ACP(Ansys Composite PrepPost)提供了強大的工具來建立參考方向,這是實現精確結構模擬的關鍵步驟。在本博客中,我們將揭開在 …

Vue2學習(一)——Vue簡介、Vue指令與指令修飾符

一、Vue簡介 Vue是一套用于構建用戶界面的漸進式框架。 所謂漸進式就是循序漸進,不一定非得把Vue中的所有API都學完才能開發Vue,可以學一點開發一點。 Vue2官網地址:https://v2.cn.vuejs.org/ Vue3官網地址:https://cn.vuejs…

Redis--通用命令學習

目錄 一、引言 二、基礎命令 1.set 2.get 3.keys 3.1 keys ? 3.2 keys * 3.3 keys [abe] 3.4 keys [^] 3.5 keys [a-b] 4.exists 5.delete 6.expire 7.ttl 8.type 三、Redis中的過期策略(面試題) 1.惰性刪除 2.定期刪除 …

Linux程序設計(第四版)| 學習筆記

上次學習Linux相關內容還是上學的時候為了應付考試,最近有項目涉及Linux,重新學習以下。 很多年前關于Linux的總結 一、入門 1.概念 (1) UNIX 1)定義:指的是一種遵循特定規范的計算機操作系統。 2)特點:簡單性、集中性、可重用…

PostgreSQL 的歷史

title: PostgreSQL 的歷史 date: 2024/12/23 updated: 2024/12/23 author: cmdragon excerpt: PostgreSQL 是一款功能強大且廣泛使用的開源關系型數據庫管理系統。其歷史可以追溯到1986年,當時由加州大學伯克利分校的一個研究團隊開發。文章將深入探討 PostgreSQL 的起源、…

Ubuntu22.04 LTS 安裝nvidia顯卡驅動

準備跑老師給定的Github上的多模態源碼,但是用了這么久ubuntu還沒有嘗試過安裝nvidia驅動,好在也是一次成功,于是記錄下來。 借鑒的是Ubuntu22.04安裝顯卡驅動(高速、避錯版)-CSDN博客這篇文章,按照流程來基本沒有問題,不過個人覺得有些步驟比較冗余,所以記錄下來 主要…

WPS工具欄灰色怎么辦

WPS離線不登錄,開啟工具欄等相關功能 當你在使用WPS的過程中,若因網絡問題或其他特殊原因,導致無法登錄使用WPS時,可根據以下步驟開啟離線兼容模式,開啟此模式后,可在未登錄的狀態下,激活并使用…

國標GB28181-2022平臺EasyGBS:安防監控中P2P的穿透方法

在安防監控領域,P2P技術因其去中心化的特性而受到關注,尤其是在遠程視頻監控和數據傳輸方面。P2P技術允許設備之間直接通信,無需通過中央服務器,這在提高效率和降低成本方面具有明顯優勢。然而,P2P技術在實際應用中也面…

Mac Android studio 升級LadyBug 版本,所產生的bug

當Build 出現,這樣的文字以后: Your build is currently configured to use incompatible Java 21.0.3 and Gradle 7.3.3. Cannot sync the project. We recommend upgrading to Gradle version 8.9. The minimum compatible Gradle version is 8.5. …

com.google.common.collect.ImmutableList$SerializedForm

今天AndroidStudio安裝了個2021版本的,gradle用了7.3.3,創建項目后控制臺總是有這樣一個錯誤: Unable to load class com.google.common.collect.ImmutableList$SerializedForm. This is an unexpected error. Please file a bug containing…

Docker部署Sentinel

一、簡介 是什么:面向分布式、多語言異構化服務架構的流量治理組件 能干嘛:從流量路由、流量控制、流量整形、熔斷降級、系統自適應過載保護、熱點流量防護等多個維度來幫助開發者保障微服務的穩定性 官網地址:https://sentinelguard.io/zh-c…

HTMLCSSJavaScriptDOM 之間的關系?

一、HTML 中文名:超文本標記語言 英文名:HyperText Markup Language HTML是一種用來結構化Web網頁及其內容的標記語言。 HTML 由一系列的元素組成,這些元素可以用來包圍不同部分的內容,使其以某種方式呈現或者工作。 圖Ⅰ 每…

Hadoop集群(HDFS集群、YARN集群、MapReduce?計算框架)

一、 簡介 Hadoop主要在分布式環境下集群機器,獲取海量數據的處理能力,實現分布式集群下的大數據存儲和計算。 其中三大核心組件: HDFS存儲分布式文件存儲、YARN分布式資源管理、MapReduce分布式計算。 二、工作原理 2.1 HDFS集群 Web訪問地址&…

位運算符、標記位傳參

位運算符: 位運算符作用于操作數的位(bit)。 按位與(&)對應位都為1時結果為1 int a 5; // 0101 int b 3; // 0011 int result a & b; // 0001 按位或(|)對應位至少有一個為1時結…

施耐德變頻器ATV320系列技術優勢:創新與安全并重

在工業自動化領域,追求高效、安全與智能已成為不可阻擋的趨勢。施耐德變頻器ATV320系列憑借其強大的設計標準和全球認證,成為能夠幫助企業降低安裝成本,提高設備性能的創新解決方案。 【全球認證,品質保障】ATV320 系列秉持施耐德…