[Test] 테스트 데이터 생성(AutoParams, Instancio, Fixture Monkey)

테스트 데이터 생성

테스트 데이터

랜덤한 테스트 데이터는 테스트의 목적을 명확하게 드러내지 못합니다. 테스트 목적에 맞는 데이터를 생성, 사용하기 위한 라이브러리들이 존재합니다.
현업에서 AutoParams, Instancio를 적용해보았는데, 아무런 생각없이 사용하고 있다는 생각이 들어 해당 라이브러리들을 비교해보고자 합니다.

AutoParams

  • @ParameterizedTest 활용
  • 어노테이션 기반으로 테스트 파라미터에 랜덤한 값을 할당, 원하는 경우 커스터마이징한 값 할당 가능
  • @AutoSource, @MethodAutoSource, @CsvAutoSource, @ValueAutoSource, @Fix, @Customization 어노테이션을 통해 값 할당
  • 객체와 관련된 로직을 작성할 때 @Customization을 활용하거나, 테스트에 불필요한 값을 @AutoSource를 활용한 경험이 있음
    • 테스트에 필요한 값을 세팅하는 경우 특별히 setter가 없는 경우 Customization 클래스에 추가 코드 작성 필요
    • 단건 객체를 사용하는 경우에는 크게 유용하지 않았으나, Collection인 경우에는 유용하게 사용할 수 있었음.

간단 예제 코드

@ParameterizedTest
@AutoSource
void testMethod(@Min(1) @Max(10) int value) {
    assertTrue(value >= 1);
    assertTrue(value <= 10);
}

Instancio

  • Generate Unit Test Data in Java Using Instancio - Baeldung
  • 오브젝트 생성 라이브러리
  • 랜덤한 값의 객체 생성에서부터 다양한 조건의 객체 생성 가능
  • record, sealed 에서도 사용 가능
  • AutoParams와 비슷한 기능 제공, but, AutoParam보다 부족한 기능.
      @ParameterizedTest
      @InstancioSource
      void singleArgument(Person person) {
          Assertions.assertNotNull(person);    
      }
    

간단 예제 코드

Person person = Instancio.of(Person.class)
    .ignore(Select.field("id"))
    .set(Select.field("birthDay"), LocalDateTime.now().minusDays(1L))
    .create();

Fixture Mokey

  • 네이버 오픈 소스 라이브러리
  • 다양한 서드 파티 모듈과 조합 사용 가능 (junit-jupiter, autoparams, jackson, javax-validation, jakarta-validation)
  • 커스터 마이징할 수 있는 다양한 옵션들이 존재
    • 조금 더 익숙해지고 다양한 기능들을 사용해봐야 할 듯
    • 기능이 많아서 복잡한 감이 있음. 학습곡선 존재
LabMonkey labMonkey = LabMonkey.labMonkeyBuilder()
	.plugin(new JavaxValidationPlugin())
    .build();

OrderSheet orderSheet = labMonkey.giveMeOne(OrderSheet.class);