ホームページ > ウェブフロントエンド > 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 ディレクトリにテスト ファイルを作成します (例: testing/example.test.js)。 Bun は、テスト用に .test.ts または .test.js で終わるファイルを自動的に検出します。

mkdir tests
touch tests/example.test.js
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

最初のテストを書く

簡単な例から始めましょう。
いくつかの数学関数を実装するための電卓ファイルを作成します。
JavaScript にはすでにネイティブの加算演算子がありますが、最初は sum() のような単純な関数に焦点を当てます。これにより、ロジックの複雑さではなく、テストの構造化に集中できるようになります。
計画は次のとおりです:

  • 最初に 0 を返す sum() 関数を定義する calculator.ts ファイルを作成します。
  • いくつかのテスト ケースをカバーする sum() 関数のテストを作成します。
  • テストを実行し、テストが失敗することを確認します。
  • テストに合格するように sum() 関数のロジックを更新します。
  • テストを再実行して、実装が正しいことを確認します。

calculator.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 関数」という名前の記述ブロック内に編成されます。 description() ブロックは、「類似した」テストをグループ化するのに役立ちます。各 it() ブロックは、テストする特定のシナリオを指定します。各テストの内容は次のとおりです:

  1. テスト: 2 つの正の数を加算する
    • 説明: 「2 つの数値の合計を返す必要があります (両方とも正です)」
    • このテストは、sum 関数が 2 つの正の整数の合計を正しく計算するかどうかをチェックします。
    • 例: sum(2, 3) は 5 を返すことが期待されています
  2. テスト: 負の数と正の数を加算する
    • 説明: 「2 つの数値の合計を返す必要があります (1 つは負です)」
    • このテストは、sum 関数が 1 つの数値が負であるシナリオを正しく処理することを検証します。
    • 例: sum(-1, 2) は 1 を返すことが期待されています

これらのテストは、正の数と混合 (正と負) 入力の両方をカバーし、基本的な加算シナリオで sum 関数が期待どおりに動作することを確認します。

calculator.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() 関数のロジックを調整できます。ts 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 (加算する 2 番目の数値)、
  • expected (sum(a, b) の期待される結果)。

describe 関数は、整理しやすくするために、sum 関数に関連するすべてのテストを 1 つのブロックにグループ化します。

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート