首頁 > web前端 > js教程 > 具有 Bun Test 的測試驅動開發 (TDD)

具有 Bun Test 的測試驅動開發 (TDD)

Patricia Arquette
發布: 2024-12-29 17:15:15
原創
952 人瀏覽過

測試驅動開發 (TDD) 是一種用於編寫乾淨、無錯誤程式碼的強大方法。在本文中,我們將探索如何使用 Bun 的內建測試運行器 Bun Test 來實現 TDD,該運行器以其速度和簡單性而聞名。

什麼是TDD?

測試驅動開發(TDD)是一種在程式碼之前編寫測試的軟體開發實踐。 TDD 實踐指導實現並透過迭代編寫、測試和重構週期確保功能。

TDD 是一個遵循以下步驟的開發流程:

  • 為所需的功能編寫測試。
  • 定義您想要涵蓋的所有測試場景。
  • 執行測試並驗證它是否失敗(因為功能可能不完整或尚未涵蓋所有場景)。
  • 更新並重構程式碼,使測試通過,同時確保所有測試成功。

這個迭代過程旨在產生健壯且經過良好測試的程式碼。

使用 Bun 設定您的 JavaScript 項目

如果您尚未安裝 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 已經有一個原生的加法運算子。這使我們能夠專注於建立測試而不是邏輯的複雜性。
計劃如下:

  • 建立一個calculator.ts 文件,我們將在其中定義一個最初傳回 0 的 sum() 函數。
  • 為 sum() 函數編寫測試,涵蓋多個測試案例。
  • 運行測試並確認它們失敗。
  • 更新 sum() 函數的邏輯以使測試通過。
  • 重新執行測試以確保我們的實作正確。

建立計算器.test.js 文件

在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() 區塊指定要測試的特定場景。以下是每個測試的作用:

  1. 檢定:兩個正數相加
    • 說明:「應傳回兩個數字總和(皆為正數)」
    • 此測試檢查 sum 函數是否正確計算兩個正整數的總和。
    • 範例:sum(2, 3) 預期回傳 5。
  2. 檢定:將負數和正數相加
    • 說明:「應傳回兩個數字總和(其中一個為負數)」
    • 此測試驗證 sum 函數是否可以正確處理一個數字為負數的情況。
    • 範例:sum(-1, 2) 預期回傳 1。

這些測試確保 sum 函數的行為符合基本加法場景的預期,涵蓋正數和混合(正和負)輸入。

建立計算器.ts 文件

現在,您可以建立導出 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.
登入後複製
登入後複製
登入後複製

Test-Driven Development (TDD) with Bun Test

現在我們可以調整計算器中sum()函數的邏輯了。調整sum()函數的邏輯:

mkdir tests
touch tests/example.test.js
登入後複製
登入後複製
登入後複製

現在,如果您執行測試,您將獲得「綠色」✅ 狀態。

Test-Driven Development (TDD) with Bun Test

使用資料集重構測試

如果你想在不同的場景(輸入值)下執行相同的測試,可以使用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;
}
登入後複製

資料集是一個陣列的陣列。每個內部數組代表一個測試案例,其中元素對應於:

  • a(要加的第一個數字),
  • b(要加的第二個數字),
  • 預期(sum(a, b) 的預期結果)。

describe 函數將與 sum 函數相關的所有測試分組到一個區塊下,以便更好地組織。

在describe()區塊中,it.each(dataset)迭代資料集數組中的每一行。
「%d 和 %d 的和應該是 %d」是測試的描述模板,其中 %d 在每次迭代期間被替換為資料集中的實際數字。
例如,第一次迭代產生描述:「2 和 3 的總和應為 5」。

在回呼函數(a,b,expected)中,資料集中每一行的元素被解構為變數:a,b,expected。然後,在測試中,使用 a 和 b 呼叫 sum 函數,並使用 Expect() 檢查結果以確保其與預期相符。

為什麼要使用 it.each() (或 test.each())?

  • 效率:您可以在單一資料集中定義所有測試案例並循環遍歷它們,而不是為每個案例編寫單獨的 it() 或 test() 區塊。
  • 可讀性:測試邏輯簡潔,資料集使得新增或修改測試案例變得容易,無需重複程式碼。
  • 可擴充性:在處理多個測試案例時非常有用,特別是當被測試的邏輯在不同用例之間相似時。

另一個實際例子:計算平均值

為了展示 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
登入後複製
登入後複製
登入後複製

Test-Driven Development (TDD) with Bun Test

所有測試都應該通過。
在這種情況下,實作已經經過測試,因此不需要進一步重構。但是,請務必花時間檢查您的程式碼以進行改進。

測試覆蓋率

測試覆蓋率是衡量自動化測試期間執行的程式碼庫百分比的指標。它提供了有關測試驗證程式碼的效果的見解。
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);
  });
});
登入後複製
登入後複製
登入後複製

Test-Driven Development (TDD) with Bun Test

為什麼覆蓋範圍很重要?

  • 識別測試中的差距:覆蓋率報告突出顯示程式碼的哪些部分未經測試。這可以幫助您確保關鍵邏輯不會被忽視。
  • 提高程式碼品質:高覆蓋率確保邊緣情況、錯誤處理和業務邏輯得到徹底測試,減少出現錯誤的可能性。
  • 對重構充滿信心:如果您有經過良好測試的程式碼庫,您就可以充滿信心地進行重構,因為您知道您的測試會捕獲回歸。
  • 更好的維護:具有高測試覆蓋率的程式碼庫更容易維護,因為您可以在更新期間檢測到意外的變更或副作用。
  • 支援 TDD:對於實踐測試驅動開發的開發人員來說,監控覆蓋範圍可確保測試與實作保持一致。

平衡覆蓋目標

雖然高測試覆蓋率很重要,但這並不是衡量程式碼品質的唯一標準。旨在進行有意義的測試,重點是應用程式的功能、邊緣情況和關鍵部分。實現 100% 的覆蓋率是理想的,但不要以編寫不必要或瑣碎的測試為代價。

結論

使用 Bun Test 的測試驅動開發 (TDD) 使開發人員能夠透過首先專注於需求並透過迭代測試確保功能來編寫乾淨、可維護且健壯的程式碼。透過利用 Bun 快速且有效率的測試工具,您可以簡化開發流程並自信地處理邊緣情況。採用 TDD 不僅可以提高程式碼質量,還可以培養從一開始就編寫可測試的模組化程式碼的心態。從小事做起,經常迭代,讓您的測試指導您的實施。

以上是具有 Bun Test 的測試驅動開發 (TDD)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板