pytest介紹(python測試框架)(@pytest.mark.parametrize、@pytest.fixtures)

文章目錄

  • **1. 核心特點**
    • - **簡潔易用**:無需復雜的配置,只需編寫簡單的函數或類即可進行測試。
    • - **豐富的斷言**:直接使用 Python 內置的 `assert` 語句,失敗時提供詳細的錯誤信息。
    • - **自動發現測試**:通過約定的命名規則(如 `test_*.py` 或 `*_test.py`)自動收集測試用例。
    • - **參數化測試**:通過 `@pytest.mark.parametrize` 輕松實現多組輸入和輸出的測試。
    • - **Fixtures 管理資源**:通過 `fixture` 定義測試的前置條件和后置清理邏輯,支持重用和作用域控制。
    • - **插件生態**:豐富的插件(如 `pytest-html` 生成報告、`pytest-xdist` 并行執行)擴展功能。
    • - **模塊化測試**:支持測試函數、測試類、測試方法等多種組織形式。
  • **2. 安裝與快速入門**
    • **安裝**
    • **編寫第一個測試**
    • **運行測試**
  • **3. 核心功能詳解**
    • **3.1 測試函數與類**
      • - **測試函數**:以 `test_` 開頭的函數。
      • - **測試類**:以 `Test` 開頭的類,類中的方法以 `test_` 開頭。
    • **3.2 參數化測試**
    • **3.3 Fixtures(固定裝置)**
      • 代碼示例
      • **Fixtures 的作用域**:
    • **3.4 異常測試**
    • **3.5 插件系統**
      • - **生成 HTML 報告**:`pytest-html`
      • - **并行執行**:`pytest-xdist`
    • **3.6 命令行參數**
      • - `-v`:顯示詳細輸出。
      • - `-k`:按關鍵字過濾測試(如 `pytest -k "add or subtract"`)。
      • - `-m`:按標記運行測試(如 `pytest -m slow`)。
      • - `--maxfail`:達到指定失敗次數后停止測試。
  • **4. 高級用法**
    • **4.1 標記測試(Markers)**
    • **4.2 Hook 函數**
    • **4.3 多進程/分布式測試**
    • **4.4 模擬對象(Mock)**
  • **5. 實際應用場景**
    • - **單元測試**:驗證單個函數或方法的正確性。
    • - **集成測試**:測試多個模塊或系統的協作。
    • - **API 測試**:結合 `requests` 等庫測試 HTTP 接口。
    • - **持續集成(CI/CD)**:集成到 Jenkins、GitHub Actions 等工具中,自動化運行測試。
  • **6. 優勢總結**
  • **7. 學習資源**

pytest 是 Python 中最流行且功能強大的測試框架之一,以其簡潔的語法、靈活的功能和強大的擴展性著稱。它適用于從簡單的單元測試到復雜的自動化測試場景,廣泛用于開發、測試和持續集成流程中。以下是關于 pytest 的詳細介紹:


1. 核心特點

- 簡潔易用:無需復雜的配置,只需編寫簡單的函數或類即可進行測試。

- 豐富的斷言:直接使用 Python 內置的 assert 語句,失敗時提供詳細的錯誤信息。

- 自動發現測試:通過約定的命名規則(如 test_*.py*_test.py)自動收集測試用例。

- 參數化測試:通過 @pytest.mark.parametrize 輕松實現多組輸入和輸出的測試。

- Fixtures 管理資源:通過 fixture 定義測試的前置條件和后置清理邏輯,支持重用和作用域控制。

- 插件生態:豐富的插件(如 pytest-html 生成報告、pytest-xdist 并行執行)擴展功能。

- 模塊化測試:支持測試函數、測試類、測試方法等多種組織形式。


2. 安裝與快速入門

安裝

pip install pytest

編寫第一個測試

創建一個文件 test_sample.py

def add(x, y):return x + ydef test_add():assert add(1, 2) == 3  # 斷言

運行測試

在命令行中執行:

pytest test_sample.py

輸出示例:

=========================== test session starts ============================
collected 1 itemtest_sample.py .                                                    [100%]============================ 1 passed in 0.01s =============================

3. 核心功能詳解

3.1 測試函數與類

- 測試函數:以 test_ 開頭的函數。

- 測試類:以 Test 開頭的類,類中的方法以 test_ 開頭。

class TestMath:def test_add(self):assert 1 + 1 == 2def test_subtract(self):assert 3 - 1 == 2

3.2 參數化測試

使用 @pytest.mark.parametrize 實現多組輸入測試:

import pytest@pytest.mark.parametrize("a, b, expected", [(1, 2, 3), (4, 5, 9), (7, 8, 15)])
def test_add(a, b, expected):assert a + b == expected

3.3 Fixtures(固定裝置)

Fixtures 用于管理測試的前置條件(如初始化資源)和后置清理(如關閉連接)。通過裝飾器 @pytest.fixture 定義:

代碼示例

import pytest@pytest.fixture
def tmp_dir(tmpdir):  # 使用內置的 tmpdir fixturereturn tmpdir.mkdir("test_data")def test_tmp_dir(tmp_dir):file = tmp_dir.join("test.txt")file.write("Hello")assert file.read() == "Hello"

上述代碼具體解釋參見:pytest tmpdir fixture介紹(tmpdir_factory)(自動在測試開始前創建一個臨時目錄,并在測試結束后刪除該目錄)

Fixtures 的作用域

  • function(默認):每個測試函數執行一次。
  • class:每個測試類執行一次。
  • module:每個模塊執行一次。
  • session:整個測試會話執行一次。

3.4 異常測試

測試是否拋出特定異常:

def test_exception():with pytest.raises(ValueError):raise ValueError("Invalid input")

3.5 插件系統

通過插件擴展功能:

- 生成 HTML 報告pytest-html

pytest --html=report.html

- 并行執行pytest-xdist

pytest -n 4  # 使用 4 個 CPU 并行運行

3.6 命令行參數

- -v:顯示詳細輸出。

- -k:按關鍵字過濾測試(如 pytest -k "add or subtract")。

- -m:按標記運行測試(如 pytest -m slow)。

- --maxfail:達到指定失敗次數后停止測試。


4. 高級用法

4.1 標記測試(Markers)

為測試添加標簽,用于分類或過濾:

import pytest@pytest.mark.slow
def test_slow():assert 1 + 1 == 2

運行標記為 slow 的測試:

pytest -m slow

4.2 Hook 函數

通過鉤子函數(Hook)自定義測試流程,例如修改測試報告或收集用例邏輯。需在 conftest.py 中定義。

4.3 多進程/分布式測試

結合 pytest-xdist 插件實現多進程或分布式測試,提升執行效率。

4.4 模擬對象(Mock)

使用 unittest.mock 模塊模擬函數或對象行為:

from unittest.mock import Mockdef test_mock():mock = Mock(return_value=42)assert mock() == 42

5. 實際應用場景

- 單元測試:驗證單個函數或方法的正確性。

- 集成測試:測試多個模塊或系統的協作。

- API 測試:結合 requests 等庫測試 HTTP 接口。

- 持續集成(CI/CD):集成到 Jenkins、GitHub Actions 等工具中,自動化運行測試。


6. 優勢總結

  • 學習成本低:語法簡單,無需繼承基類。
  • 可擴展性強:豐富的插件生態支持各種需求。
  • 社區活躍:文檔完善,社區支持強大。
  • 高效調試:失敗時自動顯示詳細的錯誤信息和中間值。

7. 學習資源

  • 官方文檔:https://docs.pytest.org
  • 中文教程:Pytest 中文文檔
  • 實戰示例:GitHub 上的開源項目(如 GitCode 的 Pytest 教程)。

通過掌握 pytest,你可以顯著提升 Python 項目的測試效率和代碼質量!

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

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

相關文章

[Python 基礎課程]繼承

在 Python 的面向對象編程(OOP)中,繼承(Inheritance) 是一種重要的機制,它允許一個類(稱為子類或派生類)從另一個類(稱為父類、基類或超類)中繼承屬性和方法。…

QT之設計器組件功能(8大類55個組件)

組件名稱 功能描述關鍵屬性1. Layouts(布局組件)(1) Vertical Layout(垂直布局)將子控件按垂直方向依次排列layoutSpacing:控件之間的間距layoutMargin:布局邊緣的邊距layoutStretch:設置各控件…

java中list的api詳細使用

在Java中,List是集合框架中最常用的接口之一,繼承自Collection,代表有序、可重復的元素集合(允許null元素)。其核心實現類有ArrayList(數組實現,隨機訪問高效)、LinkedList&#xff…

Azure AI Search 探索總結

Azure AI Search 原名 Azure Cognitive Service,是Azure中用來給AI項目構建知識庫的組件。知識庫本質和數據庫很像,但是內部的存儲結構和檢索算法不一樣。比如并不是知識庫的每一列都可以用來過濾、檢索或group by,而是要根據實際情況配置。A…

高效解決 pip install 報錯 SSLError: EOF occurred in violation of protocol

高效解決 pip install 報錯 SSLError: EOF occurred in violation of protocol 標簽: Python, pip, SSLError, Clash, 網絡代理, 問題解決 一、問題描述 在Python開發中,pip 是我們最親密的伙伴。然而,當你身處需要科學上網的環境&#xff0c…

CSS 核心知識點全解析:從基礎到實戰應用

大家好!今天這篇文章將系統總結 CSS 的核心知識點,從最基礎的樣式引入到復雜的選擇器應用,再到盒子模型、文本處理等實戰技巧,全程結合代碼示例,讓你輕松掌握 CSS 的精髓。一、CSS 是什么?為什么需要它&…

ClickHouse的學習與了解

什么是ClickHouse? ClickHouse是一個用于聯機分析(OLAP)的列式數據庫管理系統(DBMS)。 在傳統的行式數據庫系統中,數據按如下順序存儲:RowWatchIDJavaEnableTitleGoodEventEventTime#0893543506621Investor Relations12016/5/18 5:19#1903295…

安卓11 12系統修改定制化_____修改系統 解鎖system分區 去除data加密 自由刪減系統應用

在定制化系統中。修改系統分區 解鎖system。讓用戶可以自由刪減應用。這個在定制化服務中比較常見。對于此項修改服務。需要我們了解基礎的分區常識以及常用的幾種基礎修改步驟。 通過博文了解?????? 1??????-----修改rom 解鎖 system 分區有什么意義 2????…

JetPack系列教程(八):PDF庫——讓Android應用也能優雅“翻頁”

JetPack系列教程(八):PDF庫——讓Android應用也能優雅“翻頁” 在Android開發的世界里,加載PDF文件一直是個讓人又愛又恨的“小妖精”。愛它,因為PDF是文檔界的“萬能鑰匙”;恨它,因為原生Andr…

Three.js三大組件:場景(Scene)、相機(Camera)、渲染器(Renderer)

上一篇中我們學習了第一個Three.js場景"Hello World"。這一篇就來學習three.js的核心組件。 此圖來源(Three.js中文網) three.js的核心由三大組件構成:場景(Scene)、相機(Camera)和渲染器(Renderer)。下面我將詳細介紹這三大件的作…

AI幻覺終結之后:GPT-5開啟的“可靠性”新賽道與開發者生存指南

摘要: Sam Altman關于GPT-5將基本終結幻覺的宣告,不僅僅是一次技術升級,它標志著一個“萬物皆可AI,但萬事皆需驗證”的混亂時代的結束。本文將從一個全新的戰略視角出發,探討當“可靠性”取代“創造性”成為AI競賽的核…

ubuntu遠程桌面很卡怎么解決?

服務端方案 完成XRDP的性能優化配置: 1. 首先檢查當前的xrdp.ini文件 grep -n "tcp_send_buffer_bytes" /etc/xrdp/xrdp.ini2. 編輯xrdp.ini文件,修改TCP發送緩沖區大小 sudo sed -i s/#tcp_send_buffer_bytes32768/tcp_send_buffer_bytes4194…

[Linux] Linux系統負載監控 Linux服務管理

目錄 Linux系統負載監控 系統負載介紹 查看系統負載 負載解讀 top 命令 Linux服務管理 systemd 介紹 系統啟動管理進程 基本概念 systemd 架構 unit 類型 查看 unit 列表信息 查看單個 unit 信息 控制系統服務 systemctl 命令 unit 配置文件 例:開發…

vector 手動實現 及遇到的各種細節問題

之前對vector的一些功能使用了一下 接下來手動實現一下vector vector的實現和string還是有不小區別的 有很多地方都有細節的問題不同于string的成員變量一個指針一個size一個capacity的成員變量 vector里面存的是三個迭代器iterator 這的迭代器其實就是模版T的指針 這樣就…

OpenStack Neutron中的L2 Agent與L3 Agent:新手友好指南

引言:云網絡的幕后英雄 在當今的云計算世界中,OpenStack作為開源云平臺的佼佼者,為成千上萬的企業提供了靈活、可擴展的基礎設施服務。而在OpenStack的眾多組件中,Neutron(網絡服務)扮演著至關重要的角色—…

【自用】JavaSE--特殊文件Properties與XML、日志技術

特殊文件概述使用特殊文件可以存儲多個有關系的數據,作為系統的配置信息屬性文件類似于鍵值對,一一對應存儲數據(比如用戶名與密碼)XML文件存儲多個用戶的多個屬性更適合,適合存儲更復雜的數據Properties注:這個屬性文件的后綴即使…

中本聰思想與Web3的困境:從理論到現實的跨越

一、中本聰思想的核心精髓中本聰通過比特幣白皮書提出的核心思想,可歸納為三大支柱:去中心化貨幣體系目標:擺脫中央機構控制,避免通貨膨脹和政治干預(如2008年金融危機暴露的中心化風險)。實現路徑&#xf…

Centos 用戶管理

一.創建用戶 在 root賬戶 或 sudo 權限下 1. 創建用戶 useradd xiaoyangzi2.為該用戶設置密碼或修改密碼 passwd xiaoyangzi3. 將用戶加入wheel用戶組 在 CentOS 中,屬于 wheel 組的用戶默認可以使用 sudo 權限。 查看所屬用戶組: groups xiaoyangzi將 xiaoyangzi 加…

C++枚舉算法習題

1. 3的倍數枚舉(基礎)題目:在之間有10和50多少個數是3的倍數?列舉這些數。 解析:枚舉10到50之間的數,判斷是否能被3整除。優化:計算第一個≥10的3的倍數(1234)&#xff0…

【SpringBoot系列-01】Spring Boot 啟動原理深度解析

【SpringBoot系列-01】Spring Boot 啟動原理深度解析 大家好!今天咱們來好好聊聊Spring Boot的啟動原理。估計不少人跟我一樣,剛開始用Spring Boot的時候覺得這玩意兒真神奇,一個main方法跑起來就啥都有了。但時間長了總會好奇:這…