인프런 커뮤니티 질문&답변

팡휘님의 프로필 이미지
팡휘

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

회원 리포지토리 테스트 케이스 작성

Test를 만들땐 항상 처음부터 시작하는 식으로 코드를 짜나요?

작성

·

578

·

수정됨

1

항상 Member객체를 만들고 시작하시는 것 같은데, 실제로는 멤버객체가 이미 있고 그걸 find하든 save하든 할거아니예요?? Test할땐 항상 처음부터 시작한다고 생각하고 로직을 짜나요??

그리고 Test코드를 작성하는 이유는 무엇인가요? 기능 테스트를 할 때 항상 postman으로 했는데 그렇게 하는 것과 차이점이 있을까요 ???

그리고 테스트코드에서는 main 디렉토리에 있는 클래스를 자유롭게 접근할 수 있는건가요? 예시에서도 MemoryMemberRepository를 쓰시길래 궁금해서 여쭤봅니다

답변 1

3

안녕하세요, 팡휘 님. 공식 서포터즈 y2gcoder 입니다.

총 세 가지 질문을 해주셨다고 생각하고 하나씩 답변 드리겠습니다.

그리고 Test코드를 작성하는 이유는 무엇인가요? 기능 테스트를 할 때 항상 postman으로 했는데 그렇게 하는 것과 차이점이 있을까요 ???

=> 먼저 이 질문부터 답변드려야 할 것 같습니다. 개인적으로 테스트 코드를 작성하는 가장 큰 이유는 코드를 변경이나 리팩토링할 때 이전에 잘 작동하던 코드들이 잘 작동하는지 검증하기 위해서라고 생각합니다. 더하여 테스트 코드를 작성하면서 해당 코드가 어떻게 돌아가는지 이해하고 이를 통해 코드 개선이 이루어질 수도 있는 가능성도 있습니다.
PostMan을 통해 API를 호출하여 테스트하는 것도 좋은 테스트 방법이라고 생각합니다. 이러한 테스트도 분명히 필요합니다. 다만 해당 테스트를 위해서는 애플리케이션을 구동해야 합니다. 매번 테스트할 때마다 스프링 애플리케이션을 구동해야 하는 것은 해당 애플리케이션의 크기가 커질수록 더 오랜 시간이 걸리고, 이는 테스트 시간이 늘어난다는 것과 똑같은 말입니다.
또한 저는 A라는 기능을 테스트하기 위해서 스프링 애플리케이션 전체를 구동해야 합니다. A라는 기능을 테스트하기 위한 테스트 코드를 작성하게 되면 해당 A 기능을 테스트하기 위해 필요한 부분만 구동해서 테스트할 수 있으니 시간이나 다른 리소스를 절약할 수 있는 효과도 있습니다. 이 부분은 단위 테스트나 슬라이스 테스트를 키워드로 검색해보시길 추천합니다 :)

 

항상 Member객체를 만들고 시작하시는 것 같은데, 실제로는 멤버객체가 이미 있고 그걸 find하든 save하든 할거아니예요?? Test할땐 항상 처음부터 시작한다고 생각하고 로직을 짜나요??

=> 보통 테스트 코드는 독립적으로 동작해야 합니다. A 테스트 코드의 결과가 B 테스트 코드의 결과에 영향을 주게 되면 이는 테스트 코드를 잘 짰다고 볼 수 없습니다. 예를 들어 인텔리제이에서는 gradle을 통해 전체 테스트를 돌려볼 수 있게 해주는데 이 때 테스트 코드가 실행되는 순서는 랜덤입니다. 만약 A 테스트 코드의 결과가 B 테스트 코드에 영향을 주게 테스트 코드를 짜놨으면 테스트 코드가 실행되는 순서에 따라 B 테스트는 실패할 수도, 성공할 수도 있게 됩니다.
이는 특히 요즘 많은 회사에서 사용하는 CI/CD 환경에서 문제가 생길 수 있습니다. CI/CD 환경에서는 테스트 코드를 돌리는 것도 자동화되어 있어 테스트를 다 통과하면 자동으로 배포하도록 되어 있습니다. 그런데 위처럼 테스트 코드를 짜놓으면 빌 랜덤한 테스트 코드 순서에 따라 배포가 될 수도 안될 수도 있습니다. 배포를 운에 따라 하게 되는 것입니다. 이는 분명 좋지 않다고 생각합니다.

 

그리고 테스트코드에서는 main 디렉토리에 있는 클래스를 자유롭게 접근할 수 있는건가요? 예시에서도 MemoryMemberRepository를 쓰시길래 궁금해서 여쭤봅니다

=> 맞습니다. 접근할 수 있습니다. 그리고 예를 들어 src/main/java/.../repository/MemoryMemberRepository.java는 src/test/java/.../repository/MemberRepositoryTest.java 에서 사용할 때는 동일한 패키지 내에서 사용하는 것과 같이 import 문이 필요 없습니다.

테스트 코드에 대해서는 많은 책과 자료들이 있으니 한 번 살펴보시길 권해드립니다.

 



감사합니다.

팡휘님의 프로필 이미지
팡휘
질문자

자세하게 알려주셔서 정말 감사합니다 !!!

파이팅입니다!

팡휘님의 프로필 이미지
팡휘

작성한 질문수

질문하기