Inflearn brand logo image

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

rlamw2000님의 프로필 이미지
rlamw2000

작성한 질문수

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

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

작성

·

110

0

안녕하세요 우빈님 강의 너무나 잘 듣고 있습니다 🙂

주니어에게 큰 힘이 되고 있습니다 감사합니다

 

공부를 하다보니 단위테스트와 통합테스트의 경계가 궁금하게 되었습니다.

우빈님은 컨트롤러 / 서비스 / 리포지토리 각 계층에 대해 단위 / 통합 / 단위 테스트라고 구분하셨는데요

 

어떤 분은 컨트롤러 계층에서 작성한 테스트에 대해 통합테스트라고 주장하셨습니다

@WebMvcTest 또는 @SpringBootTest를 사용해 스프링 컨텍스트의 일부(웹 계층) 또는 전체를 로드해야 한다.

진정한 단위 테스트"는 스프링이나 다른 컨테이너 없이 new 연산자를 사용하여 객체를 인스턴스화하고 테스트하는 것을 의미한다고 하셨습니다.

 

테스트 대상 범위: 또한 테스트는 특정 컨트롤러 메서드의 로직만을 격리하여 테스트하는 것이 아니라, 특정 URL에 대한 HTTP 요청이 스프링 웹 계층을 통과하여 컨트롤러에 도달하고, 컨트롤러의 응답이 HTTP 응답으로 변환되어 반환되는 전체 과정 중 일부를 시뮬레이션하고 검증하는 관점에서 통합테스트다

라고 주장하셨습니다.

 

정확한 구분은 어떻게 해야할까요?
사실 이러한 구분이 중요한가 고민도 됩니다. 어차피 테스트에 대한 목적과 경계 설정을 구분하는 것이 중요하지 않은가 싶긴 한데 우빈님 의견이 궁금합니다.

 

답변 2

1

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

안녕하세요, rlamw2000 님!

네, 맞습니다. 저는 통합 테스트란 어떤 계층부터 어떤 계층까지 테스트하는 것이다, 라고 정의하기 보다는, 둘 이상의 모듈을 묶어서 테스트하면 통합 테스트라고 생각하고 있어요.

그래서 컨트롤러부터 리포지토리까지 전부 테스트하는 것도 마찬가지로 통합 테스트라고 생각합니다.

단위 테스트는 독립적인지가 가장 중요한데요, 사실 그래서 강의에서 보여드린 컨트롤러 테스트와 리포지토리 테스트는 스프링을 띄워서 테스트하는 관점으로 보았을 때 엄밀히 통합 테스트겠지만, 서비스 레이어의 통합 테스트와 비교하였을 때 다른 계층이 관여하지 않는 다는 의미에서 "단위 테스트 느낌이 나는" 테스트라고 설명 드렸습니다.

도움이 되셨기를 바랍니다.
감사합니다. 🙂

rlamw2000님의 프로필 이미지
rlamw2000
질문자

추가로 궁금한 점이 있습니다!
그렇다면 우빈님은 구체적으로 왜 단위 + 통합 + 단위테스트가 가성비 측면에서 좋다고 생각하시나요?
제가 지금 하고 있는 생각은 결국 http 파일을 정의하여 실제로 돌려보는 것보다는 그러면 그냥 모두 통합테스트를 만들어 한사이클에 검증할 수 있도록 하는건 어떤지 궁금합니다!

제 의견대로 한다면 만약 테스트 실패시 틀린 지점을 찾기 어려워질 것 같은데.. 그러면 단위테스트를 추가하면 너무 비용이 비싸져서 그런걸까요 의견이 궁금합니다 :)

0

안녕하세요, 인프런 AI 인턴입니다.

rlamw2000님, 질문 감사드립니다. 단위 테스트와 통합 테스트의 경계를 이해하는 것은 테스트 전략을 수립하는 데 있어 중요한 부분입니다.

우선 단위 테스트는 작은 코드 단위, 보통 하나의 메서드나 클래스의 동작을 검증하기 위한 테스트입니다. 독립적으로 실행되며, 외부 시스템(mock 객체나 stubbing을 사용)을 최대한 격리하여 테스트합니다. 이러한 방식으로 쉽게 슈트할 수 있고 빠르게 피드백을 받게 됩니다.

반면 통합 테스트는 통합된 시스템의 일부 또는 전체의 동작을 검증하는 데 집중합니다. 이는 실제(DB, 네트워크 등)를 포함하여 여러 구성 요소가 함께 작동하는 방식을 확인합니다. @WebMvcTest와 @SpringBootTest는 이런 종류의 테스트를 지원합니다.

컨트롤러 테스트의 경우, 웹 계층을 통합 테스트의 일부로 생각하는 것이 자연스럽습니다. 컨트롤러 메서드가 기대한 대로 작동하는지를 확인하려면, HTTP 호출부터 시작해 응답까지의 프로세스를 포함한 전체 스택을 테스트하는 것이 필요합니다. 이 테스트는 엔드포인트가 잘 작동하는지를 확인함으로써 지속적 통합(CI) 환경에서 안정성을 제공합니다.

따라서 단위 테스트와 통합 테스트 사이에 명확한 경계를 갖는 것보다는, 테스트가 포함하려는 시스템의 범위, 목표 및 필요에 따라 구분하는 것이 좋습니다.

이 점을 바탕으로 tests에 대한 경계는 프로젝트의 복잡도 및 요구 사항에 따라 유연하게 조정될 수 있습니다. 우빈님의 강의에서 원하시는 베스트 프랙티스와 맞추어 사용하는 것도 중요한 판단이 될 것입니다.

자세한 시험 구성에 관한 내용은 아래 링크에서 확인할 수 있습니다:
- Spring Boot Reference Documentation - Testing Spring Applications
- Auto-configured Spring MVC Tests

추가적인 의문이 있다면 언제든지 질문해 주세요 :)

rlamw2000님의 프로필 이미지
rlamw2000

작성한 질문수

질문하기