Unitest和pytest使用方法

unittest 是 Python 自帶的單元測試框架,用于編寫和運行可重復的測試用例。它的核心思想是通過斷言(assertions)驗證代碼的行為是否符合預期。以下是 unittest 的基本使用方法:


1. 基本結構

1.1 創建測試類
  • 繼承 unittest.TestCase,每個測試用例對應一個方法。
  • 測試方法必須 test_ 開頭,否則不會被自動識別為測試用例。
import unittestclass TestMathOperations(unittest.TestCase):def test_addition(self):self.assertEqual(1 + 1, 2)  # 斷言 1+1=2
1.2 前置與后置方法
  • setUp(): 在每個測試方法執行前運行(如初始化資源)。
  • tearDown(): 在每個測試方法執行后運行(如清理資源)。
  • setUpClass() / tearDownClass(): 在整個測試類的開始/結束時運行(需用 @classmethod 修飾)。
class TestExample(unittest.TestCase):@classmethoddef setUpClass(cls):print("整個測試類開始前執行")def setUp(self):print("每個測試方法開始前執行")def test_example(self):self.assertTrue(True)def tearDown(self):print("每個測試方法結束后執行")@classmethoddef tearDownClass(cls):print("整個測試類結束后執行")

2. 斷言方法

unittest 提供了豐富的斷言方法,常用如下:

方法說明
assertEqual(a, b)檢查 a == b
assertTrue(x)檢查 x 為 True
assertFalse(x)檢查 x 為 False
assertRaises(Error, func, *args)檢查函數 func 是否拋出 Error 異常
assertIn(a, b)檢查 ab
assertIsNone(x)檢查 x 是 None
def test_assertions(self):self.assertEqual(3 * 3, 9)self.assertIn(2, [1, 2, 3])with self.assertRaises(ZeroDivisionError):_ = 1 / 0

3. 運行測試

3.1 通過代碼運行

在腳本末尾添加:

if __name__ == "__main__":unittest.main()
3.2 通過命令行運行
# 運行單個測試模塊
python -m unittest test_module.py# 自動發現并運行所有測試(推薦)
python -m unittest discover
3.3 指定運行特定測試
# 運行單個測試類
python -m unittest test_module.TestClass# 運行單個測試方法
python -m unittest test_module.TestClass.test_method

4. 測試套件(Test Suite)

手動組織多個測試用例:

suite = unittest.TestSuite()
suite.addTest(TestMathOperations("test_addition"))
suite.addTest(TestExample("test_example"))runner = unittest.TextTestRunner()
runner.run(suite)

5. 高級用法

5.1 跳過測試

使用裝飾器跳過某些測試:

@unittest.skip("跳過原因")
def test_skipped(self):self.fail("不會執行")@unittest.skipIf(condition, "條件滿足時跳過")
def test_conditional_skip(self):pass
5.2 參數化測試

unittest 本身不支持參數化,但可通過第三方庫(如 parameterized)實現:

from parameterized import parameterizedclass TestParameterized(unittest.TestCase):@parameterized.expand([(2, 3, 5),(0, 0, 0),])def test_add(self, a, b, expected):self.assertEqual(a + b, expected)
5.3 Mock 對象

使用 unittest.mock 模擬外部依賴:

from unittest.mock import Mockdef test_mock(self):mock_obj = Mock(return_value=42)self.assertEqual(mock_obj(), 42)

6. 示例項目結構

project/
├── my_code.py       # 被測試的代碼
└── tests/├── __init__.py└── test_code.py # 測試代碼

總結

unittest 是 Python 測試的基石,適合中小型項目。對于復雜場景,可以結合第三方庫(如 pytest)增強功能。核心步驟:

  1. 繼承 TestCase 編寫測試類。
  2. 使用 test_ 前綴定義測試方法。
  3. 通過斷言驗證邏輯。
  4. 利用 setUp()/tearDown() 管理資源。
  5. 運行測試并分析結果。

pytest 是 Python 中最流行的第三方測試框架,以其簡潔的語法、強大的功能和靈活的擴展性著稱。相比 unittestpytest 更注重代碼的可讀性和可維護性,同時支持豐富的插件生態系統。以下是 pytest 的核心使用方法:


1. 安裝 pytest

pip install pytest

2. 基本用法

2.1 編寫測試函數
  • 測試函數名需以 test_ 開頭(或 _test 結尾)。
  • 斷言直接使用 Python 原生 assert 語句,無需記憶特定斷言方法。
# test_sample.py
def test_addition():assert 1 + 1 == 2def test_list_contains():numbers = [1, 2, 3]assert 2 in numbers
2.2 運行測試
# 運行當前目錄所有測試
pytest# 運行指定文件
pytest test_sample.py# 運行指定函數
pytest test_sample.py::test_addition# 顯示詳細輸出(-v 顯示用例名稱,-s 打印輸出)
pytest -v -s

3. 斷言增強

pytest 的斷言失敗信息更直觀,能自動展示上下文差異(如列表、字典比較):

def test_failure_example():expected = {"a": 1, "b": 2}actual = {"a": 1, "b": 3}assert expected == actual

運行后輸出:

AssertionError: assert {'a': 1, 'b': 2} == {'a': 1, 'b': 3}Differing items:{'b': 2} != {'b': 3}

4. Fixture(依賴注入)

pytestfixture 機制用于管理測試的依賴資源(如數據庫連接、臨時文件),支持復用和共享。

4.1 定義 Fixture
import pytest@pytest.fixture
def database_connection():conn = create_db_connection()  # 初始化資源yield conn                     # 返回資源conn.close()                   # 清理資源
4.2 使用 Fixture

在測試函數中通過參數名直接調用:

def test_query(database_connection):result = database_connection.query("SELECT * FROM users")assert len(result) > 0
4.3 Fixture 作用域

通過 scope 參數控制生命周期:

@pytest.fixture(scope="module")  # 作用域:模塊級(每個模塊執行一次)
def shared_resource():return initialize_resource()

5. 參數化測試

使用 @pytest.mark.parametrize 對單條測試用例注入多組參數,避免重復代碼。

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

6. 測試異常

使用 pytest.raises 捕獲并驗證異常:

def test_division_by_zero():with pytest.raises(ZeroDivisionError):_ = 1 / 0

7. Mock 對象(依賴隔離)

使用 pytest-mock 插件(基于 unittest.mock)模擬外部依賴:

pip install pytest-mock

示例:

def test_mocking(mocker):mock_requests = mocker.patch("requests.get")  # 模擬 requests.getmock_requests.return_value.status_code = 200response = requests.get("https://api.example.com")assert response.status_code == 200

8. 插件擴展

pytest 支持豐富的插件,例如:

  • pytest-cov: 測試覆蓋率統計
  • pytest-xdist: 并行運行測試
  • pytest-django: Django 項目集成
  • pytest-asyncio: 異步測試支持

安裝插件:

pip install pytest-cov pytest-xdist

9. 項目結構

project/
├── src/                  # 源代碼
│   └── my_module.py
└── tests/               # 測試代碼├── __init__.py├── conftest.py      # 全局 Fixture 定義├── test_core.py└── test_api.py

10. 與 unittest 兼容

pytest 可以直接運行 unittest 風格的測試用例:

# test_unittest_style.py
import unittestclass TestOldCode(unittest.TestCase):def test_legacy(self):self.assertEqual(1 + 1, 2)

運行:

pytest test_unittest_style.py

11. 高級功能

  • 標記(Markers)
    @pytest.mark 對測試分類(如跳過、標記為慢測試):

    @pytest.mark.skip(reason="尚未實現")
    def test_unimplemented():assert False@pytest.mark.slow
    def test_long_running():# 耗時操作pass
    

    運行指定標記的測試:

    pytest -m slow    # 只運行標記為 slow 的測試
    pytest -m "not slow"  # 排除 slow 測試
    
  • Hook 函數
    自定義 pytest 行為(如修改報告輸出)。


總結

pytest 的優勢:

  1. 簡潔性:使用原生 assert,減少樣板代碼。
  2. 靈活性:Fixture 機制優雅管理測試依賴。
  3. 擴展性:通過插件支持復雜場景(如異步、分布式測試)。
  4. 兼容性:無縫運行 unittestnose 測試。

適合從簡單腳本到大型項目的全場景測試需求。

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

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

相關文章

git 版本提交規范

Git 提交規范(Git Commit Message Convention)是為了讓項目的提交歷史更加清晰、可讀、便于追蹤和自動化工具解析。常見的規范之一是 Conventional Commits,下面是一個推薦的格式規范: 🌟 提交信息格式(Con…

stat判斷路徑

int stat(const char *pathname, struct stat *buf); pathname:用于指定一個需要查看屬性的文件路徑。 buf:struct stat 類型指針,用于指向一個 struct stat 結構體變量。調用 stat 函數的時候需要傳入一個 struct stat 變量的指針&#xff0…

學習Docker遇到的問題

目錄 1、拉取hello-world鏡像報錯 1. 檢查網絡連接 排查: 2. 配置 Docker 鏡像加速器(推薦) 具體解決步驟: 1.在服務器上創建并修改配置文件,添加Docker鏡像加速器地址: 2. 重啟Docker 3. 拉取hello-world鏡像 2、刪除鏡像出現異常 3、 容器內部不能運行ping命令 …

安寶特案例 | AR如何大幅提升IC封裝廠檢測效率?

前言:如何提升IC封裝廠檢測效率? 在現代電子產品的制造過程中,IC封裝作為核心環節,涉及到復雜處理流程和嚴格質量檢測。這是一家專注于IC封裝的廠商,負責將來自IC制造商的晶圓進行保護、散熱和導通處理。整個制程繁瑣…

【Linux網絡與網絡編程】07.應用層協議HTTPS

HTTP 協議內容都是按照文本的方式明文傳輸的,這就導致在傳輸過程中出現一些被篡改的情況。HTTPS 就是在 HTTP 協議的基礎上引入了一個加密層的應用層協議。 1. 基礎概念 1.1 加密與解密 加密就是把明文(要傳輸的信息)進行一系列變換&#x…

【k8s】PV,PVC的回收策略——return、recycle、delete

PV 和 PVC 的回收策略主要用于管理存儲資源的生命周期,特別是當 PVC 被刪除時,PV 的處理方式。回收策略決定了 PV 在 PVC 被刪除后的行為。 回收策略的類型 Kubernetes 提供了三種主要的回收策略,用于管理 PV 的生命周期: Reta…

2023藍帽杯初賽內存取證-2

直接使用mimikatz插件來獲取用戶密碼: vol.py --plugin/opt/volatility/plugins -f memdump.mem --profile Win7SP1x64 mimikatz 答案:3w.qax.com

使用dompurify修復XSS跨站腳本缺陷

1. 問題描述 漏洞掃描說有一個低危漏洞,容易被跨站腳本攻擊XSS。 2. 使用dompurify修復 DOMPurify is a DOM-only, super-fast, uber-tolerant XSS sanitizer for HTML, MathML and SVG. 簡單來說,我們可以使用 dompurify 處理xss跨站腳本攻擊。 2.…

【c語言】指針和數組筆試題解析

一維數組: //數組名a如果既不單獨放在sizeof()中,也不與&結合,那么就表示數組首元素的大小 //a一般表示數組首元素地址,只有兩種情況表示整個數組,sizeof(arr)表示整個數組的大小,&arr表示數組的地址 int a[]…

機器人進階---視覺算法(六)傅里葉變換在圖像處理中怎么用

傅里葉變換在圖像處理中怎么用 傅里葉變換的基本原理應用場景Python代碼示例逐行解釋總結傅里葉變換在圖像處理中是一種重要的工具,它將圖像從空間域轉換到頻域,從而可以對圖像的頻率特性進行分析和處理。傅里葉變換在圖像濾波、圖像增強、圖像壓縮和圖像分析等方面都有廣泛應…

深度學習與總結JVM專輯(七):垃圾回收器—CMS(圖文+代碼)

CMS垃圾收集器深度解析教程 1. 前言:為什么需要CMS?2. CMS 工作原理:一場與時間的賽跑2.1. 初始標記(Initial Mark)2.2. 并發標記(Concurrent Mark)2.3. 重新標記(Remark&#xff09…

數據采集:AI 發展的基石與驅動力

人工智能(AI)無疑是最具變革性的技術力量之一,正以驚人的速度重塑著各行各業的格局。從智能語音助手到自動駕駛汽車,從精準的醫療診斷到個性化的推薦系統,AI 的廣泛應用已深刻融入人們的日常生活與工作的各個層面。而在…

從信息泄露到內網控制

0x01 背景 之前常見用rce、文件上傳等漏洞獲取webshell,偶然遇到一次敏感信息泄露獲取權限的滲透,簡單記錄一下過程。 0x02 信息泄露 發現系統某端口部署了minio服務,經過探測發現存在minio存儲桶遍歷 使用利用工具把泄露的文件全部整理一…

《門》凡是過往,皆為序曲。我們的愛,和最初一樣

《門》凡是過往,皆為序曲。我們的愛,和最初一樣 夏目漱石,本名夏目金之助,筆名漱石,日本近代作家,代表作有《三四郎》《門》《從此以后》《我是貓》《心》《明暗》等。 竺家榮 譯 文章目錄 《門》凡是過往&…

衡石ChatBI:依托開放架構構建技術驅動的差異化數據服務

在當今數字化浪潮中,企業對數據價值的挖掘和利用需求日益增長。BI(商業智能)工具作為企業獲取數據洞察的關鍵手段,其技術架構的創新與發展至關重要。衡石科技的Chat BI憑借其獨特的開放架構,在BI領域脫穎而出&#xff…

oracle中錯誤總結

oracle中給表起別名不能用as,用as報錯 在 Oracle 數據庫中,??WITH 子句(即 CTE,公共表表達式)允許后續定義的子查詢引用前面已經定義的 CTE??,但 ??前面的 CTE 無法引用后面的 CTE??。這種設計類似…

NLP高頻面試題(五十)——大模型(LLMs)分詞(Tokenizer)詳解

在自然語言處理(NLP)任務中,將文本轉換為模型可處理的數字序列是必不可少的一步。這一步通常稱為分詞(tokenization),即把原始文本拆分成一個個詞元(token)。對于**大型語言模型(LLM,Large Language Model,大型語言模型)**而言,選擇合適的分詞方案至關重要:分詞的…

優化WAV音頻文件

優化 WAV 音頻文件通常涉及 減小文件體積、提升音質 或 適配特定用途(如流媒體、廣播等)。以下是分場景的優化方法,涵蓋工具和操作步驟: 一、減小文件體積(無損/有損壓縮) 1. 無損壓縮 轉換格式&#xff1…

ORACLE SQL輸入的變量由于隱式轉換無法使用索引的分析優化

近期,某客戶在巡檢分析AWR報告時,發現有個TOP SQL的執行效率偏慢,檢查分析SQL,發現數據塊讀取量高,分析執行計劃,發現有個查詢條件未使用到索引; 對執行計劃及表上的字段、索引進行分析&#x…

【鋰電池SOH估計】RF隨機森林鋰電池健康狀態估計,鋰電池SOH估計(Matlab完整源碼和數據)

目錄 效果一覽程序獲取程序內容代碼分享研究內容基于隨機森林(RF)的鋰電池健康狀態(SOH)估計算法研究摘要1. 引言2. 鋰電池SOH評估框架3. 實驗與結果分析4. 未來研究方向6. 結論效果一覽 程序獲取 獲取方式一:文章頂部資源處直接下載:【鋰電池SOH估計】RF隨機森林鋰電池…