이벤트 기반 시스템 테스트: Fixtures 대신 재생을 활용한 접근법
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
- 대상: Rails 또는 이벤트 기반 아키텍처를 사용하는 개발자 및 QA 엔지니어
- 난이도: 중급 이상 (이벤트 소싱 원리 및 테스트 전략 이해 필요)
핵심 요약
- 기존 테스트 방식의 문제:
Fixtures
는 데이터의 오래된 상태를 기반으로 테스트하며, 데이터베이스 의존성이 높음.Mocks
는 시스템의 실제 동작을 왜곡하고, 비즈니스 로직과 분리됨.- 이벤트 기반 테스트의 핵심:
- 이벤트 재생을 통해 비즈니스 규칙을 테스트하고, 데이터베이스 없이도 상태를 확인 가능.
- 예:
Events::BalanceWithdrawn
을 통해 과다 인출 시 예외 처리를 검증. - 도구 활용 예시:
RailsEventStore
의 테스트 헬퍼,Eventide
의 메시지 기반 테스트,Cucumber
의 인간 중심 스펙 작성.
섹션별 세부 요약
1. 전통적인 테스트 방식의 한계
- Fixtures:
- 데이터베이스에 의존하며, 시간이 지나면 불일치 발생.
- 예:
user.reload.balance
로 상태를 확인하지만, 비즈니스 로직이 아닌 상태를 검증. - Mocks/Factories:
- 복잡한 설정과 성능 저하 문제 존재.
2. 이벤트 기반 테스트의 핵심 원리
- 이벤트 재생:
Events::UserRegistered
,Events::BalanceDeposited
등 이벤트 기록을 기반으로 시스템 동작 재현.- 예:
Account.new(events).withdraw(200)
로 비즈니스 규칙 검증 (과다 인출 시Account::InsufficientFunds
예외 발생). - 비즈니스 로직 테스트:
Handlers::Loyalty
와 같은 프로젝션 처리기를 통해 사용자 등급 업그레이드 등 복잡한 비즈니스 로직 검증.
3. 실무 적용 사례 및 도구
- 프로덕션 데이터 재생:
EventStore.load("prod_order_123")
을 통해 실제 주문 흐름 재현 (예:OrderProjection.status
확인).- 추천 도구:
RailsEventStore
: 테스트 헬퍼 제공.Eventide
: 메시지 기반 테스트.Cucumber
: 인간 중심 스펙 작성.
4. 이벤트 기반 테스트 도입 전략
- 점진적 도입:
- 핵심 기능에 이벤트 발행 추가.
- 기존 테스트 유지 후, 이벤트 기반 테스트 작성.
- 리팩토링 과정에서 점진적 이관.
- 주의 사항:
- 단순 CRUD 시스템에는 과도한 복잡성 유발.
- 기존 시스템은 이벤트 소싱 도입 전 테스트 전략 변경 필요.
결론
- 이벤트 기반 테스트 도입 시:
Fixtures
대신 이벤트 재생을 통해 비즈니스 규칙 중심으로 테스트 설계.RailsEventStore
와 같은 도구 활용으로 데이터베이스 의존성 제거 및 테스트 효율성 향상.- 점진적 전환을 통해 기존 테스트와의 호환성 유지.