나의 결론
단순함. 특히, 테스트 코드도 길어지면 한숨이 나오는데, 가독성이 크게 향상되었다.
무작위 데이터를 쉽게 만들 수 있는게 맘에 들었다. 불필요한 것까지 하드코딩하는 것보다 set()을 활용해 필요한 필드만 명시할 수 있어 유지보수가 쉬워보인다.
테스트 데이터를 많이 생성해야할 때 좋아보인다.
정의
Fixture Monkey는 테스트 객체를 쉽게 생성하고 조작할 수 있도록 고안된 Java 및 Kotlin 라이브러리. Naver 내부 라이브러리로 처음 개발되서 테스트 객체 생성 간소화에 핵심 역할
사용 이유
사이드 프로젝트를 하면서 테스트 코드 작성 시 Stub을 생성하는 과정에서 테스트용 데이터를 쉽게 만들 수 있는 방법에 대해 고민해보다가 해당 라이브러리를 활용하게 되었다. Fixture Monkey는 이를 간단한 코드로 처리할 수 있어 개발 생산성을 높이는 데 기여했다.
키워드
- 간단함: 한 줄로. 익숙한 Builder 패턴으로. Properties 사용자 정의 가능
- 재사용성: Fixture Monkey를 활용하면 여러 테스트에서 인스턴스 명세를 재사용할 수 있어 시간과 노력을 절약 가능 => 더 높이는 기능: ArbitraryBuilder 등록, InnerSpec
- 무작위: 중요한 properties 이외는 알아서 채워준다.
- Property-based Testing: 테스트에서 입력값을 무작위로 생성하여 다양한 케이스를 자동으로 실행하고, 특정 속성(Property)이 항상 성립하는지 검증하는 기법
=> 수많은 랜덤 데이터로 예상치 못한 경계 케이스를 발견
사용환경
- JDK 1.8 이상 (또는 Kotlin 1.8 이상), JUnit 5 platform, jqwik 1.7.3
내부동작
- Java Reflection 기반
- Arbitrary Value Generation (랜덤 데이터 생성)
- Java의 타입 정보(예: int, String, List<@@>)를 기반으로 기본값을 자동 생성
- 재귀적 객체 생성 (Nested Object 지원)
- Product 내부에 Category 같은 다른 객체가 있다면, 이를 자동으로 생성합니다.
랜덤하지만 현실적인 데이터를 원한다면?
- Faker 라이브러리를 활용하여 현실적인 데이터 생성
- 현실적인 제품명, 주소, 이메일 등을 자동 생성 가능
- 필드 값을 특정 규칙에 맞게 변경하기 manipulate()
- manipulate()를 사용하면 특정 조건을 만족하는 데이터만 필터링하거나 가공할 수도 있다.
주의사항
- Reflection 사용에 따른 오버헤드: Fixture Monkey는 테스트 환경용으로 설계. 운영 코드에는 포함하지 않는 것을 권장. Reflection 기반이기 때문에 객체 직접 생성보다 느릴 수 있다. + 고성능이 중요한 대규모 테스트도 좀...
- set(), giveMeBuilder() 등 방법에 따라 불필요한 데이터 생성되지 않도록 주의할 필요
레퍼런스
네이버 공식 레퍼런스
[Java] Fixture Monkey 사용해보기
올리브영 테크블로그