inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Business Layer 테스트 (1)

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

해결된 질문

1653

비가싫어요

작성한 질문수 87

14

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

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

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

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

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

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

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

spring tdd jpa mockito 소프트웨어-테스트 junit5

답변 1

7

박우빈

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

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

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

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

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

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

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

2

비가싫어요

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

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

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

 

4

박우빈

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

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

0

비가싫어요

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

private 상수 테스트 관련 질문

0

83

1

void는 어떻게 테스트하나요..? void로 애초에 코딩하면 안되나요??

0

126

2

커버리지는 어떻게 활용하시는지 궁금합니다.

0

161

2

테스트 문서화 질문입니다

0

106

2

단위테스트 질문이 있습니다

0

96

2

컨트롤러는 모킹을 한 이유가 궁금합니다.

0

103

2

ERD 가장자리에 있는 도메인 테스트 질문

0

89

2

DTO 검증 필드에 대한 테스트 코드 작성은 어디까지?

0

135

2

OrderCreateRequest DTO에 대해서 궁금한점

0

102

2

고전파의 테스트 대역 사용 대상, 공유 의존성

0

156

2

계층 관련 질문이 있습니다.

0

139

3

'코틀린'에서는 빌더를 따로 쓰지 않는데, 이 때는 어떻게 test fixture를 만드시는지 궁금합니다

1

124

2

혹시 update 로직은 어떻게 테스트하나요? (@Setter?)

0

135

2

단위테스트와 통합테스트의 경계가 궁금합니다.

0

229

2

Service+Repository 통합테스트 관련 질문입니다.

0

150

2

OrderControllerDocsTest 작성 해봤는데요. 날짜 형식이 이상하게 나와요

0

185

2

test 용 .yml

0

91

2

throws Exception

0

80

2

카페키오스크 클래스 문의 ,,

0

89

2

Rest docs 문서용 테스트코드를 따로 작성해야 되나요?

0

174

2

테스트 코드에서 필요한 생성자

0

138

1

tearDown 순서

0

116

2

@Builder 생성자 private

0

136

2

@DisplayName gradle / intellJ

0

93

2