본문 바로가기
개발이야기

Junit 단위테스트에서 AutoParams 사용해보기(feat. TDD)

by janiiiiie 2021. 11. 6.
반응형

 

Overview

기능을 개발하다 보면, 내가 만든 로직이 제대로 돌아가는지 항상 테스트를 해보게 됩니다. 물론 매번 서버를 실행시켜서 API 테스터를 활용해 해볼 수 있지만, 매번 서버를 재실행하여 확인하는 건 시간이 매우 오래걸립니다.(실무급으로 가면.. 프로젝트가 상당히 크기 때문에 재기동에도 시간이 걸리게 되죠..ㅠ)

 

해서, Service layer에 한정하여 특정 값을 넣었을 때 잘 돌아가는지 빠르게 확인하고 이후 CI/CD에서 테스트 자동화를 위해 Junit으로 단위테스트를 작성하고 있는데요, 테스트 코드를 실행할 때는 미리 값을 전부 셋팅을 해주어야 합니다. 어쩌다 돌아보면 코드를 쓰는 것 보다 값을 셋팅하는데 더 많은 시간을 쏟고 있더군요😂😂 

 

그래서 드는 생각:  아, 이런 값은 내가 항상 지정하지 않아도 자동으로 임의의 값을 생성해주는 게 없을까? 를 고민하게 되었습니다.

 

    private static final long USER_NO = 1;
    private static final String USER_ID = "아이디";
    private static final String PASSWORD = "test123##";
    private static final String NEWPASSWORD = "test*23#";
    private static final String TOKEN = "abc123";

이런 값들이나... 굳이 값을 꼭 셋팅하지 않아도 되는 객체(dto)들도 알아서 아무 값을 생성해주면 좋겠다..라고 생각했었습니다. 

 

 

 

AutoParams 오픈소스 발견!

 

https://github.com/JavaUnit/AutoParams

 

GitHub - JavaUnit/AutoParams: Enjoy your TDD! AutoParams is an arbitrary test data generator for parameterized tests in Java ins

Enjoy your TDD! AutoParams is an arbitrary test data generator for parameterized tests in Java inspired by AutoFixture. - GitHub - JavaUnit/AutoParams: Enjoy your TDD! AutoParams is an arbitrary te...

github.com

 

모 스타트업에서 CTO로 계시는 개발자 분이 개발하신 오픈소스 라이브러리 입니다. ParameterizedTest를 할 때, 임의의 값을 생성해주어 미리 BeforeEach 처럼 데이터를 셋팅하지 않아도 된다는 장점이 있었습니다. 꾸준히 버전도 업데이트가 되어가고 있는거 같네요!

 

아래와 같은 테스트를 할 때, 보면 미리 셋팅해야 하는 값들이 많은데, @AutoSource을 사용하면 알아서 값을 생성해주기 때문에 테스트코드 작성에만 집중을 할 수 있었습니다.

 

@ParameterizedTest
@AutoSource
void 신규_빵집일_경우_사용자조회_후_데이터를_저장한다(CreateBakeryRequest createBakeryRequest, Members members, String token, Long memberId) {
  given(authService.getMemberId(token)).willReturn(memberId);
  when(bakeriesQuerydslRepository.isBakeryExisted(createBakeryRequest.getLatitude(), createBakeryRequest.getLongitude())).thenReturn(false);
  when(memberRepository.findById(memberId)).thenReturn(Optional.ofNullable(members));

  Bakeries data = Bakeries.builder()
          .name(createBakeryRequest.getBakeryName())
          .latitude(createBakeryRequest.getLatitude())
          .longitude(createBakeryRequest.getLongitude())
          .members(members)
          .telNumber(createBakeryRequest.getTelNumber())
          .address(createBakeryRequest.getAddress())
          .businessHour(createBakeryRequest.getBusinessHour())
          .basicInfoList(createBakeryRequest.getBasicInfoList())
          .websiteUrlList(createBakeryRequest.getWebsiteUrlList())
          .imgPath(createBakeryRequest.getImgPathList())
          .build();

  bakeriesService.createBakery(token, createBakeryRequest);
  then(bakeriesRepository).should().save(refEq(data));
}

 

 

기본형/객체 이외에도 enum이나 제너릭 등 다양한 형태도 대응이 가능하다는 최근 이슈글들과 README 문서글에 보이고 있는 것 같습니다. 단위테스트를 위하여 값을 셋팅하는 작업을 할 때 배 보다 배꼽이 더 큰 상황이 되어가는 걸 느끼신다면 이 오픈소스를 활용해보면 매우 유용할 것 같다고 생각합니다 :) 

 

 

https://github.com/depromeet/bread-map-backend/pull/87

 

단위테스트 작성 by Jane096 · Pull Request #87 · depromeet/bread-map-backend

 

github.com

 

반응형