TDD(테스트 주도 개발)는 들어봤지만, BDD(행위 주도 개발)는 잘 모르시는 분들을 위해 BDD의 기본을 설명합니다.
BDD는 "시스템의 동작을 언어로 작성하는" 개발 방법론입니다.
BDD에서는 마치 소설을 쓰는 것처럼 테스트 시나리오를 기술합니다:
Given(전제): 예약이 1건 있는 상태에서
When(행위): 취소를 실행하면
Then(결과): 상태가 "cancelled"로 변경된다
Given: 테스트를 시작하기 전의 상태
- When: 사용자가 수행하는 동작
- Then: 기대되는 결과
| 관점 | TDD | BDD |
|---|
| 테스트 단위 | 함수/메서드 | 사용자 동작 |
| 시점 | 구현자의 관점 | 사용자의 관점 |
| 테스트명 | test_calculate_total() | test_확인된 예약을 취소하면_cancelled가 된다 |
BDD는 TDD의 상위 호환 위치에 있습니다. 구현 상세보다는 "사용자가 무엇을 하는지"에 초점을 맞춥니다.
| 사용해야 할 경우 | 사용하지 않아야 할 경우 |
|---|
| ✅ 사용자 동작이 있는 애플리케이션 (Web, API) | ❌ 데이터 변환/계산 처리 (TDD로 충분) |
| ... | |
# tests/test_reservation_bdd.py
import pytest
from domain.entities import Reservation, ReservationStatus, GuestCount
...
// tests/reservation.behavior.test.ts
import { describe, it, expect } from "vitest";
import { Reservation, ReservationStatus } from "../src/domain/entities";
...
BDD는 다음과 같은 방법론과 결합하면 효과적입니다:
DDD: 도메인 모델의 유스케이스를 Given-When-Then으로 표현
- 클린 아키텍처: UseCase 계층 테스트에 BDD가 최적
- TDD: BDD는 TDD의 상위 호환입니다. 행위 테스트는 BDD, 단위 테스트는 TDD
BDD는 "사용자가 시스템을 어떻게 사용하는지"를 Given-When-Then 형식으로 기술하고, 이를 그대로 테스트로 실행하는 방법론입니다.
| 포인트 | 내용 |
|---|
| 시점 | 구현자가 아닌 사용자의 관점 |
| 형식 | Given-When-Then |
| 테스트명 | 한국어로 상황을 기술함 ("~한 상태에서, ~한다") |
TDD가 "함수 레벨"의 테스트라면, BDD는 "시스템 레벨"의 테스트입니다. 두 가지를 적절히 사용함으로써 더 높은 유지보수성을 가진 코드를 만들 수 있습니다.
본 기사는 개인 Zenn에서도 공개되었습니다.