개발자

springboot 테스트코드 작성 방법

5월 21일조회 1,285

테스트코드에 관해 공부하게되었습니다. 정해진 답은 없는 것 같은데 잘못 이해하고 사용하고 있다는 생각이 들어서 질문 글을 올리게 되었습니다. 선배님들의 도움이필요합니다. 유저와 게시글 entity가 있고 게시글을 생성하는 기능을 controller service repository 로 작성했습니다. 1. 단위테스트를 작성할때 mock을 사용하여 Service.save 메서드에 대해 any()와 같이 저장할 객체와 저장된 객체를 제가 직접 지정하다보니 끼워맞춰서 성공을 받아내는 느낌이 강해서 어떻게 사용해야 하는지 궁금합니다. 2. 여러 글들을 읽어보고 고민해보니 Service.duplicate와 같이 이메일 중복체크와 같은 예외가 발생하는 것은 단위테스트로 작성하고 나머지 즉, crud와 같이 DB를 사용해야하는 기능은 controller 통합테스트를 작성해서 확인해야할 것 같은데 맞는 생각인지 궁금합니다. 3. controller 통합테스트에서 update와 같이 의존성이 많이 엮여있을 때 작성방법이 궁금합니다. 제가 생각한 바는 아래와같은데 어디까지 직접생성해주어야 할까요.. - 사용자를 저장하고 게시글도 저장한다. - 게시글을 읽어와 사용자가 게시글의 작성자인지 확인한다 - 게시글을 수정한다 - 수정된 게시글에서 빈 값은 없는지 등 유효성 검사를 하고 게시글을 저장한다 - 다시 게시글을 읽어와서 정상적으로 수정되었는지 확인한다. 아직 부족한것이 많아 단어사용이나 방식이 정말 바보같을 수 있는 부분 양해부탁드립니다. 긴 글 읽어주셔서 감사드립니다. 마지막으로 혹시 참고할 만한 springboot 테스트 코드나 책 또는 강의가 있다면 알려주시면 좋겠습니다. 정말 감사드립니다.

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 1

인기 답변

이양일님의 프로필 사진

안녕하세요! 제가 알고 있는 내용 안에서 말씀드려보겠습니다. - 1번 질문 단위 테스트를 어느정도의 범위로 작성하셨는지 모르겠습니다만, 저의 경우 각 엣지 케이스에 대한 파라미터를 넣고 이에 대한 save 를 비지니스 로직상에서 기대하는 값으로 했는지를 검증하는 형태로 진행합니다. Mockito.any() 를 써서 단순 통과를 하기 보다는 Mockito.verify 와 ArgumentCaptor 를 활용하여 실제 save 호출시 주입된 객체가 내가 기대했던 값과 동일한지를 검증하는 코드를 추가로 작성합니다. - 2번 질문 말씀하신 controller 통합 테스트가 Integration 테스트를 말씀하시는거라 생각하고 답변 드리겠습니다. Mock 객체를 생성하여 테스트하는 단위 테스트와 Integration 테스트를 작성하는 케이스가 꼭 말씀하신 형태대로 작성하지는 않고 오히려 같은 기능이라도 단위테스트와 Integration 테스트를 둘다 작성하는 경우가 많습니다. 단위테스트는 작게 나눈 각 기능 단위별로 내가 기대하는 대로 동작하는지를 Mock 객체로 검증을 하고, 실제 DB 혹은 타 솔루션과 연동했을 때 내가 기대한 Mock 객체대로 Deserialize 를 하거나 Query 결과가 나오는지, Response 를 만들어주는지 등을 검증하기 위해 Integration 테스트를 진행하는 케이스들도 많기 때문입니다. 이건 Application 과 비지니스 로직 구현을 어떻게 했느냐에 따라 달라질 수 있는 부분이기 때문에 다양한 케이스별로 검증을 하도록 고민을 해보셔야할듯 합니다. DB 연동 부분도 다양한 방법이 있는데요, 테스트 환경으로 구축하신 DB 에 실제로 연동해서 하는 방법도 있고 Spring 에서 제공하는 Embedded Database(https://docs.spring.io/spring-framework/reference/data-access/jdbc/embedded-database-support.html) 를 활용하는 방향도 생각해볼 수 있으니 이부분도 참고해보세요. - 3번 질문 사실 이게 가장 어렵고 정답이 없는 영역이긴 한데요, 최대한 다양한 케이스에 대해 검증을 할 수 있게 테스트 코드를 작성하셔야 한다고 말씀드리고 싶습니다. 예를 들어 "사용자를 저장하고 게시글도 저장한다" 라는 테스트 코드를 하나만 작성하고 끝나는 게 아니라 사용자를 저장하고 게시글도 저장하려고 했는데 엣지 케이스에 해당하는 게시글을 작성하면 어떻게 되는지?(예를 들어 엄청 큰 게시글을 저장하거나 이미 많은 게시글을 저장한 상태 혹은 게시글 내용이 없는 케이스 등등) 사용자를 저장하는 과정에서 오류가 발생할 때 에러 응답을 어떻게 주는지 등 서비스 스펙에 맞는 여러 케이스를 고민하시고 각 케이스별 테스트 코드를 작성하시는게 좋습니다. 끝으로 참고할 만한 테스트 코드나 강의를 알고 있는건 없고 이전에 포스팅 했던 글 중에 테스트 코드와 관련된 글이 있어 참고차 링크 드립니다. - 📈 개발자여, 테스트 커버리지에 집착 말자: https://careerly.co.kr/comments/100598?utm_campaign=self-share 저의 짧은 지식이 조금이나마 도움이 되시길 바랍니다.

profile picture

익명

작성자

6월 9일

늦게 댓글을 남긴점 죄송합니다 정말자세하고 친절한 답변 감사해요!! 앞으로의 테스트코드 작성에 많은 도움이 될 것 같습니다 :)

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!