테스트 데이터 설정에 비즈니스 로직을 사용하는 것은 심각한 문제를 야기합니다.
문제점: 비즈니스 로직 사용의 유혹과 속도 저하
유효한 객체 생성을 위해 User::RegistrationService 같은 비즈니스 로직을 사용하는 것은 매력적이지만, 이는 테스트 스위트에 다음과 같은 부정적인 영향을 미칩니다.
-
느린 실행 속도: 유효성 검사, 콜백, DB 트랜잭션 등 모든 테스트마다 막대한 오버헤드를 발생시킵니다.
-
테스트의 취약성: 서비스 로직 변경 시 관련 없는 테스트가 실패하여 불필요한 유지보수 비용을 증가시킵니다.
-
격리 부족: 테스트가 설정 서비스에 암묵적으로 의존하여 단위 테스트 원칙을 위반합니다.
해결책: Factory Bot을 통한 효율적인 테스트 설정
테스트 설정의 핵심은 테스트에 필요한 최소한의 상태를 정의하는 것이지, 전체 로직을 실행하는 것이 아닙니다. Factory Bot은 이 목적에 최적화된 도구입니다.
-
최소한의 팩토리 정의: 핵심 모델에 대한 간단한 팩토리부터 시작합니다.
-
연관 관계 처리:
association헬퍼를 사용하여 의존하는 레코드를 생성합니다. -
Trait을 사용하여 복잡한 상태 정의: Trait은 특정 상태(예:
:premium,:subscribed)를 정의하여 복잡한 서비스 로직을 대체하며, 필요한 상태를 빠르게 설정하고 서비스 로직 실행을 건너뜁니다.
build를 통한 최대 속도 최적화
모든 테스트가 데이터베이스 영속성을 필요로 하지는 않습니다. Factory Bot은 데이터베이스 상호작용 없이 객체를 생성하여 성능을 향상시키는 메서드를 제공합니다.
-
create: DB에 저장, 유효성 검사 실행 (속도: 중간) -
build: 인메모리 객체 생성, DB 저장 안 함 (속도: 빠름) -
build_stubbed: 인메모리 객체 생성, 영속성 메서드 모의 (속도: 가장 빠름) -
예: 뷰나 프레젠터 테스트 시
build_stubbed를 활용하여 데이터베이스 접근 없이 빠르게 테스트합니다.