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
모 스타트업에서 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
'개발이야기' 카테고리의 다른 글
Funtional Programming은 어떻게 가능하게 되었을까? (0) | 2021.11.15 |
---|---|
AWS S3 이미지 업로드 Spring으로 사용해보기 (2) | 2021.11.14 |
JWT 토큰인증 방식을 사용한 소셜로그인 구현하기 (5) | 2021.11.05 |
AWS Elastic Beanstalk으로 개발서버를 구축해본 이야기 (0) | 2021.10.13 |
Github Action 으로 CI workflow 생성해보기(w/ Spring Boot) (0) | 2021.10.05 |