33、單元測試實戰練習題

以下是三個練習題的具體實現方案,包含完整代碼示例和詳細說明:


練習題1:TDD實現博客評論功能

步驟1:編寫失敗測試

# tests/test_blog.py
import unittest
from blog import BlogPost, Comment, InvalidCommentErrorclass TestBlogSystem(unittest.TestCase):def test_create_comment(self):post = BlogPost(title="Python測試教程", content="...")comment = post.add_comment(user="開發者", text="非常實用!")self.assertIsInstance(comment, Comment)self.assertEqual(len(post.comments), 1)def test_comment_validation(self):post = BlogPost(title="TDD實踐", content="...")with self.assertRaises(InvalidCommentError):post.add_comment(user="", text="空用戶測試")def test_comment_display(self):post = BlogPost(title="測試驅動開發", content="...")post.add_comment(user="Alice", text="清晰易懂")self.assertIn("Alice: 清晰易懂", post.display_comments())

步驟2:實現最小功能

# blog.py
class InvalidCommentError(Exception):passclass Comment:def __init__(self, user, text):self.user = userself.text = textclass BlogPost:def __init__(self, title, content):self.title = titleself.content = contentself.comments = []def add_comment(self, user, text):if not user or not text:raise InvalidCommentError("用戶和內容不能為空")comment = Comment(user, text)self.comments.append(comment)return commentdef display_comments(self):return "\n".join([f"{c.user}: {c.text}" for c in self.comments])

步驟3:運行測試

python -m unittest tests/test_blog.py -v

步驟4:重構優化

  • 添加評論時間戳功能
  • 實現評論分級嵌套
  • 添加敏感詞過濾機制

練習題2:生成HTML測試報告

安裝依賴

pip install pytest-html

配置測試命令

# 生成基礎報告
pytest --html=report.html# 帶附加信息的報告
pytest --html=detailed_report.html --self-contained-html \--metadata Project "博客系統" \--metadata Environment "測試環境"

示例報告配置類

# conftest.py
def pytest_configure(config):config._metadata["測試類型"] = "單元測試"config._metadata["Python版本"] = "3.9"def pytest_html_report_title(report):report.title = "博客系統測試報告"

高級配置(截取失敗用例截圖)

# conftest.py
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):outcome = yieldreport = outcome.get_result()if report.when == "call" and report.failed:html = "<div><img src='data:image/png;base64,...'/></div>"report.extra = [pytest_html.extras.html(html)]

練習題3:GitHub Actions每日構建

配置文件路徑

.github/workflows/daily-build.yml

name: Daily Buildon:schedule:- cron: '0 0 * * *'  # 每天UTC時間0點運行workflow_dispatch:     # 允許手動觸發jobs:build:runs-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkout@v3- name: Set up Pythonuses: actions/setup-python@v4with:python-version: '3.10'- name: Install dependenciesrun: |python -m pip install --upgrade pippip install -r requirements.txtpip install pytest pytest-html- name: Run testsrun: pytest --html=report.html --cov=src- name: Upload reportuses: actions/upload-artifact@v3with:name: test-reportpath: report.html- name: Codecov integrationuses: codecov/codecov-action@v3with:token: ${{ secrets.CODECOV_TOKEN }}

關鍵配置說明:

  1. 定時觸發器:使用cron表達式控制執行頻率

  2. 多Python版本支持:修改python-version矩陣

  3. 依賴緩存優化

    - name: Cache dependenciesuses: actions/cache@v3with:path: ~/.cache/pipkey: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }}
    
  4. 郵件通知:添加失敗通知配置

    - name: Send emailif: failure()uses: dawidd6/action-send-mail@v3with:server_address: smtp.example.comserver_port: 587username: ${{ secrets.MAIL_USERNAME }}password: ${{ secrets.MAIL_PASSWORD }}subject: 每日構建失敗通知body: 測試用例執行失敗,請及時處理!to: dev-team@example.com
    

驗證實施效果

測試報告示例

<!-- report.html -->
<html><head><title>博客系統測試報告</title><style>/* 自動生成樣式 */</style></head><body><h1>測試覆蓋率 92%</h1><table><tr><th>模塊</th><th>覆蓋率</th></tr><tr><td>blog.py</td><td>100%</td></tr><tr><td>comment.py</td><td>85%</td></tr></table><h2>失敗用例追蹤</h2><div class="log">AssertionError: 預期8,實際得到9</div></body>
</html>

以上實現方案具有以下生產級特性:

  1. 錯誤追蹤:在測試報告中直接顯示失敗代碼上下文

  2. 環境隔離:使用虛擬環境保證測試純凈性

  3. 敏感信息保護:通過GitHub Secrets管理憑證

  4. 執行效率優化:并行測試執行配置

    strategy:matrix:python-version: ["3.8", "3.9", "3.10"]fail-fast: false
    

建議將代碼分階段實施,每個功能點完成后運行完整測試套件,確保系統穩定性。

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

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

相關文章

16-算法打卡-哈希表-兩個數組的交集-leetcode(349)-第十六天

1 題目地址 349. 兩個數組的交集 - 力扣&#xff08;LeetCode&#xff09;349. 兩個數組的交集 - 給定兩個數組 nums1 和 nums2 &#xff0c;返回 它們的 交集 。輸出結果中的每個元素一定是 唯一 的。我們可以 不考慮輸出結果的順序 。 示例 1&#xff1a;輸入&#xff1a;nu…

SciPy庫詳解

SciPy 是一個用于數學、科學和工程計算的 Python 庫&#xff0c;它建立在 NumPy 之上&#xff0c;提供了許多高效的算法和工具&#xff0c;用于解決各種科學計算問題。 CONTENT 1. 數值積分功能代碼 2. 優化問題求解功能代碼3. 線性代數運算功能代碼 4. 信號處理功能代碼 5. 插…

杰弗里·辛頓:深度學習教父

名人說&#xff1a;路漫漫其修遠兮&#xff0c;吾將上下而求索。—— 屈原《離騷》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 杰弗里辛頓&#xff1a;當堅持遇見突破&#xff0c;AI迎來新紀元 一、人物簡介 杰弗…

BladeX單點登錄與若依框架集成實現

1. 概述 本文檔詳細介紹了將BladeX認證系統與若依(RuoYi)框架集成的完整實現過程。集成采用OAuth2.0授權碼流程&#xff0c;使用戶能夠通過BladeX賬號直接登錄若依系統&#xff0c;實現無縫單點登錄體驗。 2. 系統架構 2.1 總體架構 #mermaid-svg-YxdmBwBtzGqZHMme {font-fa…

初識Redis · set和zset

目錄 前言&#xff1a; set 基本命令 交集并集差集 內部編碼和應用場景 zset 基本命令 交集并集差集 內部編碼和應用場景 應用場景&#xff08;AI生成&#xff09; 排行榜系統 應用背景 設計思路 熱榜系統 應用背景 設計思路 熱度計算方式 總結對比表 前言&a…

playwright 教程高級篇:掌握網頁自動化與驗證碼處理等關鍵技術詳解

Playwright 教程高級篇:掌握網頁自動化與驗證碼處理等關鍵技術詳解 本教程將帶您一步步學習如何使用 Playwright——一個強大的瀏覽器自動化工具,來完成網頁任務,例如提交鏈接并處理旋轉驗證碼。我們將按照典型的自動化流程順序,從啟動瀏覽器到關閉瀏覽器,詳細講解每個步驟…

數據結構(完)

樹 二叉樹 構建二叉樹 int value;Node left;Node right;public Node(int val) {valueval;} 節點的添加 Node rootnull;public void insert(int num) {Node nodenew Node(num);if(rootnull) {rootnode;return;}Node index root;while(true) {//插入的節點值小if(index.value&g…

FastAPI與SQLAlchemy數據庫集成與CRUD操作

title: FastAPI與SQLAlchemy數據庫集成與CRUD操作 date: 2025/04/16 09:50:57 updated: 2025/04/16 09:50:57 author: cmdragon excerpt: FastAPI與SQLAlchemy集成基礎包括環境準備、數據庫連接配置和模型定義。CRUD操作通過數據訪問層封裝和路由層實現,確保線程安全和事務…

一個基于Django的寫字樓管理系統實現方案

一個基于Django的寫字樓管理系統實現方案 用戶現在需要我用Django來編寫一個寫字樓管理系統的Web版本&#xff0c;要求包括增刪改查寫字樓的HTML頁面&#xff0c;視頻管理功能&#xff0c;本地化部署&#xff0c;以及人員權限管理&#xff0c;包含完整的代碼結構和功能實現&am…

mongodb在window10中創建副本集的方法,以及node.js連接副本集的方法

創建Mongodb的副本集最好是新建一個文件夾&#xff0c;如D:/data&#xff0c;不要在mongodb安裝文件夾里面創建副本集&#xff0c;雖然這樣也可以&#xff0c;但是容易造成誤操作或路徑混亂&#xff1b;在新建文件夾里與現有 MongoDB 數據隔離&#xff0c;避免誤操作影響原有數…

Maven 多倉庫與鏡像配置全攻略:從原理到企業級實踐

Maven 多倉庫與鏡像配置全攻略&#xff1a;從原理到企業級實踐 一、核心概念&#xff1a;Repository 與 Mirror 的本質差異 在 Maven 依賴管理體系中&#xff0c;repository與mirror是構建可靠依賴解析鏈的兩大核心組件&#xff0c;其核心區別如下&#xff1a; 1. Repositor…

STM32 四足機器人常見問題匯總

文章不介紹具體參數&#xff0c;有需求可去網上搜索。 特別聲明&#xff1a;不論年齡&#xff0c;不看學歷。既然你對這個領域的東西感興趣&#xff0c;就應該不斷培養自己提出問題、思考問題、探索答案的能力。 提出問題&#xff1a;提出問題時&#xff0c;應說明是哪款產品&a…

MySQL 中 `${}` 和 `#{}` 占位符詳解及面試高頻考點

文章目錄 一、概述二、#{} 和 ${} 的核心區別1. 底層機制代碼示例 2. 核心區別總結 三、為什么表名只能用 ${}&#xff1f;1. 預編譯機制的限制2. 動態表名的實現 四、安全性注意事項1. ${} 的風險場景2. 安全實踐 五、面試高頻考點1. 基礎原理類問題**問題 1**&#xff1a;**問…

C語言編譯預處理2

#include <XXXX.h>和#include <XXXX.c> #include "XXXX.h" 是 C 語言中一條預處理指令 #include <XXXX.h>&#xff1a;這種形式用于包含系統標準庫的頭文件。預處理器會在系統默認的頭文件搜索路徑中查找XXXX.h 文件。例如在 Linux 系統中&#…

Elasticvue-輕量級Elasticsearch可視化管理工具

Elasticvue一個免費且開源的 Elasticsearch 在線可視化客戶端&#xff0c;用于管理 Elasticsearch 集群中的數據&#xff0c;完全支持 Elasticsearch 版本 8.x 和 7.x. 功能特色&#xff1a; 集群概覽索引和別名管理分片管理搜索和編輯文檔REST 查詢快照和存儲庫管理支持國際…

Git提交規范及最佳實踐

Git 提交規范通常是為了提高代碼提交的可讀性、可維護性和自動化效率&#xff08;如生成 ChangeLog&#xff09;。以下是常見的 Conventional Commits 規范&#xff0c;結合社區最佳實踐總結而成&#xff1a; 1. 提交格式 每次提交的 commit message 應包含三部分&#xff1a;…

Ubuntu中snap

通過Snap可以安裝眾多的軟件包。需要注意的是&#xff0c;snap是一種全新的軟件包管理方式&#xff0c;它類似一個容器擁有一個應用程序所有的文件和庫&#xff0c;各個應用程序之間完全獨立。所以使用snap包的好處就是它解決了應用程序之間的依賴問題&#xff0c;使應用程序之…

android studio 運行java main報錯

運行某個帶main函數的java文件報錯 Could not create task :app:Test.main(). > SourceSet with name main not found. 解決辦法&#xff1a;在工程的.idea/gradle.xml 文件下添加&#xff1a; <option name"delegatedBuild" value"false" /&g…

openssh離線一鍵升級腳本分享(含安裝包)

查看當前的版本 [rootmyoracle ~]#ssh -V相關安裝包下載地址 openssh下載地址&#xff1a;http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssl下載地址&#xff1a;https://www.openssl.org/source/zlib下載地址&#xff1a;http://www.zlib.net/今天演示從7.4升級…

Mac M1管理多個Node.js版本

目錄 1. 使用 nvm (Node Version Manager) 1.1.安裝 nvm 1.2.安裝Node.js版本 1.3.查看已安裝的node版本列表 1.4.使用特定版本的Node.js 1.5.查看當前使用的版本 2. 使用 fnm (Fast Node Manager) 2.1.安裝 fnm 2.2.安裝Node.js版本 2.3.查看已安裝的版本 2.4.使用…