개발자
테스트코드에 관해 공부하게되었습니다. 정해진 답은 없는 것 같은데 잘못 이해하고 사용하고 있다는 생각이 들어서 질문 글을 올리게 되었습니다. 선배님들의 도움이필요합니다. 유저와 게시글 entity가 있고 게시글을 생성하는 기능을 controller service repository 로 작성했습니다. 1. 단위테스트를 작성할때 mock을 사용하여 Service.save 메서드에 대해 any()와 같이 저장할 객체와 저장된 객체를 제가 직접 지정하다보니 끼워맞춰서 성공을 받아내는 느낌이 강해서 어떻게 사용해야 하는지 궁금합니다. 2. 여러 글들을 읽어보고 고민해보니 Service.duplicate와 같이 이메일 중복체크와 같은 예외가 발생하는 것은 단위테스트로 작성하고 나머지 즉, crud와 같이 DB를 사용해야하는 기능은 controller 통합테스트를 작성해서 확인해야할 것 같은데 맞는 생각인지 궁금합니다. 3. controller 통합테스트에서 update와 같이 의존성이 많이 엮여있을 때 작성방법이 궁금합니다. 제가 생각한 바는 아래와같은데 어디까지 직접생성해주어야 할까요.. - 사용자를 저장하고 게시글도 저장한다. - 게시글을 읽어와 사용자가 게시글의 작성자인지 확인한다 - 게시글을 수정한다 - 수정된 게시글에서 빈 값은 없는지 등 유효성 검사를 하고 게시글을 저장한다 - 다시 게시글을 읽어와서 정상적으로 수정되었는지 확인한다. 아직 부족한것이 많아 단어사용이나 방식이 정말 바보같을 수 있는 부분 양해부탁드립니다. 긴 글 읽어주셔서 감사드립니다. 마지막으로 혹시 참고할 만한 springboot 테스트 코드나 책 또는 강의가 있다면 알려주시면 좋겠습니다. 정말 감사드립니다.
답변 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 저의 짧은 지식이 조금이나마 도움이 되시길 바랍니다.
익명
작성자
2024년 06월 09일
늦게 댓글을 남긴점 죄송합니다 정말자세하고 친절한 답변 감사해요!! 앞으로의 테스트코드 작성에 많은 도움이 될 것 같습니다 :)
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 05월 21일
테스트 코드 작성에 대한 여러 질문에 답하겠습니다. 1. mock의 사용: 모킹(Mocking)은 테스트에서 일반적으로 외부 서비스나 클래스에 의존하는 부분을 자체적으로 제어할 수 있는 더미(dummy) 객체를 만드는 것을 말합니다. 따라서 mock 객체의 반환값이나 동작 방식 등을 우리가 원하는대로 설정해줄 수 있습니다. 그래서 많은 경우, 실제 객체를 사용하는 것보다는 테스트하기 쉽습니다. Mock을 사용하여 Service.save 메소드를 테스트 할 때, 필요한 입력값과 예상되는 출력값을 명확히 정의하고 이를 바탕으로 테스트를 작성해야 합니다. 2. 단위 테스트 vs 통합 테스트: 서비스 메서드 등 복잡하지 않고 DB 접근이 없는 기능에 대해서는 보통 단위 테스트(Unit Test)를 진행하며, DB와 연계된 CRUD 등의 로직은 주로 통합 테스트(Integration Test)에 의해 검증됩니다. 이렇게 하면 각각의 기능들이 잘 동작하는지 확인할 수 있고, 전체 시스템이 원활하게 동작하는지도 검증할 수 있습니다. 3. Controller 통합테스트 작성법: 주어진 시나리오에 대해 테스트를 진행하려면, 필요한 모든 데이터를 준비하고 주어진 로직을 따라 테스트를 작성해야 합니다. 이 경우, 사용자 정보와 게시글 등 필요한 모든 데이터를 DB에 사전에 저장하고 이를 기반으로 테스트할 수 있습니다. Spring Boot에서의 테스트 작성에 관해 더 배우고 싶다면, "Spring Boot in Action"이나 "Learning Spring Boot 2.0 - Second Edition" 같은 책을 참고하실 수 있습니다. 또는 "Spring Framework Guru"나 "Baeldung"와 같은 웹사이트에서 여러 가지 예제와 함께 테스트 작성 방법을 자세히 배울 수 있습니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!