코딩항해기

[SpringBoot] 통합 테스트, 단위 테스트 이해 본문

Spring

[SpringBoot] 통합 테스트, 단위 테스트 이해

miniBcake 2024. 11. 17. 12:16

 

예전 첫 SpringBoot 프로젝트를 할 때 단위 테스트를 해봤던 경험이 있었으나 그 때는 잘 모르고 사용했던 것 같아 관련한 내용을 정리해보고자 한다.

 

단위 테스트 Unit Test

단위 테스트는 유닛 테스트라고도 하며 소프트웨어 테스트의 한 유형으로 소프트웨어의 개별 구성 요소 또는 모듈이 예상대로 작동하는지 검증하는 과정이다. 여기서 단위는 보통 메서드 또는 함수, 클래스와 같은 소프트웨어의 가장 작은 테스트 가능한 부분을 의미한다.

 

단위 테스트 특징

독립성

각 테스트는 다른 테스트와 독립적으로 실행되며 테스트 간의 상호 의존성을 가지지 않는다.

 

빠른 실행

단위 테스트는 비교적 적은 코드량을 테스트하기 때문에 빠르게 실행된다.

 

모의 객체 사용

단위 테스트에서는 외부 의존성을 모의 객체로 대체하여 테스트한다.

 

세밀한 검증

단위 테스트는 개별 구성 요소의 동작을 세밀하게 검증 가능하다.

 

단위 테스트 장점과 단점

빠른 실행 속도와 독립성을 가지며 디버깅이 용이하다. 단위 테스트는 개별 구성 요소를 세밀하게 테스트하여 코드 커버리지를 높일 수 있다.

 

그러나 개별 구성 요소만 테스트하므로 시스템 전체의 동작을 보장하지 않으며 복잡한 모킹 설정이 필요해 모킹이 잘못 됐을 때 테스트 신뢰성이 떨어질 수 있다.

 

모킹 Mocking
단위 테스트를 작성할 때, 해당 코드가 의존하는 부분을 가짜(mock)으로 대체하는 기법

 

 

 

통합 테스트 Integration Test

통합 테스트는 소프트웨어의 개별 구성 요소들이 모여 전체 시스템이 올바르게 작동하는지 검증하는 테스트 방법이다. 단위 테스트가 개별 기능 검증에 초점을 맞춘다면 통합 테스트는 이들 모듈이 서로 융합되어 상호작용할 때 발생할 수 있는 문제를 찾아내고 해결하는데 중점을 둔다.

 

통합 테스트 특징

모듈 간 상호작용 검증

개별 모듈이 통합되어 동작할 때 발생할 수 있는 문제를 검증한다.

 

실제 환경 테스트

실제 운영 환경과 유사한 조건에서 테스트하여 시스템의 신뢰성을 높인다.

 

데이터 흐름 검증

모듈 간의 데이터 흐름과 의존성을 테스트하여 데이터의 일관성과 정확성을 확인한다.

 

종단 간 시나리오 테스트

사용자 시나리오를 기반으로 한 시스템의 종단 간 기능을 테스트 한다. (종단 = 핵심기능)

 

통합 테스트 장점과 단점

실제 운영 환경과 유사한 조건에서 테스트하므로 시스템의 신뢰성을 높일 수 있다. 시스템의 여러 부분이 함께 올바르게 작동하는지 검증하여 전체적인 기능을 확인할 수 있다. 단위 테스트로 발견하기 어려운 모듈 간의 상호작용 문제를 찾아낼 수 있다. 시스템의 전체적인 품질을 높이고 릴리즈 전에 잠재적인 문제를 사전에 발견하여 수정 가능하다.

 

여러 모듈을 포함해 단위 테스트보다 속도가 느리다. 실제 환경과 유사한 조건을 설정하는 것이 복잡하고 시간이 많이 소요될 수 있다. 문제가 발생했을 때 단위 테스트보다 디버깅이 어렵다.

 

 

Test 프레임워크, 라이브러리 (JUnit, AssertJ)

Java 단위 테스트 작성에는 크게 2가지 라이브러리가 있다. JUnit, AssertJ이다. JUnit은 자바 유닛 테스트를 위한 테스팅 프레임워크이고 AssertJ는 자바 테스트를 돕기 위해 다양한 문법을 지원하는 라이브러리이다.

 

AssertJ 없이 JUnit만으로도 단위 테스트를 진행할 수 있지만 AssertJ의 메서드에 비해 가독성이 저하되어 두 가지를 조합해 사용하는 경우가 많다.

 

그 외에도 가짜 객체를 지원해주는 Mockito라는 테스트 프레임워크가 있다. JUnit5와 조합해 많이 사용한다.

 

given/ when/ then 패턴

given-when-then 패턴이란 1개의 단위 테스트를 3가지 단계로 나누어 처리하는 패턴으로, 각각의 단계는 다음을 의미한다.

  • given(준비): 어떠한 데이터가 준비되었을 때
  • when(실행): 어떠한 함수를 실행하면
  • then(검증): 어떠한 결과가 나와야 한다.

 

참고 : https://myeongju00.tistory.com/120