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

비가싫어요님의 프로필 이미지

작성한 질문수

Practical Testing: 실용적인 테스트 가이드

Business Layer 테스트 (1)

단위테스트의 개념에 대해서 질문 드립니다!

해결된 질문

작성

·

1.5K

13

안녕하세요! 테스트 강의가 드문데 정말 친절하게 잘 알려주셔서 감사하게 듣고 있습니다 :)

아직 강의를 다 들은 것은 아니지만 강의 내용 중 궁금한 것이 있어 질문 드립니다.

제가 테스트를 제대로 공부해본 적이 없어 혼자서 독학을 하며 공부했던 단위테스트는 주로 Mock과 항상 연관지어 설명이 되어 있었습니다. 통합테스트(@SpringBootTest)는 스프링 컨테이너를 띄우고 bean으로 등록된 모든 빈을 가지고 테스트를 하는 것인데 반해, 단위테스트는 해당 계층(Layer)을 테스트할 때 꼭 필요한 bean만 가지고 와서 최소 단위(메서드나 클래스)로 테스트를 진행한다고 저는 알고 있었습니다.

그래서 예를 들어 Service 계층 테스트를 진행할 때면 Repository에 관련된 bean들은 Mockito 등을 사용해서 Mock을 만들고 InjectMocks를 해준다는 식으로 저는 공부를 하고 테스트 코드를 작성한 경험이 있습니다.

그런데 오늘 강의에서 강사님이 설명해주시는 내용을 듣다보니 @SpringBootTest 와 같은 어노테이션과 상관없이 단위테스트를 진행하시는 것 같다는 인상을 받았습니다. Order에 대한 테스트를 진행하실 때도 단위테스트라는 언급을 하셨고, OrderSerivice에 대한 테스트를 진행하실 때도 @SpringBootTest를 사용하고 있지만 단위테스트를 하신다고 표현을 하시더라구요.

혹시 통합테스트와 단위테스트를 구분하는 강사님만의 방법이 있는 것인지 궁금합니다!

장문 글 읽어주셔서 감사합니다!

답변 1

6

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, JUNN님!
좋은 질문을 주셨네요 :)

먼저 단위 테스트단위 는 스프링과 무관하다는 점을 이야기하면 좋을 것 같습니다.
여기서 말하는 단위는 '가장 작은 범위'를 의미하는데요, 이 단위라는 용어는 사용하는 문맥에 따라 정의하기 나름입니다.
가장 작게는 순수한 자바 객체(a.k.a. POJO)의 메서드 하나를 가지고 단위라고 볼 수도 있겠고, 말씀하신 대로 특정 레이어를 기준으로 본다면 해당 레이어를 단위라고 볼 수도 있겠네요.
즉, 단위란 어떤 하나의 관심사를 기준으로 본 가장 작은 범위, 라고 말해볼 수 있겠습니다.

이로부터 둘 이상의 단위가 참여하는 테스트를 통합 테스트라고 이야기해 볼 수 있겠네요 :)

이렇게 단위를 구분하는 이유는, 단위 자체를 단위를 넘어서는 다른 코드들과 분리하여 테스트하고자 하기 때문입니다.
테스트에 참여하는 객체(모듈)들이 단위 크기에만 집중될수록 보다 빠른 피드백을 받을 수 있기 때문이죠.
그래서 단위는 작을수록 좋습니다.

정리하자면, 말씀해 주신 예제에서 Service 레이어 테스트를 진행하면서 해당 Service에서 사용하는 Repository 레이어를 Mocking하여 테스트를 작성한다면 'Service 레이어에 대한 단위 테스트'라고 할 수 있겠습니다.
레이어 하나를 단위로 본 것이죠.
그리고 제가 작성한 OrderTest는 Order의 메서드를 단위로 보고 작성한 단위 테스트가 될 것이고요.

궁금한 부분이 해소되셨기를 바랍니다.

강의 들어주셔서 감사해요 :-)

우선 늦은 시간임에도 친절한 답변을 달아주셔서 감사합니다 :)

한 가지 더 궁금증이 생겨 추가적으로 질문을 드립니다!

강의에서 OrderServiceTest를 진행하실 때 ProductRepository를 주입 받으며 하시는데 이렇게 다른 계층이 참여하는 테스트여도 테스트하고자 하는 단위가 OrderService에 있는 메서드 하나라면 이런 경우도 단위테스트라고 이해해도 되는 것일까요?

 

박우빈님의 프로필 이미지
박우빈
지식공유자

앗 아닙니다. 테스트하고자 하는 부분이 메서드임에 주목하는 것이 아니라, 말씀하신 것처럼 '다른 계층이 참여하는가'로 단위 테스트인지, 통합 테스트인지를 구분하시면 됩니다.

스프링을 띄우더라도 OrderServiceTest에 가짜 객체인 Mock Repository나 Fake Repository를 만들어서 주입하여 테스트한다면 실제 프로덕션에서 사용하는 Bean을 제외시켜 철저하게 내가 테스트하고자 하는 대상(OrderService)에만 집중하도록 한 것이니 단위 테스트라 볼 수 있을 것이고요, 반대로 강의 중에서처럼 실제 프로덕션 Repository Bean을 주입해서 테스트했다면 프로덕션 환경 그대로 여러 계층을 참여시켜 테스트한 것이니 통합 테스트라고 보시면 됩니다. :)

아하 그렇군요! 친절한 답변 감사드립니다 :)