詳細分析Python中的unittest測試框架

目錄

  • 1. 基本知識
  • 2. API
    • 2.1 斷言
    • 2.2 setUp() 和 tearDown()
  • 3. Demo

1. 基本知識

unittest 是 Python 標準庫中的一個單元測試框架,用于編寫和執行測試用例以驗證代碼的正確性

提供了一種結構化的方法來編寫測試,使得測試代碼更加模塊化和易于維護

以下是對 unittest 的詳細分析和示例:

概念:

  • 測試用例(Test Case):測試代碼的最小單元,通常對應于要測試的函數、方法或類的特定行為或功能
    測試用例是獨立的,不依賴于其他測試用例的執行順序

  • 測試套件(Test Suite):一組相關的測試用例的集合
    可以使用測試套件來組織和運行一系列相關的測試

  • 測試運行器(Test Runner):用于執行測試用例或測試套件的組件
    unittest 提供了一個默認的測試運行器來運行測試

  • 斷言(Assertion):在測試用例中用于判斷實際結果與預期結果是否相符的表達式
    如果斷言失敗,測試用例將會失敗

  • 設置(Setup)和清理(Teardown):在執行測試用例之前或之后執行的代碼
    使用 setUp() 方法在每個測試用例執行前進行設置操作
    使用 tearDown() 方法在每個測試用例執行后進行清理操作

作用:

  • 自動化測試:通過編寫測試用例,可以自動化地驗證代碼的正確性,提高代碼的質量和穩定性
  • 回歸測試:在修改或更新代碼后,可以運行測試用例來確保修改不會破壞現有功能
  • 文檔化:測試用例也可以作為代碼的文檔,說明每個函數或方法應該如何被正確使用

2. API

在編寫單元測試時,通常會遵循一些規范和最佳實踐,以確保測試的可讀性、可維護性和準確性

以下是一些常見的單元測試規范要求:

  1. 測試用例命名規范:測試用例的命名應該清晰明了,描述被測試函數或方法的行為
    通常采用test_<functionality>的命名方式,例如test_add_positive_numberstest_add_negative_numbers

  2. 測試用例設計完整性:每個測試用例應該獨立、完整地測試一個特定的行為或情況
    不要在一個測試用例中測試多個不相關的行為

  3. 測試用例覆蓋率:盡可能覆蓋被測試代碼的各種情況,包括邊界情況、異常情況等

  4. 斷言選擇:選擇適當的斷言來驗證測試結果
    常見的斷言包括assertEqualassertTrueassertFalse

  5. 測試組織結構:通常測試用例會被組織成一個測試類,每個測試方法對應一個測試用例
    在Python中,通常使用unittest模塊來實現單元測試,可以通過繼承unittest.TestCase來創建測試類

2.1 斷言

以下是幾個常見的斷言及其使用方式:

  • assertEqual(expected, actual):用于驗證預期值和實際值是否相等
import unittestclass TestExample(unittest.TestCase):def test_addition(self):result = 2 + 2self.assertEqual(result, 4)if __name__ == '__main__':unittest.main()
  • assertTrue(condition):用于驗證條件是否為True
import unittestclass TestExample(unittest.TestCase):def test_positive_number(self):result = 10self.assertTrue(result > 0)if __name__ == '__main__':unittest.main()
  • assertFalse(condition):用于驗證條件是否為False
import unittestclass TestExample(unittest.TestCase):def test_negative_number(self):result = -10self.assertFalse(result > 0)if __name__ == '__main__':unittest.main()
  • assertRaises(exception, callable, *args, **kwargs):用于驗證是否會引發特定的異常
import unittestdef divide(x, y):return x / yclass TestExample(unittest.TestCase):def test_divide_by_zero(self):with self.assertRaises(ZeroDivisionError):divide(1, 0)if __name__ == '__main__':unittest.main()

這些斷言方法之間的區別在于它們用于驗證的條件以及驗證的方式

  • assertEqual用于檢查值是否相等
  • assertTrueassertFalse用于檢查條件是否為True或False
  • assertRaises用于驗證是否引發了特定的異常

在編寫單元測試時,根據需要選擇最適合場景的斷言方法,以確保測試的準確性和可讀性

2.2 setUp() 和 tearDown()

setUp()tearDown()unittest框架中的兩個特殊方法,用于在測試用例執行前后進行設置和清理操作

它們的作用是確保測試用例在獨立的環境中執行,從而保證測試的可靠性和可重復性

  • setUp()
    ~ 在每個測試用例執行前進行設置操作,例如初始化對象、創建臨時文件或者建立數據庫連接等
    ~ 這個方法可以在測試用例的每次執行前,提供一個統一的環境,以確保測試用例在相同的初始條件下執行。如果測試用例需要共享一些設置,setUp() 是一個很好的地方來定義它們,這樣可以避免在每個測試用例中重復代碼
  • tearDown()
    ~ 在每個測試用例執行后進行清理操作,例如關閉文件、釋放資源或者關閉數據庫連接等
    ~ 可以確保在測試用例執行后,環境得到適當的清理,以避免測試用例之間的相互影響。如果在 setUp() 中進行了一些設置,需要在 tearDown() 中進行相應的清理,以確保環境的恢復

示例代碼:

import unittestclass MyTestCase(unittest.TestCase):def setUp(self):# 設置操作,例如初始化對象self.my_list = [1, 2, 3]def tearDown(self):# 清理操作,例如釋放資源del self.my_listdef test_list_append(self):self.my_list.append(4)self.assertEqual(self.my_list, [1, 2, 3, 4])def test_list_remove(self):self.my_list.remove(2)self.assertEqual(self.my_list, [1, 3])if __name__ == '__main__':unittest.main()
  • setUp() 方法用于在每個測試用例執行前初始化了一個列表 self.my_list
  • tearDown() 方法用于在每個測試用例執行后清理了這個列表

兩個測試方法 test_list_append()test_list_remove() 分別對這個列表執行了添加和刪除操作,并通過斷言來驗證操作的正確性
setUp()tearDown() 方法確保了每個測試方法在獨立的環境中執行,不會相互影響。

3. Demo

通過簡易的Demo熟悉這個庫的基本用法

import unittestdef add(x, y):return x + yclass TestAddFunction(unittest.TestCase):def test_add_positive_numbers(self):self.assertEqual(add(1, 2), 3)self.assertEqual(add(0, 0), 0)self.assertEqual(add(-1, 1), 0)def test_add_negative_numbers(self):self.assertEqual(add(-1, -1), -2)self.assertEqual(add(-5, -7), -12)if __name__ == '__main__':unittest.main()

截圖如下:

在這里插入圖片描述

對應如果修改某個參數,讓程序報錯,截圖如下:

在這里插入圖片描述

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

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

相關文章

【ACW 服務端】頁面操作Java增刪改查代碼生成

版本: 1.2.2-JDK17-SNAPSHOT 項目地址&#xff1a;wu-smart-acw 演示地址&#xff1a;演示地址 admin/admin Java增刪改查代碼生成 找到對應菜單 選擇你需要的數據實例 選擇數據庫 選擇數據庫表 選擇客戶端&#xff08;如果是本地ACW服務代碼啟動默認注冊上的客戶端ID是…

騰訊云主機Ubuntu22.04安裝Odoo17

一、安裝PostgreSQL16 參見之前的文章 Ubuntu22.04安裝PostgreSQL-CSDN博客 二、安裝Odoo17 本方案使用的nightly版的odoo&#xff0c;安裝的都是最新版odoo wget -O - https://nightly.odoo.com/odoo.key | apt-key add - echo "deb http://nightly.odoo.com/17.0/n…

Maven【1】(命令行操作)

文章目錄 一丶創建maven工程二、理解pom.xml三、maven的構建命令1.編譯操作2.清理操作3.測試操作4.打包操作5.安裝操作 一丶創建maven工程 首先創建這樣一個目錄&#xff0c;然后從命令行里進入這個目錄&#xff1a; 然后接下來就在這個命令行里進行操作了。 這個命令是&…

Python學習筆記——PySide6設計GUI應用之UI與邏輯分離

1、打開PySide6的UI設計工具pyside6-designer&#xff0c;設計一個主窗口&#xff0c;保存文件名為testwindow.ui 2、使用PySide6的RCC工具把testwindow.ui文件轉換為testwindow_rc.py文件&#xff0c;此文件中有一個類Ui_MainWindow&#xff08;包含各種控件對象&#xff09;…

設計模式淺析(八) ·外觀模式

設計模式淺析(八) 外觀模式 日常叨逼叨 java設計模式淺析&#xff0c;如果覺得對你有幫助&#xff0c;記得一鍵三連&#xff0c;謝謝各位觀眾老爺&#x1f601;&#x1f601; 外觀模式 概念 外觀模式&#xff08;Facade Pattern&#xff09;是一種設計模式&#xff0c;它為…

深度學習發展里程碑事件2006-2024

2006-2024年&#xff0c;深度學習發展經歷眾多的里程碑事件&#xff0c;一次次地刺激著人們的神經&#xff0c;帶來巨大的興奮。電影還在繼續&#xff0c;好戲在后面&#xff0c;期待…… 2006年 深度信念網絡&#xff08;DBNs&#xff09;&#xff1a;Geoffrey Hinton與他的學…

備戰藍橋杯 Day10(背包dp)

01背包問題 1267&#xff1a;【例9.11】01背包問題 【題目描述】 一個旅行者有一個最多能裝 M&#xfffd; 公斤的背包&#xff0c;現在有 n&#xfffd; 件物品&#xff0c;它們的重量分別是W1&#xff0c;W2&#xff0c;...,Wn&#xfffd;1&#xff0c;&#xfffd;2&#…

藍橋杯刷題--python-10(2023填空題3)

0工作時長 - 藍橋云課 (lanqiao.cn) import datetime time_str_list=[] while(True):tmp=input()if not tmp: breaktime_str_list.append(tmp)# time_list=[datetime.datetime.strptime(t,"%Y-%m-%d %H:%M:%S")for t in time_str_list] time_list.sort() sum=0 for i…

【代碼隨想錄算法訓練營Day25】● 216.組合總和III ● 17.電話號碼的字母組合

文章目錄 Day 25 第七章 回溯算法part02216.組合總和III自己的思路&#xff08;?通過&#xff09; 17.電話號碼的字母組合思路代碼 Day 25 第七章 回溯算法part02 今日內容&#xff1a; ● 216.組合總和III● 17.電話號碼的字母組合 216.組合總和III 如果把 組合問題理解了…

計算機組成原理(9)----硬布線控制器

控制單元CU若想發出對應的控制信號&#xff0c;則需要以下信息&#xff1a;指令操作碼&#xff0c;目前的機器周期&#xff0c;節拍信號&#xff0c;機器狀態條件&#xff0c;根據這些信息&#xff0c;CU就能確定在這個節拍下應該發出哪些"微命令"&#xff0c;也就是…

SQL注入:使用預編譯防御SQL注入時產生的問題

目錄 前言 模擬預編譯 真正的預編譯 預編譯中存在的SQL注入 寬字節 沒有進行參數綁定 無法預編譯的位置 前言 相信學習過SQL注入的小伙伴都知道防御SQL注入最好的方法&#xff0c;就是使用預編譯也就是PDO是可以非常好的防御SQL注入的&#xff0c;但是如果錯誤的設置了…

計算機設計大賽 深度學習動物識別 - 卷積神經網絡 機器視覺 圖像識別

文章目錄 0 前言1 背景2 算法原理2.1 動物識別方法概況2.2 常用的網絡模型2.2.1 B-CNN2.2.2 SSD 3 SSD動物目標檢測流程4 實現效果5 部分相關代碼5.1 數據預處理5.2 構建卷積神經網絡5.3 tensorflow計算圖可視化5.4 網絡模型訓練5.5 對貓狗圖像進行2分類 6 最后 0 前言 &#…

從零學算法238

238.給你一個整數數組 nums&#xff0c;返回 數組 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積 。 題目數據 保證 數組 nums之中任意元素的全部前綴元素和后綴的乘積都在 32 位 整數范圍內。 請 不要使用除法&#xff0c;且在 O(n) 時間復…

Python自動化UI測試之Selenium基礎實操

1. Selenium簡介 Selenium 是一個用于 Web 應用程序測試的工具。最初是為網站自動化測試而開發的&#xff0c;可以直接運行在瀏覽器上&#xff0c;支持的瀏覽器包括 IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Googl…

SVN忽略已提交的文件(ignore,移出版本控制)

本文適用于已安裝TortoiseSVN客戶端的同學。 1、右鍵點擊要忽略的文件夾或文件&#xff0c;鼠標移到“TortoiseSVN”&#xff0c;找到“Unversion and add to ignore list”&#xff0c;選擇文件夾&#xff0c;彈出提示框確認忽略。 2、設置完忽略文件后&#xff0c;還需要做…

多維時序 | Matlab實現GRU-MATT門控循環單元融合多頭注意力多變量時間序列預測模型

多維時序 | Matlab實現GRU-MATT門控循環單元融合多頭注意力多變量時間序列預測模型 目錄 多維時序 | Matlab實現GRU-MATT門控循環單元融合多頭注意力多變量時間序列預測模型預測效果基本介紹程序設計參考資料 預測效果 基本介紹 1.多維時序 | Matlab實現GRU-MATT門控循環單元融…

【Maven】介紹、下載及安裝、集成IDEA

目錄 一、什么是Maven Maven的作用 Maven模型 Maven倉庫 二、下載及安裝 三、IDEA集成Maven 1、POM配置詳解 2、配置Maven環境 局部配置 全局設置 四、創建Maven項目 五、Maven坐標詳解 六、導入Maven項目 方式1&#xff1a;使用Maven面板&#xff0c;快速導入項目 …

React Native框架開發介紹,以及其優點

大家好&#xff0c;我是咕嚕鐵蛋&#xff0c;在今天的文章中&#xff0c;我通過科技手段和大家一起探討一下React Native框架的開發介紹以及其優點。我深知選擇合適的開發工具對于項目的成功至關重要。而React Native作為一款流行的跨平臺移動應用開發框架&#xff0c;其獨特之…

Linux并發與競爭的基本概念

一. 簡介 Linux是一個多任務操作系統&#xff0c;肯定會存在多個任務共同操作同一段內存或者設備的情況&#xff0c; 多個任務甚至中斷都能訪問的資源叫做共享資源&#xff0c;在驅動開發中要注意對共享資源的保護&#xff0c;也就是要處理對共享資源的并發訪問。比如&#xf…

【服務器數據恢復】FreeNAS+ESXi虛擬機數據恢復案例

服務器數據恢復環境&#xff1a; 一臺服務器通過FreeNAS&#xff08;本案例使用的是UFS2文件系統&#xff09;實現iSCSI存儲&#xff0c;整個UFS2文件系統作為一個文件掛載到ESXi虛擬化系統&#xff08;安裝在另外2臺服務器上&#xff09;上。該虛擬化系統一共有5臺虛擬機&…