BDD — 振舞駆動開発

一言で

システムの振る舞いを「Given-When-Then」で記述し、自动测试として使う。

Given-When-Then フォーマット

Given(前提)
予約が1件ある状態で
When(操作)
キャンセルを実行したら
Then(結果)
ステータスが「cancelled」になる

TDD との違い

TDD — 関数単位

関数の入出力をテスト
実装 details が対象

BDD — ユーザー視点

ユーザーの操作をテスト
振舞い details が対象

BDDはTDDの上位互換。実装詳細ではなく「何が起きるか」に焦点。

いつ使うか

対象
ユーザー操作があるアプリ(Web、API)
要件を「〜の場合、〜する」形式で整理したい
DDDのユースケースをテストしたい
データ変換・計算処理(TDDで十分)
使い捨てスクリプト

コード例 — Python pytest

# tests/test_reservation_bdd.py
import pytest
from domain.entities import Reservation, ReservationStatus, GuestCount

class TestReservationCancellation:
    """予約キャンセルの振舞い"""

    def test_確認済み予約をキャンセルすると_cancelled_になる(self):
        # Given: 確認済みの予約がある
        reservation = Reservation(
            id="R001", guest_name="田中",
            party_size=GuestCount(4), date="2026-06-01",
            status=ReservationStatus.CONFIRMED,
        )
        # When: キャンセルする
        reservation.cancel()
        # Then: ステータスが cancelled になる
        assert reservation.status == ReservationStatus.CANCELLED

    def test_未確認の予約はキャンセルできない(self):
        # Given: 未確認(PENDING)の予約
        reservation = Reservation(
            id="R002", guest_name="佐藤",
            party_size=GuestCount(2), date="2026-06-02",
            status=ReservationStatus.PENDING,
        )
        # When + Then
        with pytest.raises(ValueError, match="Confirmedのみ"):
            reservation.cancel()

コード例 — TypeScript vitest

// tests/reservation.behavior.test.ts
import { describe, it, expect } from "vitest";
import { Reservation, ReservationStatus } from "../src/domain/entities";

describe("予約キャンセルの振舞い", () => {
  it("確認済み予約をキャンセルすると cancelled になる", () => {
    // Given
    const reservation = new Reservation({
      id: "R001", guestName: "田中",
      partySize: new GuestCount(4), date: "2026-06-01",
      status: ReservationStatus.Confirmed,
    });
    // When
    reservation.cancel();
    // Then
    expect(reservation.status).toBe(ReservationStatus.Cancelled);
  });

  it("未確認の予約はキャンセルできない", () => {
    // Given
    const reservation = new Reservation({
      id: "R002", guestName: "佐藤",
      partySize: new GuestCount(2), date: "2026-06-02",
      status: ReservationStatus.Pending,
    });
    // When + Then
    expect(() => reservation.cancel()).toThrow();
  });
});

組み合わせ

DDD — ユースケース→BDDシナリオ TDD — BDDの基盤(単体テスト) クリーンアーキテクチャ — UseCase層のテスト 仕様駆動開発 — 仕様→Given-When-Then
CLAUDE.md用プロンプト:
## 開発手法: BDD(振舞駆動開発)
- テストは Given-When-Then の形式で書く
- 実装詳細ではなく、ユーザーから見た振舞いをテストする
- クラス名は「Test〜の振舞い」、テスト名は日本語で状況を記述
- テストツール: Python=pytest, TypeScript=vitest
← 開発手法セレクタに戻る ← ガイド一覧に戻る