Back to posts

Fixture monkey 1.0.17 출시

Fixture Monkey를 쓰면서 느낀 점과 1.0.17 업데이트 요약.

2024년 6월 2일

Fixture Monkey?

Fixture Monkey는 랜덤 객체를 손쉽게 만들어주는 유용한 도구다.

// 예)
fixtureMonkey.giveMeBuilder(Product.class)
    .set("id", 1000);

처음 접했을 때 걸렸던 점

처음엔 몇 가지가 마음에 걸렸다. (물론 충분히 유용했기 때문에 불편한 정도였다)

1. 극단값 문제

별도로 제어하지 않는 필드에 극단값이 들어간다. 예를 들어 도메인상 100 정도면 되는 필드에 MAX_VALUE가 들어간다. 이게 문제인 건 간헐적으로 발생한다는 점이다. 작성자는 놓치고 push하고, 다른 사람이 오류를 잡는다. 극단값의 취지는 이해하지만 팀 전체가 같은 생각일 순 없다.

2. 어노테이션 의존

당연히 제한값을 설정할 수는 있다. jakarta.validation도 인식한다. @NotNull을 붙이면 null을 주입하지 않는다.

하지만 엔티티에 그 어노테이션을 달고 싶지 않았다. invariant나 post-condition을 더 중요하게 보고 있었기 때문이다. 테스트 도구를 위해 어노테이션을 달자는 건 고민이 필요했다.

3. 타입 세이프하지 않음

아래처럼 id를 고정해도, 프로퍼티명이 바뀌면 감지하지 못한다. 이 역시 간헐적으로 실패한다.

그럼에도 Fixture Monkey

일단 잘 동작한다. record 타입, Jackson 객체, Lombok 객체, 복합/깊은 객체 모두 매끄럽게 된다.

버전업도 꾸준히 진행된다. 예전에 javax -> jakarta 변경 때 호환 이슈가 있었지만 jakarta 플러그인 덕분에 빨리 해결됐다.

이번 1.0에 나온 javagetter 덕분에 타입 세이프하게 쓸 수 있게 됐다. 필드명이 바뀌어도 컴파일 타임에 감지가 가능하다.

// given
FixtureMonkey sut = FixtureMonkey.builder()
    .objectIntrospector(ConstructorPropertiesArbitraryIntrospector.INSTANCE)
    .build();
 
// when
OrderRecord actual = sut.giveMeBuilder(OrderRecord.class)
    .set(javaGetter(OrderRecord::orderNo), "1")
    .set(javaGetter(OrderRecord::productName), "Line Sally")
    .minSize(javaGetter(OrderRecord::items), 1)
    .sample();
 
// then
then(actual.orderNo()).isEqualTo("1");
then(actual.productName()).isEqualTo("Line Sally");
then(actual.items()).hasSizeGreaterThanOrEqualTo(1);

javagetter를 쓰지 않더라도, IntelliJ 플러그인을 쓰면 존재하지 않는 필드는 빨갛게 표시해 준다. 자동완성도 유용하니 Fixture Monkey를 쓴다면 설치를 추천한다.

1.0.17 업데이트

1.0.17에는 극단값을 쓰지 않는 SimpleValueJqwikPlugin이 나왔다. 일반적인 값으로 generator를 조정해야 하나 고민하던 차에 반가웠다.

참고

공식 문서가 한글이고 네이버 오픈소스라는 점에서 정이 간다.

예를 들어, 아래 문서를 참고해서 @Column의 nullable을 기준으로 nullability를 제어한 적이 있다.

아래 문서를 보면 @Column의 size를 활용해 제어할 수도 있을 것 같다.

결론

여러모로 잘 지원되는 프로젝트라는 느낌을 받았다. 앞으로도 좀 더 적극적으로 써볼 예정이다.