單元測試的編寫

Python 單元測試示例

在 Python 中,通常使用 unittest 模塊來編寫單元測試。以下是一個簡單的示例:

示例代碼:calculator.py
# calculator.py
def add(a, b):return a + bdef subtract(a, b):return a - b
單元測試代碼:test_calculator.py
import unittest
from calculator import add, subtractclass TestCalculator(unittest.TestCase):def test_add(self):self.assertEqual(add(2, 3), 5)self.assertEqual(add(-1, 1), 0)self.assertEqual(add(-1, -1), -2)def test_subtract(self):self.assertEqual(subtract(10, 5), 5)self.assertEqual(subtract(-1, -1), 0)self.assertEqual(subtract(-1, 1), -2)if __name__ == '__main__':unittest.main()
運行測試

在命令行中運行以下命令:

bash復制

python -m unittest test_calculator.py

Java 單元測試示例

在 Java 中,通常使用 JUnit 框架來編寫單元測試。以下是一個簡單的示例:

示例代碼:Calculator.java
public class Calculator {public int add(int a, int b) {return a + b;}public int subtract(int a, int b) {return a - b;}
}
單元測試代碼:CalculatorTest.java
import static org.junit.Assert.assertEquals;
import org.junit.Test;public class CalculatorTest {private Calculator calculator = new Calculator();@Testpublic void testAdd() {assertEquals(5, calculator.add(2, 3));assertEquals(0, calculator.add(-1, 1));assertEquals(-2, calculator.add(-1, -1));}@Testpublic void testSubtract() {assertEquals(5, calculator.subtract(10, 5));assertEquals(0, calculator.subtract(-1, -1));assertEquals(-2, calculator.subtract(-1, 1));}
}
運行測試

如果你使用的是 Maven 項目,可以在 pom.xml 中添加 JUnit 依賴:

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope>
</dependency>

然后在命令行中運行以下命令:

mvn test

如果你使用的是 Gradle 項目,可以在 build.gradle 中添加 JUnit 依賴:

dependencies {testImplementation 'junit:junit:4.13.2'
}

然后在命令行中運行以下命令:

./gradlew test

總結

  • Python:使用 unittest 模塊編寫單元測試,通過 assertEqual 等斷言方法驗證函數的返回值。

  • Java:使用 JUnit 框架編寫單元測試,通過 assertEquals 等斷言方法驗證方法的返回值。

通過編寫單元測試,可以確保代碼的正確性,減少缺陷,并提高代碼的可維護性。

單元測試是一種軟件測試方法,用于驗證軟件中最小可測試單元(通常是函數或方法)的正確性。單元測試可以檢測多種功能,確保每個單元在各種輸入條件下都能正確運行。以下是單元測試可以檢測的一些常見功能:

單元測試的功能:

1.?功能正確性

  • 驗證功能邏輯:確保函數或方法的邏輯符合預期。

    • 示例:對于一個加法函數,確保 add(2, 3) 返回 5

  • 邊界條件:測試函數在邊界值上的行為。

    • 示例:對于一個排序函數,測試空數組、單元素數組和大量元素數組的排序結果。

  • 異常處理:驗證函數在異常輸入下的行為。

    • 示例:對于一個除法函數,確保在除數為零時拋出 ArithmeticError

2.?性能

  • 執行時間:測試函數的執行時間是否在預期范圍內。

    • 示例:確保一個排序函數在大數據集上的執行時間不超過特定閾值。

  • 資源使用:測試函數對系統資源(如內存、CPU)的使用情況。

    • 示例:確保一個內存密集型函數不會導致內存泄漏。

3.?接口和契約

  • 輸入驗證:驗證函數是否正確處理各種輸入類型和格式。

    • 示例:對于一個 JSON 解析函數,確保它能正確處理合法和非法的 JSON 字符串。

  • 輸出驗證:驗證函數的輸出是否符合預期格式和內容。

    • 示例:對于一個日期格式化函數,確保輸出的日期字符串符合指定的格式。

4.?錯誤處理

  • 錯誤拋出:驗證函數在錯誤情況下是否拋出正確的異常。

    • 示例:對于一個文件讀取函數,確保在文件不存在時拋出 FileNotFoundException

  • 錯誤恢復:驗證函數在錯誤情況下是否能正確恢復。

    • 示例:對于一個網絡請求函數,確保在請求失敗后能重試或返回錯誤信息。

5.?邊界條件

  • 最小值和最大值:測試函數在輸入值的邊界條件下的行為。

    • 示例:對于一個整數加法函數,測試其在 INT_MININT_MAX 時的行為。

  • 空值和默認值:測試函數在輸入為空或默認值時的行為。

    • 示例:對于一個字符串處理函數,測試其在輸入為空字符串時的行為。

6.?并發和線程安全

  • 并發執行:測試函數在多線程環境下的行為。

    • 示例:對于一個共享資源訪問函數,確保在多線程訪問時不會出現數據競爭或死鎖。

  • 線程安全:驗證函數是否在多線程環境下保持線程安全。

    • 示例:對于一個線程安全的隊列實現,確保在多線程環境下不會出現數據丟失或重復。

7.?兼容性

  • 向后兼容性:驗證函數在新版本中是否保持向后兼容。

    • 示例:對于一個 API 函數,確保在新版本中調用舊版本的代碼不會失敗。

  • 跨平臺兼容性:測試函數在不同操作系統或環境下的行為。

    • 示例:對于一個文件路徑處理函數,確保在 Windows 和 Linux 系統上都能正確處理路徑。

8.?安全

  • 輸入驗證:驗證函數是否正確處理惡意輸入,防止注入攻擊。

    • 示例:對于一個 SQL 查詢函數,確保在輸入包含 SQL 注入代碼時不會執行非法查詢。

  • 權限檢查:驗證函數是否正確處理權限問題。

    • 示例:對于一個文件寫入函數,確保只有具有寫入權限的用戶才能執行寫入操作。

9.?日志和監控

  • 日志記錄:驗證函數是否正確記錄日志信息。

    • 示例:對于一個錯誤處理函數,確保在發生錯誤時記錄詳細的錯誤日志。

  • 監控指標:驗證函數是否正確生成監控指標。

    • 示例:對于一個性能敏感的函數,確保在執行時生成性能監控指標。

10.?依賴關系

  • 依賴注入:驗證函數是否正確處理依賴注入。

    • 示例:對于一個依賴數據庫連接的函數,確保在注入不同的數據庫連接時能正確執行。

  • 外部服務:驗證函數是否正確處理外部服務的調用。

    • 示例:對于一個調用外部 API 的函數,確保在外部服務返回不同響應時能正確處理。

示例代碼

以下是一個簡單的 Python 示例,展示如何編寫單元測試來檢測多種功能:

示例代碼:calculator.py
def add(a, b):return a + bdef subtract(a, b):if b > a:raise ValueError("Subtraction result cannot be negative")return a - b
單元測試代碼:test_calculator.py
import unittest
from calculator import add, subtractclass TestCalculator(unittest.TestCase):def test_add(self):self.assertEqual(add(2, 3), 5)self.assertEqual(add(-1, 1), 0)self.assertEqual(add(-1, -1), -2)def test_subtract(self):self.assertEqual(subtract(10, 5), 5)self.assertEqual(subtract(1, 1), 0)with self.assertRaises(ValueError):subtract(1, 2)def test_add_performance(self):import timestart_time = time.time()add(1000000, 2000000)end_time = time.time()self.assertLess(end_time - start_time, 0.001)  # 確保執行時間小于 1 毫秒if __name__ == '__main__':unittest.main()

總結

單元測試可以檢測多種功能,包括功能正確性、性能、接口和契約、錯誤處理、邊界條件、并發和線程安全、兼容性、安全、日志和監控以及依賴關系。通過編寫全面的單元測試,可以確保代碼的正確性、穩定性和可維護性。

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

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

相關文章

大模型學習:從零到一實現一個BERT微調

目錄 一、準備階段 1.導入模塊 2.指定使用的是GPU還是CPU 3.加載數據集 二、對數據添加詞元和分詞 1.根據BERT的預訓練&#xff0c;我們要將一個句子的句頭添加[CLS]句尾添加[SEP] 2.激活BERT詞元分析器 3.填充句子為固定長度 代碼解釋&#xff1a; 三、數據處理 1.…

10組時尚復古美學自然冷色調肖像電影照片調色Lightroom預設 De La Mer – Nautical Lightroom Presets

De La Mer 預設系列包含 10 種真實的調色預設&#xff0c;適用于肖像、時尚和美術。為您的肖像攝影帶來電影美學和個性&#xff01; De La Mer 預設非常適合專業人士和業余愛好者&#xff0c;可在桌面或移動設備上使用&#xff0c;為您的攝影項目提供輕松的工作流程。這套包括…

SDL多窗口多線程渲染技術解析

SDL多窗口多線程渲染技術解析 技術原理 SDL多線程模型與窗口管理 SDL通過SDL_Thread結構體實現跨平臺線程管理。在多窗口場景中,每個窗口需關聯獨立的渲染器,且建議遵循以下原則: 窗口與渲染器綁定:每個窗口創建時生成專屬渲染器(SDL_CreateRenderer),避免跨線程操作…

QT 跨平臺發布指南

一、Windows 平臺發布 1. 使用 windeployqt 工具 windeployqt --release --no-compiler-runtime your_app.exe 2. 需要包含的文件 應用程序 .exe 文件 Qt5Core.dll, Qt5Gui.dll, Qt5Widgets.dll 等 Qt 庫 platforms/qwindows.dll 插件 styles/qwindowsvistastyle.dll (如果使…

L2-037 包裝機 (分數25)(詳解)

題目鏈接——L2-037 包裝機 問題分析 這個題目就是模擬了物品在傳送帶和筐之間的傳送過程。傳送帶用隊列模擬&#xff0c;筐用棧模擬。 輸入 3 4 4 GPLT PATA OMSA 3 2 3 0 1 2 0 2 2 0 -1輸出 根據上述操作&#xff0c;輸出的物品順序是&#xff1a; MATA樣例分析 初始…

機器學習的一百個概念(4)下采樣

前言 本文隸屬于專欄《機器學習的一百個概念》&#xff0c;該專欄為筆者原創&#xff0c;引用請注明來源&#xff0c;不足和錯誤之處請在評論區幫忙指出&#xff0c;謝謝&#xff01; 本專欄目錄結構和參考文獻請見[《機器學習的一百個概念》 ima 知識庫 知識庫廣場搜索&…

qt6下配置qopengl

qt部件選擇 Qt 6&#xff1a;需要手動選擇 Qt Shader Tools 和 Qt 5 Compatibility Module&#xff08;如果需要兼容舊代碼&#xff09; cmake文件 cmake_minimum_required(VERSION 3.16) # Qt6 推薦最低 CMake 3.16 project(myself VERSION 0.1 LANGUAGES CXX)set(CMAKE_A…

數據安全系列4:密碼技術的應用-接口調用的身份識別

傳送門 數據安全系列1&#xff1a;開篇 數據安全系列2&#xff1a;單向散列函數概念 數據安全系列3&#xff1a;密碼技術概述 什么是認證&#xff1f; 一談到認證&#xff0c;多數人的反應可能就是"用戶認證" 。就是應用系統如何識別用戶的身份&#xff0c;直接…

STL之map和set

1. 關聯式容器 vector、list、deque、 forward_list(C11)等&#xff0c;這些容器統稱為序列式容器&#xff0c;因為其底層為線性序列的數據結構&#xff0c;里面存儲的是元素本身。 關聯式容器也是用來存儲數據的&#xff0c;與序列式容器不同的是&#xff0c;其里面存儲的是結…

Vue3 其它API Teleport 傳送門

Vue3 其它API Teleport 傳送門 在定義一個模態框時&#xff0c;父組件的filter屬性會影響子組件的position屬性&#xff0c;導致模態框定位錯誤使用Teleport解決這個問題把模態框代碼傳送到body標簽下

C++練習

1.將File練習題&#xff0c;內部的FILE*描述符&#xff0c;改成int描述符 2。寫一個類Fifo管道類。提高難度&#xff0c;什么都不提示。只要求&#xff1a;使用自己編寫的Fifo類對象&#xff0c;實現2個終端之間互相聊天 file.cpp #include <iostream> #include <c…

《Python Web網站部署應知應會》No4:基于Flask的調用AI大模型的高性能博客網站的設計思路和實戰(上)

基于Flask的調用AI大模型的高性能博客網站的設計思路和實戰&#xff08;上&#xff09; 摘要 本文詳細探討了一個基于Flask框架的高性能博客系統的設計與實現&#xff0c;該系統集成了本地AI大模型生成內容的功能。我們重點關注如何在高并發、高負載狀態下保持系統的高性能和…

實現一個簡易版的前端監控 SDK

【簡易版的前端監控系統】 1、Promise的錯誤如何監控&#xff1f;–promise不是所有都是接口請求 2、接口的報錯如何監控&#xff1f;–全局監控sdk&#xff0c;不改動公共的請求方法、不改動業務代碼&#xff1b;一般接口使用axios請求 3、資源的報錯如何監控&#xff1f; 4、…

【操作系統】軟中斷vs硬中斷

在操作系統中&#xff0c;中斷&#xff08;Interrupt&#xff09; 是 CPU 響應外部事件的重要機制&#xff0c;分為 硬中斷&#xff08;Hardware Interrupt&#xff09; 和 軟中斷&#xff08;Software Interrupt&#xff09;。它們的核心區別在于 觸發方式 和 處理機制。 1. 硬…

力扣刷題-熱題100題-第27題(c++、python)

21. 合并兩個有序鏈表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/merge-two-sorted-lists/description/?envTypestudy-plan-v2&envIdtop-100-liked 常規法 創建一個新鏈表&#xff0c;遍歷list1與list2&#xff0c;將新鏈表指向list1與list2…

Python包下載路徑 Chrome用戶數據 修改到非C盤

查看 site-packages 是否能通過命令行完成&#xff1f; 可以&#xff0c;使用以下命令&#xff08;不需寫腳本&#xff09;&#xff1a; python -m site輸出包含&#xff1a; sys.path site-packages 路徑&#xff08;全局和用戶級&#xff09; 如果只想看安裝路徑&#…

【鴻蒙5.0】鴻蒙登錄界面 web嵌入(隱私頁面加載)

在鴻蒙應用中嵌入 Web 頁面并加載隱私頁面&#xff0c;可借助 WebView 組件來實現。以下是一個完整示例&#xff0c;展示如何在鴻蒙 ArkTS 里嵌入 Web 頁面并加載隱私政策頁面。 在 HarmonyOS 應用開發中&#xff0c;如果你希望嵌入一個網頁&#xff0c;并且特別關注隱私頁面加…

AI加Python的文本數據情感分析流程效果展示與代碼實現

本文所使用數據來自于梯田景區評價數據。 一、數據預處理 數據清洗 去除重復值、空值及無關字符(如表情符號、特殊符號等)。 提取中文文本,過濾非中文字符。 統一文本格式(如全角轉半角、繁體轉簡體)。 中文分詞與去停用詞 使用 jieba 分詞工具進行分詞。 加載自定義詞…

Microi吾碼界面設計引擎之基礎組件用法大全【內置組件篇·上】

&#x1f380;&#x1f380;&#x1f380; microi-pageengine 界面引擎系列 &#x1f380;&#x1f380;&#x1f380; 一、Microi吾碼&#xff1a;一款高效、靈活的低代碼開發開源框架【低代碼框架】 二、Vue3項目快速集成界面引擎 三、Vue3 界面設計插件 microi-pageengine …

【多線程】單例模式和阻塞隊列

目錄 一.單例模式 1. 餓漢模式 2. 懶漢模式 二.阻塞隊列 1. 阻塞隊列的概念 2. BlockingQueue接口 3.生產者-消費者模型 4.模擬生產者-消費者模型 一.單例模式 單例模式&#xff08;Singleton Pattern&#xff09;是一種常用的軟件設計模式&#xff0c;其核心思想是確保…