Fixture monkey 1.0.17 출시

Bonjugi·2024년 6월 2일
2

Fixture Monkey?

Fixture Moneky 는 다음과 같이, 손쉽게 랜덤객체를 생성해주는 매우 유용한 도구이다.

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

처음 Fixture Monkey를 접했을땐..

처음 Fixture Monkey 를 봤을땐 몇가지 문제는 조금 걸렸었다.
(물론 충분히 유용했기 때문에 불편하다 정도였지만..)

별도로 제어하지 않는 필드들은 극단적인 값들이 할당 됐었다.
예를들어 도메인 구조상 100정도면 될 필드에, MAX_VALUE 를 설정하곤 한다.
요게 문제가 되는건 간헐적으로 발생 한다는 것이다.
작성자는 발견하지 못한채 push 하지만, 오류는 다른 사람이 수정 해야 하는건 정말 귀찮은 일이다.
극단값 설정의 취지는 이해하지만, 모든 팀원이 같은 생각을 갖도록 하는건 다른 문제가 있다.

당연히 제한값을 설정할순 있다.
jakrat.validation을 인식한다.
예를들어 @NotNull 을 붙여주면 null 을 주입하지 않는다.
하지만 엔티티에 해당 어노테이션을 달고 싶지 않았다.
invariant나 post-condition 을 좀더 중요시 하고있었기 때문이다.
테스트 도구를 위해 어노테이션을 달자고 말하기엔 더 고민이 필요했다.

또다른 문제는 type-safe 하지 못하다는것 이었다.
id 에 1000을 고정 했지만, 프로퍼티명이 바뀌면 아무 이상을 감지하지 못한다.
마찬가지로 이런건 간헐적으로 실패한다.

그럼에도 Fixture Monkey

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

적절한 버전업이 잘 되고있다.
옛날에 javax -> jakarta 로 바꼈을때 호환이 안됐었는데 jakarta 플러그인이 있어 금방 해결했던 기억이 있다.
이번 1.0에 나온 javagetter 덕분에 type-safe하게 (필드명이 바껴도 컴파일 탐지가 가능하게) 되었다.

        // 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 IDE 플러그인도 을 쓰면, 존재하지 않는 필드에 대해서는 빨갛게 표시해주기도 한다.
자동완성 기능도 매우 유용하니, Fixture Monkey를 쓰고있다면 꼭 설치를 권한다.

1.0.17 에선, 극단적인 값을 쓰지 않는 SimpleValueJqwikPlugin 이 나왔다.
그렇잖아도 일반적인 값으로 셋팅하도록 generator 를 조정해서 써야 하나 싶던 차에 반가운 소식이었다.

공식문서 가 한글이고 네이버의 오픈소스라는 점에서도 정이 간다.
예를들어, NullInjectGenerator 을 참고해서 @Column 어노테이션의 nullable을 참조하여 nullability를 제어한적이 있다.

JavaTypeArbitraryGenerator 를 참고하면 @Column 어노테이션의 size를 활용하여 제어할수 있을듯 하다.

결론은.. 여러모로 잘 지원되고 있는 프로젝트라는 느낌을 받았다.
좀더 적극적으로 써볼 예정.

3개의 댓글

comment-user-thumbnail
2024년 8월 26일

안녕하세요!

써주신 글 정말 잘 봤습니다.

혹시 해당 부분이 잘 이해가 가지 않는데 어떤 것을 제어하려고 하신 건지 여쭤봐도 될까요 ?

예를들어, NullInjectGenerator 을 참고해서 @Column 어노테이션의 nullable을 참조하여 nullability를 제어한적이 있다.
JavaTypeArbitraryGenerator 를 참고하면 @Column 어노테이션의 size를 활용하여 제어할수 있을듯 하다.
1개의 답글