Part 3 第十二章 單元測試 Unit Testing

概述

第十二章圍繞單元測試展開,闡述了單元測試的實踐與重要性,通過對比其他測試類型,突出其特點,還介紹了單元測試的最佳實踐、避免的反模式以及與測試替身相關的內容,為編寫高質量單元測試提供指導。
在這里插入圖片描述

章節概要

1. 單元測試的重要性

單元測試是測試中范圍較窄的類型,通常針對單個類或方法。
單元測試通過快速、確定性的測試幫助工程師提高生產力。
單元測試應覆蓋代碼的核心邏輯,確保代碼變更不會引入缺陷。

2. 測試的可維護性

測試代碼應盡量減少維護成本,只在必要時更新。
測試的脆弱性(如因無關變更而失敗)會顯著增加維護負擔。
測試應通過公共API進行,避免依賴實現細節。

3. 防止脆弱測試

不變的測試:測試代碼應盡量減少變更,除非系統行為發生變化。
通過公共API測試:測試應模擬系統的真實使用方式。
測試狀態而非交互:關注系統的最終狀態,而不是內部交互過程。

4. 編寫清晰的測試

測試的完整性和簡潔性:測試代碼應包含所有必要信息,同時避免無關細節。
基于行為的測試:測試應關注系統的具體行為,而不是方法的實現。
清晰的測試結構:測試應明確包含“給定”、“當”、“則”三個部分。
有意義的測試名稱:測試名稱應清晰描述被測試的行為。
避免測試中的邏輯:測試代碼應盡量避免復雜的邏輯,保持簡單直接。
清晰的失敗信息:測試失敗時,應提供明確的錯誤信息。

5. 測試代碼的共享:DAMP優于DRY

測試代碼應優先追求描述性和有意義,而不是完全避免重復。
測試代碼的共享應通過輔助方法實現,而不是依賴全局變量或復雜的初始化邏輯。

6. 測試基礎設施

測試基礎設施(如測試框架或工具)應標準化,以提高測試的可維護性。
測試基礎設施本身也需要測試,以確保其正確性和穩定性。

總結

單元測試是軟件工程師確保系統在面對未預見變更時仍能正常工作的強大工具。通過遵循本章介紹的最佳實踐,測試可以顯著提高代碼質量,減少維護成本。Google的單元測試實踐表明,清晰、穩定且易于維護的測試是提高開發效率的關鍵。

精彩語錄

1.“測試的主要目的是防止缺陷,其次是提高工程師的生產力。”
“After preventing bugs, the most important purpose of a test is to improve engineers’ productivity.”
解釋:單元測試通過快速反饋幫助工程師快速定位問題,從而提高開發效率。
2.“測試的可維護性是關鍵:好的測試應該‘一勞永逸’。”
“Maintainable tests are ones that ‘just work’: after writing them, engineers don’t need to think about them again until they fail.”
解釋:測試代碼應盡量減少維護成本,只在必要時更新。
3.“測試應該通過公共API進行,而不是依賴于實現細節。”
“Test via Public APIs.”
解釋:通過公共API測試可以減少測試的脆弱性,確保測試與系統的實際使用方式一致。
4.“測試狀態,而不是交互。”
“Test state, not interactions.”
解釋:關注系統的最終狀態比關注內部交互更能反映系統的實際行為。
5.“測試的清晰性至關重要:測試失敗時,工程師應能迅速定位問題。”
“A clear test is one whose purpose for existing and reason for failing is immediately clear to the engineer diagnosing a failure.”
解釋:清晰的測試能夠快速幫助工程師理解測試的意圖和失敗的原因。
6.“測試應關注行為,而不是方法。”
“Test behaviors, not methods.”
解釋:基于行為的測試比基于方法的測試更清晰、更穩定。
7.“測試代碼應遵循DAMP原則,而不是DRY原則。”
“Tests and Code Sharing: DAMP, Not DRY.”
解釋:測試代碼應優先追求“描述性和有意義”,而不是完全避免重復。

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

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

相關文章

【Vite SVG 圖標方案:vite-plugin-svg-icons 指南】

🌟 Vite SVG 圖標方案:vite-plugin-svg-icons 指南 📜 背景與痛點 🌍 前端圖標演進史 1.0 🖼? 圖片圖標 → 2.0 🎭 字體圖標 → 3.0 🎨 SVG 圖標傳統方案存在三大痛點: 字體圖標…

go flag參數 類似Java main 的args

兩部分內容 go run test1.go aa -name 123 1. 解析:aa -name 123 2. 解析:name 123 代碼 package mainimport ("log""os" )func main() {log.Println("main ...")if len(os.Args) > 0 {for index, arg : ra…

酒店旅游API:數據交互的隱形橋梁——以攜程API為例

一、API:酒店 和第三方服務無縫連接。 核心價值: 實時數據互通:房態、價格、庫存秒級同步。業務流程自動化:預訂、支付、確認全程無需人工干預。生態擴展:開發者可基于API構建定制化工具(如比價插件、智能…

深入理解 JSP 與 Servlet:原理、交互及實戰應用

一、引言 在 Java Web 開發領域,JSP(JavaServer Pages)和 Servlet 是兩個至關重要的技術,它們共同構成了動態網頁開發的基礎。Servlet 作為服務器端的 Java 程序,負責處理客戶端請求并生成響應;而 JSP 則是一種簡化的 Servlet 開發方式,允許開發者在 HTML 頁面中嵌入 J…

【JavaScript】《JavaScript高級程序設計 (第4版) 》筆記-Chapter20-JavaScript API

二十、JavaScript API JavaScript API 隨著 Web 瀏覽器能力的增加,其復雜性也在迅速增加。從很多方面看,現代 Web 瀏覽器已經成為構建于諸多規范之上、集不同 API 于一身的“瑞士軍刀”。瀏覽器規范的生態在某種程度上是混亂而無序的。一些規范如 HTML5&…

AI芯片的關鍵特征

AI芯片是專門為人工智能應用設計的芯片,以下是其應具備的關鍵特征: 強大的并行計算能力:AI任務如深度學習中的神經網絡訓練和推理,涉及大量矩陣運算和并行數據處理。AI芯片需有眾多計算單元(如GPU的大量流處理器、ASIC…

go 模塊管理

go version 查看版本 go version go1.21.12 windows/amd64 需要保證:go的版本升級為1.11以上,go mod依賴的最底版本 go env 查看go的環境變量 go env 開啟go mod # 標識開啟go的模塊管理 set GO111MODULE=on GO111MODULE有三個值:off, on和auto(默認值)。 GO111M…

Unity 適用于單機游戲的紅點系統(前綴樹 | 數據結構 | 設計模式 | 算法 | 含源碼)

文章目錄 功能包括如何使用 功能包括 紅點數據本地持久化 如果子節點有紅點,父節點也要顯示紅點,父節點紅點數為子節點紅點數的和; 當子節點紅點更新時,對應的父節點也要更新; 當所有子節點都沒有紅點時&#xff0c…

使用API有效率地管理Dynadot域名,為域名部署DNS安全拓展(DNSSEC)

關于Dynadot Dynadot是通過ICANN認證的域名注冊商,自2002年成立以來,服務于全球108個國家和地區的客戶,為數以萬計的客戶提供簡潔,優惠,安全的域名注冊以及管理服務。 Dynadot平臺操作教程索引(包括域名郵…

Web - JS基礎語法與表達式

概述 這篇文章主要介紹了 JavaScript 的基礎語法,包括代碼書寫位置、ERPL 環境、變量(命名規則、默認值、初始化)、數據類型(基本和復雜,及各類型特點、轉換)、表達式和運算符(算數、特殊算數、…

一臺服務器將docker image打包去另一天服務器安裝這個鏡像

一臺服務器將docker image打到去另一天服務器安裝這個鏡像 1. 打包2.另一臺服務器執行 1. 打包 docker save -o nebula-graph-studio.tar harbor1.vm.example.lan/dockerio/vesoft/nebula-graph-studioxxx.tar 是打包好的文件 后面的是 docker image 2.另一臺服務器執行 docke…

一周學會Flask3 Python Web開發-response響應格式

鋒哥原創的Flask3 Python Web開發 Flask3視頻教程: 2025版 Flask3 Python web開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 在HTTP響應中,數據可以通過多種格式傳輸。大多數情況下,我們會使用HTML格式,這也是Flask中…

TCP和Http協議

TCP 三次握手: 第一次握手 : 初始狀態:開始時,客戶端處于 CLOSED(關閉)狀態,服務端處于 LISTEN(監聽)狀態,等待客戶端的連接請求。客戶端發送請求&#xff…

圖論 之 最小生成樹

文章目錄 題目1584.連接所有點的最小費用 最小生成樹MST,有兩種算法進行求解,分別是Kruskal算法和Prim算法Kruskal算法從邊出發,適合用于稀疏圖Prim算法從頂點出發,適合用于稠密圖:基本思想是從一個起始頂點開始&#…

前端面試之Box盒子布局:核心知識與實戰解析

目錄 引言:布局能力決定前端高度 一、盒模型基礎:看得見的像素戰爭 1. 標準盒模型 vs IE盒模型 2. 核心組成公式 3. 視覺格式化模型 二、傳統布局三劍客 1. 浮動布局(Float Layout) 2. 定位布局(Position Layou…

OnlyOffice:前端編輯器與后端API實現高效辦公

OnlyOffice:前端編輯器與后端API實現高效辦公 一、OnlyOffice概述二、前端編輯器:高效、靈活且易用1. 完善的編輯功能2. 實時協作支持3. 自動保存與版本管理4. 高度自定義的界面 三、后端API:管理文檔、用戶與權限1. 輕松集成與定制2. 實時協…

Python多線程編程理解面試題解析

一、多線程介紹 Python 的多線程是一種實現并發編程的方式,允許程序同時執行多個任務。然而,由于 Python 的全局解釋器鎖(GIL)的存在,多線程在某些場景下可能無法充分利用多核 CPU 的性能。以下是對 Python 多線程的理…

如何通過 Python 實現一個消息隊列,為在線客服系統與海外運營的APP對接

對方有兩個核心需求: 訪客上線的時候,要通知對方的業務系統,業務系統根據訪客的身份信息,推送個性化的歡迎詞。訪客完成下單的時候,要能推送一個下單成功的通知,并且包含訂單信息和鏈接。根據這兩個需求,那就需要實現由客服系統到業務系統的消息隊列推送,以及通過 Open…

中文Build a Large Language Model (From Scratch) 免費獲取全文

中文pdf下載地址:https://pan.baidu.com/s/1aq2aBcWt9vYagT2-HuxdWA?pwdlshj 提取碼:lshj 原文、代碼、視頻項目地址:https://github.com/rasbt/LLMs-from-scratch 翻譯工具:沉浸式翻譯(https://app.immersivetrans…

項目設置內網 IP 訪問實現方案

在我們平常的開發工作中,項目開發、測試完成后進行部署上線。比如電商網站、新聞網站、社交網站等,通常對訪問不會進行限制。但是像企業內部網站、內部管理系統等,這種系統一般都需要限制訪問,比如內網才能訪問等。那么一個網站應…