Fixture Monkey

Daniel_Yang·2024년 11월 10일
0

나의 결론

단순함. 특히, 테스트 코드도 길어지면 한숨이 나오는데, 가독성이 크게 향상되었다.
무작위 데이터를 쉽게 만들 수 있는게 맘에 들었다. 불필요한 것까지 하드코딩하는 것보다 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 사용해보기
올리브영 테크블로그

0개의 댓글

관련 채용 정보