在軟體開發中,單元測試是一種至關重要的實踐,有助於確保程式碼的正確性。
《乾淨的程式碼:敏捷軟體流程手冊》的第 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 程式碼中實現這些實踐不僅可以提高測試質量,還有助於建立更強壯且可維護的程式碼庫。
快樂編碼!
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3