Spring

Fixture monkey

leeheefull 2022. 3. 18. 18:11

Fixture

 

테스트를 수행하는 데 필요한 정보나 오브젝트를 말한다.

 

 

 

Fixture monkey

 

테스트 수행에 필요한 픽스쳐를 간편하게 바인딩해주고 랜덤한 값을 넣어줄 수 있도록 하는 라이브러리입니다. given 단계가 길어지면서 코드의 가독성을 떨어뜨린다고 느껴져서 이를 도입하게 되었습니다. 예제를 통해서 이를 적용해 보겠습니다.

 

 

 

리팩토링 전

 

https://user-images.githubusercontent.com/58816862/158951110-54cd7ef9-75fa-411c-9408-1aa65646b990.png

 

 

 

리팩토링 후

 

https://user-images.githubusercontent.com/58816862/158963995-689f8e26-1c37-41df-b206-d22c248c5f2c.png

 

https://user-images.githubusercontent.com/58816862/158963897-7fdf2b9d-1fb1-40af-a3ad-ba9c986a1654.png

 

 

이처럼 픽스쳐 몽키를 사용합니다. 픽스쳐 몽키를 사용하면서 여러 가지 장점을 느꼈는데, 개인적으로 제가 좋다고 느낀 것을 말씀드리겠습니다.

 

 

 

랜덤한 값 바인딩

 

픽스쳐 몽키는 랜덤한 값을 바인딩해주며, 랜덤 설정 또한 어떻게 랜덤하게 할 건지 정의해줄 수 있습니다. 랜덤 값의 바인딩 기능은 테스트를 실행할 때마다 새로운 값들이 바인딩됨으로써 코드의 신뢰성을 높여줍니다.

 

FixtureMonkey fixtureMonkey = FixtureMonkey.builder()
        .defaultGenerator(FieldReflectionArbitraryGenerator.INSTANCE)
        .nullInject(0)
        .build();

 

 

 

Reflection

 

테스트를 하다 보면 테스트를 하기 위해서 실행 코드에 setters 또는 getters 등을 추가해 주는 일이 있습니다. setters를 구현하지 않으면, 리플렉션을 이용해서 값을 넣어주어야 합니다. 하지만 픽스쳐 몽키는 리플렉션을 하지 않아도 필드에 원하는 값을 주입할 수 있습니다.

 

Post post = fixtureMonkey.giveMeBuilder(Post.class)
        .set("memberId", member.getId())
        .set("boardId", board.getId())
        .sample();

 

 

 

노동력 감소

 

테스트를 하다 보면, 객체를 리스트로 생성할 때가 있을 것입니다. 객체를 리스트로 생성해주면 코드는 더욱 지저분해질 것입니다. 하지만, 픽스쳐 몽키는 객체 리스트 또한 자동으로 생성해 줍니다.

 

List<Post> posts = fixtureMonkey.giveMe(Post.class, 100);

 

 

 

가독성

 

제가 궁극적으로 픽스쳐 몽키를 사용하는 이유는 가독성 때문입니다. 위에서 설명한 것처럼 값을 자동으로 바인딩 해주며, 필드 주입도 해주고 리스트까지 생성해 준다면, given 단계의 코드량이 현저히 줄어들어 테스트 코드를 보다 쉽게 읽을 수 있습니다.

 

 

 

픽스쳐 몽키를 사용하여 테스트한 예제는 여기있습니다. 이상입니다. 수정 사항이나 피드백이 있으시다면 편하게 댓글 부탁드리겠습니다. 글 읽어 주셔서 감사합니다