システムの振る舞いを「Given-When-Then」で記述し、自动测试として使う。
関数の入出力をテスト
実装 details が対象
ユーザーの操作をテスト
振舞い details が対象
BDDはTDDの上位互換。実装詳細ではなく「何が起きるか」に焦点。
| 対象 | |
|---|---|
| ✅ | ユーザー操作があるアプリ(Web、API) |
| ✅ | 要件を「〜の場合、〜する」形式で整理したい |
| ✅ | DDDのユースケースをテストしたい |
| ❌ | データ変換・計算処理(TDDで十分) |
| ❌ | 使い捨てスクリプト |
# 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()
// 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();
});
});
## 開発手法: BDD(振舞駆動開発)
- テストは Given-When-Then の形式で書く
- 実装詳細ではなく、ユーザーから見た振舞いをテストする
- クラス名は「Test〜の振舞い」、テスト名は日本語で状況を記述
- テストツール: Python=pytest, TypeScript=vitest