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

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

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

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]刪除
最新教學 更多>
  • 每個開發人員都應該了解可擴展和高效應用程式的頂級 React 設計模式
    每個開發人員都應該了解可擴展和高效應用程式的頂級 React 設計模式
    隨著 React 繼續主導前端生態系統,掌握其設計模式可以顯著提高應用程式的效率和可擴展性。 React 設計模式提供了組織和建置元件、管理狀態、處理 props 和提高可重複使用性的最佳實踐。在本部落格中,我們將探討一些關鍵的 React 設計模式,這些模式可以讓您的開發流程從優秀走向卓越。 ...
    程式設計 發佈於2024-11-06
  • 在 React 中建立無限滾動元件
    在 React 中建立無限滾動元件
    介绍 我们在应用程序和网页中看到无限滚动,尤其是希望我们滚动的社交媒体。虽然无意识地滚动不好,但构建自己的无限滚动是很棒的。作为开发人员,我们应该尝试重新创建我们在网上冲浪时看到的组件。它可以挑战您在实现某些组件时了解更多信息并跳出框框进行思考。 此外,如果您希望在应用程序中实现无...
    程式設計 發佈於2024-11-06
  • 在 React 中建立響應式會議圖塊的動態網格系統
    在 React 中建立響應式會議圖塊的動態網格系統
    In the era of remote work and virtual meetings, creating a responsive and dynamic grid system for displaying participant video tiles is crucial. Inspi...
    程式設計 發佈於2024-11-06
  • 使用 Spring Boot 和 Spring Cloud 開發微服務
    使用 Spring Boot 和 Spring Cloud 開發微服務
    微服務架構已成為建構可擴展和模組化系統的流行解決方案。透過微服務,您可以將單一應用程式分解為更小的、獨立的和專業的服務,這使得系統的維護和發展變得更加容易。在這篇文章中,我們將探討如何使用 Spring Boot 和 Spring Cloud 來創造健壯且有效率的微服務。 微服務簡介 微服務背後的...
    程式設計 發佈於2024-11-06
  • 克服 PHP DOM XML 解析中的挑戰:問題與解決方案
    克服 PHP DOM XML 解析中的挑戰:問題與解決方案
    簡化PHP DOM XML 解析:揭開要點當您瀏覽PHP DOM 函數的複雜性時,可能會出現某些障礙。為了解決這些挑戰,讓我們開始了解 DOM 的複雜性,並找出常見問題的解決方案。 問題1:使用xml:id 馴服ID當使用ID 來防止樹中出現重複頁面時,PHP 的DOM 遇到了一個難題:getEle...
    程式設計 發佈於2024-11-06
  • 密碼重設功能:使用 OTP 重設密碼
    密碼重設功能:使用 OTP 重設密碼
    後端 2. 重設密碼 轉向下一個 API。 PUT 上 /api/reset-password, req -> otp, email, 新密碼, res -> nocontent // controllers/passwordReset.go func Reset...
    程式設計 發佈於2024-11-06
  • 如何從全域站點套件繼承 Virtualenv 中的特定套件?
    如何從全域站點套件繼承 Virtualenv 中的特定套件?
    從全域網站套件繼承Virtualenv 中的特定套件為了增強虛擬環境(virtualenv) 的功能,您可能會想要從全域網站繼承特定套件網站套件目錄。這種方法允許您選擇性地將重要的程式庫合併到您的 virtualenv 中,而無需直接安裝它們。 繼承方法要實現這種繼承,請使用以下命令建立新的virt...
    程式設計 發佈於2024-11-06
  • 如何解決 EF6 中的“找不到 'MySql.Data.MySqlClient\'\”錯誤?
    如何解決 EF6 中的“找不到 'MySql.Data.MySqlClient\'\”錯誤?
    MySQL 實體框架的提供者註冊使用MySQL 和實體框架時,您可能會遇到錯誤「找不到Entity Framework提供者” 'MySql.Data.MySqlClient' ADO.NET 提供者。 「儘管安裝了最新的MySQL 連接器,您可能仍然會遇到此問題。出現此問題的原因是...
    程式設計 發佈於2024-11-06
  • 如何利用PHP防止郵件傳輸中的惡意輸入?
    如何利用PHP防止郵件傳輸中的惡意輸入?
    保護電子郵件傳輸的使用者輸入在PHP 中,必須在發送電子郵件之前清理使用者輸入,以防止惡意或有害內容外洩你的系統。考慮下面的簡單 PHP 郵件腳本的程式碼片段:<?php $to = "[email protected]"; $name = $_POST['name']; ...
    程式設計 發佈於2024-11-06
  • 應用程式頁面開發
    應用程式頁面開發
    Если посмотреть на исходный проект, то можно увидеть, что нам необходимо создать одну главную страницу. Результаты поиска авиабилетов, отелей и туров ...
    程式設計 發佈於2024-11-06
  • Java 應用程式中的「No X11 DISPLAY Variable」錯誤:如何為 GUI 功能設定 DISPLAY 變數?
    Java 應用程式中的「No X11 DISPLAY Variable」錯誤:如何為 GUI 功能設定 DISPLAY 變數?
    Java 應用程式中的「No X11 DISPLAY Variable」錯誤Java 應用程式依賴X Window 系統(X11) 來實作圖形使用者介面( GUI)功能。 「未設定 X11 DISPLAY 變數」錯誤表示應用程式無法存取 X11 顯示環境。 要解決此問題,請設定 X11 DISPLA...
    程式設計 發佈於2024-11-06
  • 破解 HashMap 的基礎知識:Java 開發人員的關鍵概念
    破解 HashMap 的基礎知識:Java 開發人員的關鍵概念
    介紹 了解 HashMap 類對於開發人員至關重要,無論是在實際應用程式還是面試中。在這篇文章中,我們將探討如何在 HashMap 中插入、更新和管理鍵值對。這些知識也將為我們的下一篇文章奠定基礎,我們將深入研究 HashSet 並了解這兩個集合之間的關係。 什麼...
    程式設計 發佈於2024-11-06
  • 如何在 .htaccess 中啟用 PHP 錯誤顯示和日誌記錄?
    如何在 .htaccess 中啟用 PHP 錯誤顯示和日誌記錄?
    透過 .htaccess 解決 PHP 錯誤顯示問題測試網站並遇到問題時,錯誤顯示至關重要。但是,此顯示有時可能會被停用。對於僅有權存取 .htaccess 檔案並希望啟用錯誤顯示的用戶,此問題提供了全面的解決方案。 此問題解決了 .htaccess 檔案是唯一可存取資源的情況。它建議添加三個 PH...
    程式設計 發佈於2024-11-06
  • 精選的最佳 React 管理儀表板模板
    精選的最佳 React 管理儀表板模板
    Hi there ?. I'm Syakir, a Front-end engineer. In this page, i curated premium react admin templates from various vendors with top features and design ...
    程式設計 發佈於2024-11-06
  • Gosync.Pool 及其背後的機制
    Gosync.Pool 及其背後的機制
    这是帖子的摘录;完整的帖子可以在这里找到:https://victoriametrics.com/blog/go-sync-pool/ 这篇文章是关于 Go 中处理并发的系列文章的一部分: Gosync.Mutex:正常和饥饿模式 Gosync.WaitGroup 和对齐问题 Gosync.Poo...
    程式設計 發佈於2024-11-06

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

Copyright© 2022 湘ICP备2022001581号-3