」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 了解乾淨的程式碼:單元測試 ⚡

了解乾淨的程式碼:單元測試 ⚡

發佈於2024-08-31
瀏覽:744

Understanding Clean Code: Unit Tests ⚡

在軟體開發中,單元測試是一種至關重要的實踐,有助於確保程式碼的正確性。

《乾淨的程式碼:敏捷軟體流程手冊》的第 9 章,標題為“單元測試”,深入探討了編寫乾淨且有效的單元測試的原則和實踐。

在本文中,我們將總結本章的重點,並提供 JavaScript 範例來說明這些概念。


?為什麼單元測試很重要

單元測試涉及為程式碼的各個單元或元件編寫測試,以驗證它們是否按預期運行。單元測試的主要目標是:

1- 及早檢測錯誤: 在開發過程中發現問題,然後再投入生產。

2- 促進重構:確保程式碼的變更不會破壞現有功能。

3- 文檔代碼行為: 作為如何使用代碼的文檔。


?有效單元測試的原則

⚡ 一次測試一件事

每個單元測試應該關注功能的一個面向。這使得測試更容易理解和維護。如果測試失敗,您就會確切地知道問題出在哪裡。

function add(a, b) {
    return a   b;
}

// Test case for the add function
function testAdd() {
    // Test adding positive numbers
    assertEqual(add(2, 3), 5, '2   3 should be 5');
    // Test adding negative numbers
    assertEqual(add(-1, -1), -2, '-1   -1 should be -2');
}

// A simple assertion function
function assertEqual(actual, expected, message) {
    if (actual !== expected) {
        throw new Error(message);
    }
}

⚡ 使測試可讀

您的測驗應該易於閱讀和理解。為您的測試函數使用描述性名稱和清晰的斷言。這有助於其他人(和您自己)快速掌握每個測試正在驗證的內容。

function isEven(number) {
    return number % 2 === 0;
}

// Descriptive test function
function testIsEven() {
    assertEqual(isEven(4), true, '4 should be even');
    assertEqual(isEven(5), false, '5 should be odd');
}

⚡ 使用清晰且具描述性的名稱

測試案例的名稱應該描述他們正在測試的內容。這增強了測試的可讀性和可維護性。

function calculateTotalPrice(items) {
    return items.reduce((total, item) => total   item.price, 0);
}

// Descriptive test case names
function testCalculateTotalPrice() {
    assertEqual(calculateTotalPrice([{ price: 10 }, { price: 20 }]), 30, 'Total price should be 30 for items costing 10 and 20');
    assertEqual(calculateTotalPrice([{ price: 5 }]), 5, 'Total price should be 5 for a single item costing 5');
}

⚡ 保持測試獨立

每個測試應該獨立於其他測試。依賴共享狀態的測試可能會導致不穩定的測試並使偵錯變得困難。

function multiply(a, b) {
    return a * b;
}

// Independent test cases
function testMultiply() {
    assertEqual(multiply(2, 3), 6, '2 * 3 should be 6');
    assertEqual(multiply(0, 10), 0, '0 * 10 should be 0');
}

⚡ 適當使用模擬和存根

模擬和存根可以透過模擬依賴關係來幫助隔離被測程式碼單元。但是,請謹慎使用它們以避免測試過於複雜。

// Example of using a mock for a database call
function getUser(id) {
    // Imagine this function makes a database call
    return database.getUserById(id);
}

function testGetUser() {
    const mockDatabase = {
        getUserById: (id) => ({ id, name: 'John Doe' }),
    };

    const result = getUser(1, mockDatabase);
    assertEqual(result.name, 'John Doe', 'User name should be John Doe');
}

⚡ 自動化測試

自動執行單元測試以確保它們定期執行。持續整合 (CI) 工具可以幫助您在發生變更時自動執行測試。

如果您使用 Jest 這樣的測試框架,您可以在 package.json 中設定腳本:

"scripts": {
    "test": "jest"
}

運行 npm test 將執行所有測試並提供有關其狀態的回饋。


結論

編寫乾淨有效的單元測試對於維護高品質程式碼至關重要。

透過遵循 Clean Code 第 9 章中概述的原則,您可以確保您的測試可靠、可理解且有價值。

在 JavaScript 程式碼中實現這些實踐不僅可以提高測試質量,還有助於建立更強壯且可維護的程式碼庫。

快樂編碼!

版本聲明 本文轉載於:https://dev.to/alisamir/understanding-clean-code-unit-tests-5d1a?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何在Python中散列大檔案而不消耗記憶體?
    如何在Python中散列大檔案而不消耗記憶體?
    在Python中計算大檔案的MD5雜湊值Python的hashlib模組為計算加密雜湊值提供了一個方便的接口。然而,對於大小超過系統記憶體的特別大的文件,直接使用 hashlib 可能會出現問題。 解決方案:漸進式哈希為了解決這個問題,我們採用漸進式哈希通過以可管理的區塊讀取檔案。這種方法可確保對整...
    程式設計 發佈於2024-11-06
  • 使用 Maven 以及 PostgreSQL 資料庫對 Java Spring Boot 應用程式進行 Docker 化
    使用 Maven 以及 PostgreSQL 資料庫對 Java Spring Boot 應用程式進行 Docker 化
    Docker化 Spring Boot 應用程式涉及建立包含您的應用程式及其相依性的 Docker 映像。這允許您以一種可以輕鬆共享並在任何安裝了 Docker 的電腦上運行的方式打包應用程式。以下是對基於 Maven 的 Spring Boot 應用程式進行 Docker 化並在 Docker 容...
    程式設計 發佈於2024-11-06
  • 如何修復由 Google JAR 檔案引起的 Android Studio 中的“GC Overhead Limit Exceeded”錯誤?
    如何修復由 Google JAR 檔案引起的 Android Studio 中的“GC Overhead Limit Exceeded”錯誤?
    Google JAR 檔案導致Android Studio 中出現GC 開銷限制超出錯誤Android Studio 使用者在下列情況下可能會遇到「GC開銷限制超出”錯誤使用Google JAR 檔案。此問題通常是由於 dedex 進程分配的記憶體不足而引起的。要解決此問題,請考慮以下步驟:1.增加...
    程式設計 發佈於2024-11-06
  • 如何用 SQLSRV 取代 PHP 5.3 中已棄用的 MSSQL 擴充?
    如何用 SQLSRV 取代 PHP 5.3 中已棄用的 MSSQL 擴充?
    PHP 5.3 中MSSQL 擴展的替代方案隨著PHP 5.3 中MSSQL 擴展的棄用,尋求替代解決方案變得至關重要。本文深入研究 SQLSRV 擴充功能作為連接 Microsoft SQL 資料庫的可行選項。 根據 PHP 手冊,PHP 5.3 及更高版本不再支援 MSSQL 擴充。作為替代,M...
    程式設計 發佈於2024-11-06
  • 何時使用 AtomicBoolean:防止多執行緒應用程式中的資料不一致?
    何時使用 AtomicBoolean:防止多執行緒應用程式中的資料不一致?
    AtomicBoolean:Volatile Boolean 的更強大的替代品在多線程編程中,確保對共享數據的正確和一致的訪問至關重要。一種常見的方法是使用 volatile 關鍵字將欄位標記為共享,確保對變數的變更對其他執行緒立即可見。但是, volatile 關鍵字存在一些限制,可能會導致問題,...
    程式設計 發佈於2024-11-06
  • Jsoup 如何讓 Java 中的網頁抓取變得簡單又有效率?
    Jsoup 如何讓 Java 中的網頁抓取變得簡單又有效率?
    Java 中網頁抓取的HTML 解析在軟體開發領域,有必要從網站中提取有價值的資訊以用於各種目的。這種從線上來源提取資料的過程通常稱為網頁抓取。 Java 程式設計師可以使用多功能工具來完成此任務:HTML 解析器。 強烈建議的 Java HTML 解析器是 Jsoup。它的出色之處在於其用戶友好的...
    程式設計 發佈於2024-11-06
  • Jetmaker - 用於以 Python 建構分散式系統的開源框架
    Jetmaker - 用於以 Python 建構分散式系統的開源框架
    專案:Jetmaker 它是 Python 開發人員將多個分散式節點連接到一個系統中的框架,因此分散式應用程式可以存取彼此的資料和服務。它還提供了同步所有節點的工具,就像在多線程和多處理中所做的那樣 Github連結:https://github.com/gavinwei121/Jetmaker 文...
    程式設計 發佈於2024-11-06
  • 馴服電子郵件野獸:我的收件匣管理人工智慧之旅
    馴服電子郵件野獸:我的收件匣管理人工智慧之旅
    是否曾经感觉您的收件箱是一个数字九头蛇,为您回复的每个人发送两封新电子邮件? ??好吧,科技爱好者们,我决定用秘密武器来对付这个怪物:人工智能! ??️ 尤里卡时刻 想象一下:现在是凌晨 3 点,我周围都是空咖啡杯☕☕☕,盯着一个数量可与国会图书馆相媲美的收件箱。就在那时,我突然想到...
    程式設計 發佈於2024-11-06
  • 為什麼 Go 是智能合約開發的新競爭者
    為什麼 Go 是智能合約開發的新競爭者
    区块链生态系统迅速发展,引入了创新的解决方案和平台,扩展了分布式账本技术的潜力。这项创新的核心是智能合约——自动执行的程序,无需中介即可自动执行协议。传统上,Solidity 一直是编写智能合约的首选语言,尤其是以太坊区块链。 Solidity 旨在在以太坊虚拟机 (EVM) 中运行,为开发人员提供...
    程式設計 發佈於2024-11-06
  • 如何在等待執行緒完成時保持 tkinter GUI 回應?
    如何在等待執行緒完成時保持 tkinter GUI 回應?
    等待線程完成時凍結/掛起tkinter GUI在Python 中使用tkinter GUI 工具包時遇到的常見問題執行某些操作時介面凍結或掛起。這通常是由於在主事件循環中使用了阻塞操作,例如加入執行緒。 瞭解 tkinter Mainlooptkinter mainloop() 是負責處理使用者輸入...
    程式設計 發佈於2024-11-06
  • C 和 C++ 中條件運算子的行為有什麼不同?
    C 和 C++ 中條件運算子的行為有什麼不同?
    條件運算子:剖析C 與C 的差異在程式設計領域,條件運算子(?:) 充當計算表達式並根據結果傳回特定值的簡潔方法。雖然此運算符在 C 和 C 中的操作類似,但出現了一個微妙的區別,可能會影響程式碼執行。 C:對左值的限制在 C 中,條件運算子會對傳回左值(駐留在特定記憶體位址的變數)施加限制。這表示...
    程式設計 發佈於2024-11-06
  • Java中如何有效率地檢查字串中是否存在某個字元?
    Java中如何有效率地檢查字串中是否存在某個字元?
    高效字串字元驗證在Java中,一個常見的任務是判斷某個特定字元是否出現在字串中。雖然傳統方法涉及遍歷字串,但利用 indexOf() 的有效替代方法消除了循環的需要。 IndexOf() 逐個字元掃描字串,並傳回指定字元所在的第一個實例的索引出現。如果該字元不存在,則傳回值 -1。 考慮檢查字元「a...
    程式設計 發佈於2024-11-06
  • 如何使用 PHP 為圖片添加浮水印?
    如何使用 PHP 為圖片添加浮水印?
    使用PHP 向圖像添加浮水印如果您正在使用允許用戶上傳圖像的網站,則可能需要添加這些圖像的浮水印,以防止未經授權的使用。添加浮水印可確保您的徽標或品牌在每個上傳的圖像上都可見。以下是如何在PHP 中實現此目的:使用PHP 函數PHP 手冊提供了使用以下函數的綜合範例:imagecreatefromp...
    程式設計 發佈於2024-11-06
  • 如何抑制 Tensorflow 調試輸出?
    如何抑制 Tensorflow 調試輸出?
    抑制Tensorflow調試信息Tensorflow可能會在初始化時在終端中顯示調試信息,包括加載的庫和發現的設備。雖然此資訊對於偵錯目的很有用,但它也會使控制台混亂並使追蹤重要訊息變得困難。 要停用此偵錯訊息,您可以使用 os.environ 模組:import os os.environ['TF...
    程式設計 發佈於2024-11-06
  • 如何確定我的 MySQL 查詢是否利用了索引?
    如何確定我的 MySQL 查詢是否利用了索引?
    識別 MySQL 索引的效能優化 MySQL 查詢時,評估索引的有效性至關重要。 取得索引效能指標要確定您的查詢是否使用索引,請執行下列查詢:EXPLAIN EXTENDED SELECT col1, col2, col3, COUNT(1) FROM table_name WHERE col1...
    程式設計 發佈於2024-11-06

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3