【Python】?Python單元測試框架unittest總結

1. 本期主題:Python單元測試框架unittest詳解

unittest是Python內置的單元測試框架,遵循Java JUnit的"測試驅動開發"(TDD)理念,通過繼承TestCase類實現測試用例的模塊化組織。本文聚焦于獨立測試腳本的編寫,暫不涉及數據庫集成或參數化測試等高級場景(參數化測試建議使用parameterized包或pytest實現)。

涵蓋內容

  • 基礎機制:測試類與測試方法的定義規范
  • 執行流程:從腳本運行到結果輸出的完整鏈路
  • 結果解讀:通過符號標記快速定位測試問題

不涵蓋內容

  • DOM操作(前端測試建議使用Selenium
  • 數據庫集成測試(需結合unittest.mockpytest-fixture
  • 參數化測試(后續文章將單獨講解)

2. unittest核心機制與執行流程

2.1 測試腳本結構解析

import unittestclass CalculatorTestCase(unittest.TestCase):"""加法器測試類"""def test_add_positive(self):"""正數加法測試"""self.assertEqual(10 + 5, 15)def test_add_negative(self):"""負數加法測試"""self.assertEqual(-3 + 7, 4)if __name__ == "__main__":unittest.main(verbosity=2)  # 增加輸出詳細度

關鍵點說明

  1. 命名規范:測試類以Test結尾,測試方法以test_開頭
  2. 文檔字符串:類和方法建議添加說明性注釋
  3. 執行參數verbosity=2可顯示測試名稱而非僅點號

2.2 執行結果解讀

運行上述腳本將輸出:

test_add_negative (__main__.CalculatorTestCase) ... ok
test_add_positive (__main__.CalculatorTestCase) ... ok----------------------------------------------------------------------
Ran 2 tests in 0.001sOK
  • OK標記:所有測試通過
  • FAIL標記:斷言失敗時會顯示具體值(如self.assertEqual(10, 20)會輸出10 != 20

3. 常用斷言方法詳解

3.1 基礎斷言

class StringTestCase(unittest.TestCase):def test_string_operations(self):# 字符串相等驗證self.assertEqual("tianxin".upper(), "TIANXIN")# 字符串包含驗證self.assertIn("xin", "tianxin")# 布爾值驗證self.assertTrue("tianxin".startswith("tian"))self.assertFalse("tianxin".endswith("xin"))  # 實際會失敗,此處僅為示例

失敗案例演示

def test_false_positive(self):self.assertEqual(10, 20)  # 輸出: AssertionError: 10 != 20

3.2 異常驗證

class DivisionTestCase(unittest.TestCase):def test_zero_division(self):with self.assertRaises(ZeroDivisionError):5 / 0def test_invalid_type(self):with self.assertRaises(TypeError):"10" + 5  # 字符串與整數拼接會觸發TypeError

應用場景:驗證邊界條件(如除零、類型錯誤)


4. 生命周期鉤子:setUptearDown

4.1 層級說明與執行順序

鉤子方法執行時機適用場景
setUpModule模塊首次導入時初始化全局資源(如數據庫連接池)
setUpClass測試類首次實例化時類級別資源(如測試文件路徑)
setUp每個測試方法執行前測試方法獨占資源(如臨時文件)
tearDown每個測試方法執行后清理測試殘留(如刪除臨時文件)
tearDownClass測試類所有方法執行完畢后釋放類級別資源
tearDownModule模塊所有測試執行完畢后關閉全局資源

4.2 完整示例

import os
import unittestclass FileOperationTestCase(unittest.TestCase):temp_file = "temp_test.txt"@classmethoddef setUpClass(cls):print("? 準備測試文件...")with open(cls.temp_file, "w") as f:f.write("initial content")def setUp(self):print("  → 每個測試前重置文件內容")with open(self.temp_file, "w") as f:f.write("")  # 清空文件def test_write_content(self):with open(self.temp_file, "a") as f:f.write("line1\n")self.assertTrue(os.path.exists(self.temp_file))def test_append_content(self):with open(self.temp_file, "a") as f:f.write("line2\n")with open(self.temp_file) as f:self.assertEqual(f.read(), "line2\n")  # 驗證清空操作是否生效@classmethoddef tearDownClass(cls):print("? 刪除測試文件")os.remove(cls.temp_file) if os.path.exists(cls.temp_file) else Noneif __name__ == "__main__":unittest.main()

輸出順序

? 準備測試文件...→ 每個測試前重置文件內容
test_write_content ... ok→ 每個測試前重置文件內容
test_append_content ... ok
? 刪除測試文件

5. 測試跳過機制

5.1 裝飾器應用

import unittest
import platformclass PlatformTestCase(unittest.TestCase):@unittest.skipIf(platform.system() == "Windows", "Windows系統暫不支持")def test_linux_feature(self):print("僅在Linux下運行的測試")@unittest.skipUnless(hasattr(os, "symlink"), "系統不支持符號鏈接")def test_symlink(self):print("符號鏈接測試")@unittest.skip("功能重構中,暫不測試")def test_deprecated_feature(self):print("已棄用功能測試")

執行結果

s (skipped) ... skipped 'Windows系統暫不支持'
s (skipped) ... skipped '系統不支持符號鏈接'
s (skipped) ... skipped '功能重構中,暫不測試'

6. 總結與建議

  1. 測試設計原則
  • 每個測試方法只驗證一個功能點
  • 使用有意義的測試名稱(如test_add_positive而非test1
  • 優先使用setUp/tearDown而非重復代碼
  1. 擴展方向
  • 數據庫測試:結合unittest.mock模擬數據庫連接
  • 參數化測試:使用pytest.mark.parametrizeparameterized
  • 集成測試:通過subTest實現測試數據驅動
  1. 工具鏈建議
  • 簡單項目:直接使用unittest
  • 復雜項目:遷移至pytest(支持更簡潔的語法和插件生態)
  • 持續集成:結合tox實現多Python版本測試

通過以上結構化講解,讀者可系統掌握unittest的核心用法,并逐步向更復雜的測試場景擴展。

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

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

相關文章

【Python 實戰】---- 使用Python批量將 .ncm 格式的音頻文件轉換為 .mp3 格式

1. 前言 .ncm 格式是網易云音樂專屬的加密音頻格式,用于保護版權。這種格式無法直接播放,需要解密后才能轉換為常見的音頻格式。本文將介紹如何使用 Python 批量將 .ncm 格式的音頻文件轉換為 .mp3 格式。 2. 安裝 ncmdump ncmdump 是一個專門用于解密 .ncm 文件的工具。它…

Linux 學習筆記2

Linux 學習筆記2 一、定時任務調度操作流程注意事項 二、磁盤分區與管理添加新硬盤流程磁盤管理命令 三、進程管理進程操作命令服務管理(Ubuntu) 四、注意事項 一、定時任務調度 操作流程 創建腳本 vim /path/to/script.sh # 編寫腳本內容設置可執行權…

YOLO目標檢測算法

文章目錄 前言一、目標檢測算法簡介1、傳統目標檢測算法(1)R-CNN算法簡介(2)Fast R-CNN算法簡介(3)Faster R-CNN算法簡介 2、目標檢測中的算法設計范式(1)one-stage(2&am…

【軟件設計師:軟件】20.軟件設計概述

一、軟件設計基本原則 一、軟件設計基本原則 1. 模塊 是指執行某一特定任務的數據結構和程序代碼。 將模塊的接口和功能定義為其外部特性將模塊的局部數據和實現該模塊的程序代碼稱為內部特性。在模塊設計時,最重要的原則就是實現信息隱蔽和模塊獨立。 2 . 信息隱蔽 將每…

軟件工程之面向對象分析深度解析

前文基礎: 1.軟件工程學概述:軟件工程學概述-CSDN博客 2.軟件過程深度解析:軟件過程深度解析-CSDN博客 3.軟件工程之需求分析涉及的圖與工具:軟件工程之需求分析涉及的圖與工具-CSDN博客 4.軟件工程之形式化說明技術深度解…

需求分析階段測試工程師主要做哪些事情

在軟件測試需求分析階段,主要圍繞確定測試范圍、明確測試目標、細化測試內容等方面開展工作,為后續測試計劃的制定、測試用例的設計以及測試執行提供清晰、準確的依據。以下是該階段具體要做的事情: 1. 需求收集與整理 收集需求文檔&#x…

vLLM部署Qwen2-7B模型推理

vllm簡介 vLLM是一個高效的大語言模型推理和部署服務系統,專為大型語言模型的高效執行而設計。它不僅支持多種量化技術以減少模型大小和加速推理過程,還提供了與OpenAI API兼容的服務接口,使得現有的應用程序能夠無縫對接。 一、前提環境 …

【STM32 學習筆記】GPIO輸入與輸出

GPIO詳解 一、GPIO基本概念 GPIO(通用輸入輸出)是微控制器與外部設備交互的核心接口,具有以下特性: 可編程控制輸入/輸出模式支持數字信號的讀取與輸出集成多種保護機制復用功能支持片上外設連接 二、GPIO位結構解析 2.1 保護二…

安科瑞光伏綜自系統在新能源電站中的應用及調度上傳方案研究

摘要 隨著全球對清潔能源需求的不斷增長,光伏發電作為一種可持續的能源解決方案,正迅速發展。光伏綜合自動化系統(綜自系統)在確保光伏電站高效、穩定運行方面起著關鍵作用。本文詳細介紹了安科瑞光伏綜自系統,包括其背…

[python] 函數2-匿名函數

一 匿名函數 格式: 函數名 lambda 形參 : 返回值(表達式) 調用: 結果 函數名(實參) 一般只有一行代碼,他是對def定義函數的一種簡化,只能實現簡單的邏輯 邏輯復雜時不要使用lambda add lambda a,b: ab # a,b就是形參 print(add(2,5)) 1.1 無參數 noargs_func lambda…

深入理解C/C++內存管理:從基礎到高級優化實踐

一、內存區域劃分與基礎管理機制?? ??棧(Stack)?? 棧由系統自動管理,用于存儲函數調用時的局部變量、參數及返回地址。其特點是高效但空間有限(通常1-8MB),遵循后進先出(LIFO)…

kafka 面試總結

Kafka的冪等性是一種機制,確保生產者發送的每條消息在Broker端只被持久化一次,即使生產者因網絡問題等原因重試發送,也不會導致消息重復。 實現原理 生產者ID(PID) 每個生產者實例在初始化時,會被分配一個…

uniapp|實現多終端聊天對話組件、表情選擇、消息發送

基于UniApp框架,實現跨平臺多終端適配的聊天對話組件開發、表情選擇交互設計及消息發送,支持文本與表情混合渲染。 目錄 聊天界面靜態組件實現消息列表布局消息氣泡雙向布局輔助元素定位與樣式靜態數據模擬與擴展性設計表情選擇器靜態模塊浮層實現符號網格排列多端樣式適配方…

LabVIEW超聲波液位計檢定

在工業生產、運輸和存儲等環節,液位計的應用十分廣泛,其中超聲波液位計作為非接觸式液位測量設備備受青睞。然而,傳統立式水槽式液位計檢定裝置存在受建筑高度影響、量程范圍受限、流程耗時長等問題,無法滿足大量程超聲波液位計的…

C++漫步結構與平衡的殿堂:AVL樹

文章目錄 1.AVL樹的概念2.AVL樹的結構3.AVL樹的插入4.AVL樹的旋轉4.1 左單旋4.2 右單旋4.3 右左雙旋4.4 左右雙旋 5.AVL樹的刪除6.AVL樹的高度7.AVL樹的平衡判斷希望讀者們多多三連支持小編會繼續更新你們的鼓勵就是我前進的動力! 二叉搜索樹有其自身的缺陷&#xf…

Verilog Test Fixture 時鐘激勵

1、占空比50%時鐘產生 always begin<clock> 1b0 ;#<PERIOD/2> ;<clock> 1b1 ;#<PERIOD/2> ; end reg <clock> 1b0 ;alwaysbegin#<PERIOD/2> ;<clock> ~<clock> ;end 2…

從人體姿態到機械臂軌跡:基于深度學習的Kinova遠程操控系統架構解析

在工業自動化、醫療輔助、災難救援與太空探索等前沿領域&#xff0c;Kinova輕型機械臂憑借7自由度關節設計和出色負載能力脫穎而出。它能精準完成物體抓取、復雜裝配和精細操作等任務。然而&#xff0c;實現人類操作者對Kinova機械臂的直觀高效遠程控制一直是技術難題。傳統遠程…

探秘數據中臺:五大核心平臺的功能全景解析

數據中臺作為企業數據資產的 “智慧中樞”&#xff0c;通過整合數據處理全流程的核心功能&#xff0c;實現數據價值的深度挖掘與高效應用。以下從五大核心平臺出發&#xff0c;全面拆解數據中臺的功能架構與應用價值。 一、數據可視化平臺&#xff1a;讓數據 “開口說話” 1.…

深度 |提“智”向新,奔向未來——當前機器人產業觀察

機器人踏著“貓步”在T臺走秀、進入工廠協助造車&#xff0c;教育、醫療、城市管理等領域都有了機器人的幫助……今天&#xff0c;機器人已得到廣泛應用&#xff0c;走進你我的生活。 ?? 伴隨著技術日新月異&#xff0c;機器人產業加快提“智”向新。特別是今年以來&#xf…

橋隧坡災害監測報警:用科技筑起生命安全的“智能防線”

.2024年&#xff0c;梅大高速茶陽路段高邊坡塌方事件造成重大傷亡&#xff0c;舉國痛心。這場悲劇再次敲響警鐘&#xff1a;橋梁、隧道、邊坡等高風險區域的實時監測與精準報警&#xff0c;已成為交通安全的生命線。如何用技術手段在災害發生前“搶跑”&#xff0c;第一時間阻斷…