編程與數學 02-017 Python 面向對象編程 23課題、測試面向對象的程序

編程與數學 02-017 Python 面向對象編程 23課題、測試面向對象的程序

  • 一、單元測試(Unit Testing)
        • 使用 `unittest` 模塊
        • 使用 `pytest`
  • 二、集成測試(Integration Testing)
  • 三、模擬對象(Mocking)
  • 四、測試驅動開發(TDD)
  • 五、測試覆蓋率
  • 六、持續集成(CI)
  • 全文總結

摘要:本文介紹了 Python 面向對象編程中的測試方法,包括單元測試、集成測試、模擬對象、測試驅動開發、測試覆蓋率和持續集成。通過詳細示例,展示了如何使用 unittestpytest 進行單元測試,如何進行集成測試和模擬外部依賴,以及如何通過 TDD 方法開發代碼。同時,介紹了如何使用 coverage 工具測量測試覆蓋率,并通過 CI 工具實現自動化測試流程。這些方法有助于提高代碼質量,確保軟件的穩定性和可靠性。

關鍵詞:Python,面向對象編程,單元測試,集成測試,模擬對象,測試驅動開發,測試覆蓋率,持續集成

人工智能助手:Kimi


一、單元測試(Unit Testing)

單元測試是對程序中的最小可測試部分(通常是函數或方法)進行測試。Python 提供了內置的 unittest 模塊,用于編寫和運行單元測試。

使用 unittest 模塊

unittest 是 Python 的標準測試框架,提供了豐富的測試功能。

示例代碼
假設我們有一個簡單的類 Calculator,我們想對其進行單元測試。

# calculator.py
class Calculator:def add(self, a, b):return a + bdef subtract(self, a, b):return a - bdef multiply(self, a, b):return a * bdef divide(self, a, b):if b == 0:raise ValueError("Cannot divide by zero")return a / b

接下來,我們使用 unittest 編寫測試代碼:

# test_calculator.py
import unittest
from calculator import Calculatorclass TestCalculator(unittest.TestCase):def setUp(self):self.calc = Calculator()def test_add(self):self.assertEqual(self.calc.add(1, 2), 3)def test_subtract(self):self.assertEqual(self.calc.subtract(5, 3), 2)def test_multiply(self):self.assertEqual(self.calc.multiply(4, 3), 12)def test_divide(self):self.assertEqual(self.calc.divide(10, 2), 5)def test_divide_by_zero(self):with self.assertRaises(ValueError):self.calc.divide(10, 0)if __name__ == "__main__":unittest.main()

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

python -m unittest test_calculator.py

如果所有測試通過,會輸出類似以下內容:

....
----------------------------------------------------------------------
Ran 4 tests in 0.001sOK
使用 pytest

pytest 是一個第三方測試框架,提供了更簡潔的語法和更強大的功能,如自動發現測試用例、參數化測試等。

安裝 pytest

pip install pytest

示例代碼
使用 pytest 編寫測試代碼:

# test_calculator.py
from calculator import Calculatordef test_add():calc = Calculator()assert calc.add(1, 2) == 3def test_subtract():calc = Calculator()assert calc.subtract(5, 3) == 2def test_multiply():calc = Calculator()assert calc.multiply(4, 3) == 12def test_divide():calc = Calculator()assert calc.divide(10, 2) == 5def test_divide_by_zero():calc = Calculator()with pytest.raises(ValueError):calc.divide(10, 0)

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

pytest test_calculator.py

如果所有測試通過,會輸出類似以下內容:

============================= test session starts ==============================
platform linux -- Python 3.x.x, pytest-7.x.x, pluggy-1.x.x
rootdir: /path/to/your/project
collected 5 itemstest_calculator.py .....                                                   [100%]============================== 5 passed in 0.01s ===============================

二、集成測試(Integration Testing)

集成測試是測試多個模塊或組件之間的交互。它確保各個模塊在集成后能夠正常工作。

示例
假設我們有兩個類 DatabaseUserManager,它們之間有交互,我們想測試它們的集成。

# database.py
class Database:def __init__(self):self.users = {}def add_user(self, user_id, user_data):self.users[user_id] = user_datadef get_user(self, user_id):return self.users.get(user_id)# user_manager.py
from database import Databaseclass UserManager:def __init__(self, db):self.db = dbdef create_user(self, user_id, user_data):self.db.add_user(user_id, user_data)def get_user(self, user_id):return self.db.get_user(user_id)

集成測試代碼

# test_integration.py
import unittest
from user_manager import UserManager
from database import Databaseclass TestIntegration(unittest.TestCase):def setUp(self):self.db = Database()self.user_manager = UserManager(self.db)def test_create_and_get_user(self):user_id = "user123"user_data = {"name": "John Doe", "email": "john@example.com"}self.user_manager.create_user(user_id, user_data)retrieved_user = self.user_manager.get_user(user_id)self.assertEqual(retrieved_user, user_data)if __name__ == "__main__":unittest.main()

三、模擬對象(Mocking)

在測試中,我們經常需要模擬某些對象的行為,尤其是那些依賴外部資源的對象(如數據庫、網絡服務等)。Python 的 unittest.mock 模塊提供了強大的模擬功能。

示例
假設我們有一個類 EmailService,它依賴于一個外部的郵件發送服務。

# email_service.py
import smtplibclass EmailService:def send_email(self, to_address, subject, body):with smtplib.SMTP("smtp.example.com") as server:server.sendmail("from@example.com", to_address, f"Subject: {subject}\n\n{body}")

我們可以在測試中模擬 smtplib.SMTP 的行為:

# test_email_service.py
import unittest
from unittest.mock import patch, MagicMock
from email_service import EmailServiceclass TestEmailService(unittest.TestCase):@patch("smtplib.SMTP")def test_send_email(self, mock_smtp):email_service = EmailService()email_service.send_email("to@example.com", "Test Subject", "Test Body")mock_smtp.assert_called_once_with("smtp.example.com")mock_smtp.return_value.sendmail.assert_called_once_with("from@example.com", "to@example.com", "Subject: Test Subject\n\nTest Body")if __name__ == "__main__":unittest.main()

四、測試驅動開發(TDD)

測試驅動開發(TDD)是一種開發方法,它要求在編寫實際代碼之前先編寫測試代碼。TDD 的核心步驟是:

  1. 編寫測試:編寫一個失敗的測試用例。
  2. 編寫代碼:編寫足夠的代碼以使測試通過。
  3. 重構:優化代碼,確保測試仍然通過。

示例
假設我們要開發一個簡單的 Stack 類,使用 TDD 的方式開發:

  1. 編寫測試
# test_stack.py
import unittest
from stack import Stackclass TestStack(unittest.TestCase):def test_push_and_pop(self):stack = Stack()stack.push(1)stack.push(2)self.assertEqual(stack.pop(), 2)self.assertEqual(stack.pop(), 1)def test_empty(self):stack = Stack()self.assertTrue(stack.is_empty())stack.push(1)self.assertFalse(stack.is_empty())if __name__ == "__main__":unittest.main()
  1. 編寫代碼
# stack.py
class Stack:def __init__(self):self.items = []def push(self, item):self.items.append(item)def pop(self):if not self.is_empty():return self.items.pop()raise IndexError("pop from empty stack")def is_empty(self):return len(self.items) == 0
  1. 運行測試
    運行測試確保所有測試通過。

五、測試覆蓋率

測試覆蓋率是指被測試代碼中被執行的代碼比例。高覆蓋率意味著更多的代碼被測試覆蓋,從而減少潛在的錯誤。Python 的 coverage 工具可以幫助我們測量測試覆蓋率。

安裝 coverage

pip install coverage

運行測試并生成覆蓋率報告

coverage run -m unittest test_calculator.py
coverage report

這將生成一個覆蓋率報告,顯示每個文件的測試覆蓋率。

六、持續集成(CI)

持續集成是一種軟件開發實踐,團隊成員頻繁地將代碼集成到共享存儲庫中。每次集成都會通過自動化構建和測試來驗證代碼。常見的 CI 工具有 Jenkins、GitHub Actions、GitLab CI 等。

示例
在 GitHub Actions 中設置 CI 流程:

# .github/workflows/ci.yml
name: CIon: [push, pull_request]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v3- name: Set up Pythonuses: actions/setup-python@v4with:python-version: '3.x'- name: Install dependenciesrun: |python -m pip install --upgrade pippip install pytest coverage- name: Run testsrun: |pytest --cov=.- name: Upload coverage to Codecovuses: codecov/codecov-action@v3

全文總結

本文全面介紹了 Python 面向對象編程中的測試方法,旨在幫助開發者提高代碼質量和軟件穩定性。首先,單元測試通過 unittestpytest 框架對代碼中的最小單元(如函數或方法)進行驗證,確保其按預期工作。集成測試則關注多個模塊或組件之間的交互,通過示例展示了如何測試 DatabaseUserManager 的集成。模擬對象部分通過 unittest.mock 模塊展示了如何模擬外部依賴,例如模擬郵件發送服務。測試驅動開發(TDD)部分通過開發一個簡單的 Stack 類,展示了編寫測試用例、實現代碼并通過測試的完整流程。測試覆蓋率部分介紹了如何使用 coverage 工具測量代碼的測試覆蓋率,確保更多代碼被測試覆蓋。最后,持續集成(CI)部分通過 GitHub Actions 的示例,展示了如何實現自動化構建和測試流程。這些測試方法和工具的結合使用,為 Python 面向對象編程提供了強大的質量保障手段。

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

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

相關文章

[React]Antd Cascader組件地區選擇

前言表單中添加一個地區選擇功能&#xff0c;要求支持增刪改查功能。Cascader 使用Cascader組件動態加載地區選項。使用 loadData 實現動態加載選項&#xff0c;&#xff08;loadData 與 showSearch 無法一起使用&#xff09;。 這里使用了Form.Item組件。 <Form.Itemlabel{…

深度學習-----《PyTorch神經網絡高效訓練與測試:優化器對比、激活函數優化及實戰技巧》

一、訓練過程并行批量訓練機制一次性輸入64個批次數據&#xff0c;創建64個獨立神經網絡并行訓練。所有網絡共享參數&#xff08;Ω&#xff09;&#xff0c;更新時計算64個批次的平均損失&#xff0c;統一更新全局參數。梯度更新策略使用torch.no_grad()上下文管理器清理反向傳…

Matplotlib 可視化大師系列(五):plt.pie() - 展示組成部分的餅圖

目錄Matplotlib 可視化大師系列博客總覽Matplotlib 可視化大師系列&#xff08;五&#xff09;&#xff1a;plt.pie() - 展示組成部分的餅圖一、 餅圖是什么&#xff1f;何時使用&#xff08;何時避免&#xff09;&#xff1f;二、 函數原型與核心參數三、 從入門到精通&#x…

C++ Core Guidelines 核心理念

引言 C 是一門功能強大但復雜性極高的編程語言。為了幫助開發者更高效、安全地使用現代 C&#xff0c;C 核心指南&#xff08;CppCoreGuidelines&#xff09;應運而生。這份由 C 之父 Bjarne Stroustrup 等人主導的指南&#xff0c;提供了大量關于 C 編碼的規則、最佳實踐和設…

vue3 - 組件間的傳值

組件間傳參 父傳子v-on/props 父組件使用v-on:綁定要傳的參數:parentData"parentData"&#xff1a; <template><div><Child1 :parentData"parentData"></Child1></div> </template> <script setup lang"ts…

Kafka 在 6 大典型用例的落地實踐架構、參數與避坑清單

一、選型速查表場景關鍵目標推薦清單&#xff08;示例&#xff09;消息&#xff08;Messaging&#xff09;解耦、低延遲、可靠投遞acksall、enable.idempotencetrue、retries>0、min.insync.replicas2、合理分區鍵、DLT網站活動追蹤吞吐極高、可回放主題按類型拆分&#xff…

Node.js(1)—— Node.js介紹與入門

前面我們談到一些前端開發的內容&#xff0c;學習了HTML、css和JavaScript&#xff0c;已經掌握了如何編寫一些簡單功能的網頁。但是只屬于前端部分&#xff0c;我們只能在本地打開文件進行瀏覽&#xff0c;不能讓其他人打開我們編寫的網站&#xff1b;這時就需要后端部分上場了…

Python辦公——爬蟲百度翻譯網頁版(自制翻譯小工具——進階更新版)

目錄 專欄導讀 前言 項目概述 功能特點 技術棧 核心架構設計 類結構設計 界面布局設計 核心功能實現 1. 智能語言檢測 2. 異步翻譯處理 3. HTTP請求處理 4. 結果解析與顯示 界面設計亮點 1. 響應式布局 2. 用戶體驗優化 3. 現代化組件 技術難點與解決方案 1. 跨線程UI更新 2. U…

CentOS7 + Docker 部署 Dify 超詳細圖文教程

如今Agent在互聯網上大行其道&#xff0c;網上吵得火熱&#xff0c;各個企業也都想搭建自己的Agent。COZE的開源還有最近新出的JoyAgent也都讓大家躍躍欲試&#xff0c;今天為大家帶來的是Dify的部署方式&#xff0c;相比其他工作流平臺&#xff0c;Dify對于整個Agent制作的流程…

vscode(MSVC)進行c++開發的時,在debug時查看一個eigen數組內部的數值

vscode進行c開發的時&#xff0c;在debug時查看一個eigen數組內部的數值問題描述解決方案拓展其他可視化使用visual studio時的可視化使用別的編譯器的可視化問題描述 使用vscode進行c開發&#xff0c;編譯器是MSVC&#xff0c;在debug的時候想查看一個eigen數組的數值&#x…

【51單片機】【protues仿真】基于51單片機八路搶答器數碼管系統

目錄 一、主要功能 二、使用步驟 三、硬件資源 四、軟件設計 五、實驗現象 一、主要功能 1、數碼管顯示 2、主持人按下開始&#xff0c;8位選手開始搶答 3、第一次使用要設置搶答時間&#xff0c;支持掉電存儲 4、選手搶答成功&#xff0c;數碼管會顯示其號碼 5、按下主…

深度學習:CUDA、PyTorch下載安裝

目錄 一、安裝準備 二、安裝CUDA 2.1 查看本機支持的 CUDA 版本及相關信息 2.2 卸載CUDA(可選) 2.3 下載cuda安裝包 2.4 安裝 2.5 配置環境變量 三、安裝PyTorch 3.1 版本選擇 3.2 下載安裝 方法一&#xff1a;直接安裝&#xff08;不建議&#xff0c;網差的話會死機…

MyBatis-Plus 快速入門 -常用注解

目錄 1. 常用注解 TableName TableId TableField 2. IdType 枚舉 3. 使用 TableField 的常見場景 4. 完整示例 5. 總結 在使用 MyBatis-Plus 的過程中&#xff0c;我們經常會用到一些注解來完成實體類與數據庫表字段之間的映射關系。本文將帶你快速入門&#xff0c;了解…

2025-08-23Excel 條件高亮工具,秒高亮顯示符合篩選條件的行數據

Excel 條件高亮工具&#xff0c;秒高亮顯示符合篩選條件的行數據 先看圖【加班終結者】Excel 條件高亮工具&#xff08;試用版&#xff09; ——讓錯誤數據一秒現形&#xff0c;免費先爽 30 次&#xff01; 你是不是也這樣&#xff1f; ? 財務對賬&#xff0c;1000 行工資表里…

vue 一鍵打包上傳

npm run build之后&#xff0c;將dist文件夾自動壓縮&#xff0c;通過ssh自動連接服務器&#xff0c;把壓縮包放到指定目錄下&#xff0c;然后自動解壓根目錄創建gulpfile.js文件const gulp require(gulp); const GulpSSH require(gulp-ssh); const archiver require(archiv…

【Qt調試】無法查看QString內容

環境Qt版本&#xff1a;6.9.1問題Qt creator進入斷點&#xff0c;Expressions不能查看變量&#xff08;類型&#xff1a;QString&#xff09;的內容。解決方法選擇變量右鍵&#xff0c;勾選【Use Debugging Helpers】

防爆自動氣象監測設備:高危環境的 “安全堡壘”

防爆自動氣象監測設備&#xff1a;高危環境的 “安全堡壘” 柏峰【BF-FB】在化工園區、油氣田、礦山等高危行業領域&#xff0c;絲毫馬虎不得。而氣象條件&#xff0c;這個看似平常的因素&#xff0c;實則在安全生產中扮演著舉足輕重的角色。防爆自動氣象監測設備的出現&#x…

《C++進階:引用補充、內聯函數與nullptr 核心用法》

&#x1f618;個人主頁&#xff1a;Cx330? &#x1f440;個人簡介&#xff1a;一個正在努力奮斗逆天改命的二本覺悟生 &#x1f4d6;個人專欄&#xff1a;《C語言》《LeetCode刷題集》《數據結構-初階》《C知識分享》 &#x1f31f;人生格言&#xff1a;心向往之行必能至 前言…

通過python程序將實時監測數據寫入excel軟件進行保存是常用和非常實用的功能,本文教會大家怎么去搞定此功能

目錄 一、功能介紹 二、具體的程序示例 三、實際應用建議 一、功能介紹 本方案的核心功能是持續監聽一個數據源&#xff08;如傳感器、API接口、消息隊列、其他應用程序等&#xff09;&#xff0c;將獲取到的實時數據流以追加的方式寫入到Excel文件中。同時&#xff0c;方案…