測試驅動開發 (TDD) 是一種用於編寫乾淨、無錯誤程式碼的強大方法。在本文中,我們將探索如何使用 Bun 的內建測試運行器 Bun Test 來實現 TDD,該運行器以其速度和簡單性而聞名。
測試驅動開發(TDD)是一種在程式碼之前編寫測試的軟體開發實踐。 TDD 實踐指導實現並透過迭代編寫、測試和重構週期確保功能。
TDD 是一個遵循以下步驟的開發流程:
這個迭代過程旨在產生健壯且經過良好測試的程式碼。
如果您尚未安裝 Bun,請依照 Bun JavaScript 文件中的說明進行安裝。
然後,初始化一個新項目:
bun init
➜ example bun init bun init helps you get started with a minimal project and tries to guess sensible defaults. Press ^C anytime to quit package name (example): entry point (index.ts): Done! A package.json file was saved in the current directory.
在tests目錄中建立一個測試檔案(例如tests/example.test.js)。 Bun會自動偵測以.test.ts或.test.js結尾的檔案進行測試。
mkdir tests touch tests/example.test.js
讓我們從一個簡單的例子開始。
我們將創建一個計算器檔案來實作一些數學函數。
我們首先專注於一個簡單的函數,例如 sum(),儘管 JavaScript 已經有一個原生的加法運算子。這使我們能夠專注於建立測試而不是邏輯的複雜性。
計劃如下:
在tests/calculator.test.js 檔案中,您可以實作您的測試:
import { describe, expect, it } from "bun:test"; import { sum } from "../calculator"; describe("sum function", () => { it("should return the sum of two numbers (both are positive)", () => { expect(sum(2, 3)).toBe(5); }); it("should return the sum of two numbers (one is negative)", () => { expect(sum(-1, 2)).toBe(1); }); });
這些測試驗證計算器模組中定義的 sum() 函數的行為。這些測試是使用 Bun 的測試庫編寫的,並組織在名為「sum function」的描述區塊中。 describe() 區塊有助於將「相似」測試進行分組。每個 it() 區塊指定要測試的特定場景。以下是每個測試的作用:
這些測試確保 sum 函數的行為符合基本加法場景的預期,涵蓋正數和混合(正和負)輸入。
現在,您可以建立導出 sum() 函數的計算器模組。
在calculator.ts檔:
bun init
該函數的第一個版本會傳回一個硬編碼值,因此我預期測試會失敗。
運行測試:
➜ example bun init bun init helps you get started with a minimal project and tries to guess sensible defaults. Press ^C anytime to quit package name (example): entry point (index.ts): Done! A package.json file was saved in the current directory.
現在我們可以調整計算器中sum()函數的邏輯了。調整sum()函數的邏輯:
mkdir tests touch tests/example.test.js
現在,如果您執行測試,您將獲得「綠色」✅ 狀態。
如果你想在不同的場景(輸入值)下執行相同的測試,可以使用each()方法。
import { describe, expect, it } from "bun:test"; import { sum } from "../calculator"; describe("sum function", () => { it("should return the sum of two numbers (both are positive)", () => { expect(sum(2, 3)).toBe(5); }); it("should return the sum of two numbers (one is negative)", () => { expect(sum(-1, 2)).toBe(1); }); });
使用資料集驅動的方法,此程式碼測試計算器模組中的 sum 函數。 it.each() 方法用於透過迭代輸入和預期輸出的資料集來簡化重複的測試案例。以下是其工作原理的詳細說明:
首先,您可以定義一個資料集
export function sum(a: number, b: number) { // Function yet to be implemented return 0; }
資料集是一個陣列的陣列。每個內部數組代表一個測試案例,其中元素對應於:
describe 函數將與 sum 函數相關的所有測試分組到一個區塊下,以便更好地組織。
在describe()區塊中,it.each(dataset)迭代資料集數組中的每一行。
「%d 和 %d 的和應該是 %d」是測試的描述模板,其中 %d 在每次迭代期間被替換為資料集中的實際數字。
例如,第一次迭代產生描述:「2 和 3 的總和應為 5」。
在回呼函數(a,b,expected)中,資料集中每一行的元素被解構為變數:a,b,expected。然後,在測試中,使用 a 和 b 呼叫 sum 函數,並使用 Expect() 檢查結果以確保其與預期相符。
為了展示 TDD 的另一個範例,讓我們在計算器模組中實作一個平均值函數,用於計算數字數組的平均值。遵循 TDD 方法,我們將從編寫測試開始。
在已經存在的calculator.test.js中加入這些特定於mean()函數的測試:
bun init
現在在calculator.ts檔中,加入mean()函數:
➜ example bun init bun init helps you get started with a minimal project and tries to guess sensible defaults. Press ^C anytime to quit package name (example): entry point (index.ts): Done! A package.json file was saved in the current directory.
現在您可以再次執行測試
mkdir tests touch tests/example.test.js
所有測試都應該通過。
在這種情況下,實作已經經過測試,因此不需要進一步重構。但是,請務必花時間檢查您的程式碼以進行改進。
測試覆蓋率是衡量自動化測試期間執行的程式碼庫百分比的指標。它提供了有關測試驗證程式碼的效果的見解。
Bun 測試覆蓋率有助於識別「線路覆蓋率」。
行覆蓋率檢查測試套件期間是否執行了每行程式碼。
運行測試覆蓋率:
import { describe, expect, it } from "bun:test"; import { sum } from "../calculator"; describe("sum function", () => { it("should return the sum of two numbers (both are positive)", () => { expect(sum(2, 3)).toBe(5); }); it("should return the sum of two numbers (one is negative)", () => { expect(sum(-1, 2)).toBe(1); }); });
雖然高測試覆蓋率很重要,但這並不是衡量程式碼品質的唯一標準。旨在進行有意義的測試,重點是應用程式的功能、邊緣情況和關鍵部分。實現 100% 的覆蓋率是理想的,但不要以編寫不必要或瑣碎的測試為代價。
使用 Bun Test 的測試驅動開發 (TDD) 使開發人員能夠透過首先專注於需求並透過迭代測試確保功能來編寫乾淨、可維護且健壯的程式碼。透過利用 Bun 快速且有效率的測試工具,您可以簡化開發流程並自信地處理邊緣情況。採用 TDD 不僅可以提高程式碼質量,還可以培養從一開始就編寫可測試的模組化程式碼的心態。從小事做起,經常迭代,讓您的測試指導您的實施。
以上是具有 Bun Test 的測試驅動開發 (TDD)的詳細內容。更多資訊請關注PHP中文網其他相關文章!