단위 테스트를 알아보자.

NNIJGNUS·2024년 9월 3일

Unit Test

목록 보기
1/5

단위 테스트란?

단위 테스트, 혹은 유닛 테스트란 소스 코드의 특정 모듈이 의도된 대로 정확히 검증하는 절차다.
즉, 모든 함수와 메소드에 대한 테스트 케이스(Test case)를 작성하는 절차를 말한다.

이를 통해서 언제라도 코드 변경으로 인해 문제가 발생할 경우, 단시간 내에 이를 파악하고 바로 잡을 수 있도록 해준다.
이상적으로, 각 테스트 케이스는 서로 분리되어야 한다. 이를 위해 가짜 객체(Mock object)를 생성하는 것도 좋은 방법이다.

유닛 테스트는 (일반적인 테스트와 달리) 개발자(developer) 뿐만 아니라 보다 더 심도있는 테스트를 위해 테스터(tester)에 의해 수행되기도 한다.

통합 테스트란?

통합 테스트(Integration Test)는 단위 시험이 끝난 소프트웨어를 결합해 가며 시험 하는 방법이다.
단위 시험이 끝난 모듈들을 좀 더 큰 단위의 집합으로 통합 구성한 후, 통합 시험 계획에 따라서 테스트를 수행한다.
통합 시험을 통과한 모듈 집합은 시스템 검사 단계의 테스트 대상으로서 넘어가게 된다.

통합 시험의 목적은 주요 설계 항목들이 기능, 성능, 안정성 요구사항을 잘 구현하고 있는지를 검증하는 것이다.
즉 통합된 모듈 그룹들은 노출되어 있는 인터페이스에 정상적인 입력 데이터나 비정상적인 오류 입력 데이터를 넣어보는 블랙박스 검사 기법으로 테스트된다.

단위 테스트 VS 통합 테스트

스프링을 통해 예시를 들어보자.

스프링은 기본적으로 Controller, Service, Repository, Domain의 4계층 구조로 이루어져 있다.

간단히 덧붙이자면 각 계층의 역할은 아래와 같다.

Controller: 유저와의 상호 작용 처리를 담당하는 계층
Service, Domain: 주요 비즈니스 로직이 작동하는 계층
Repository: 데이터베이스와의 상호 작용 처리를 담당하는 계층

이 때, 우리가 개발하는 어플리케이션은 아주 간단한 사용자 인증만을 목적으로 동작한다고 가정하자.

이 상황에서 각 계층의 구체적인 역할은 다음과 같겠다.

Controller: 유저로부터 아이디를 전달받아 Service, Domain 계층으로 전달한다.
Service, Domain: Repository 계층을 통해 등록된 사용자임을 식별하거나, 등록되지 않은 사용자라면 예외를 발생시킨다.
Repository: 유저 아이디를 통해 데이터베이스와 상호작용하며 등록된 유저인지 식별한다.

통합 테스트

통합 테스트의 경우 대략적인 성공 테스트와 실패 테스트는 다음과 같이 진행될 것이다.

성공 테스트

테스트 코드를 통해 데이터 베이스에 저장된 유저 정보를 담은 요청을 전송하고, 이에 맞는 응답이 옴을 확인한다.

실패 테스트

테스트 코드를 통해 데이터 베이스에 저장되지 않은 유저 정보를 담은 요청을 전송하고, 이에 맞는 예외가 발생함을 확인한다.

단위 테스트

단위 테스트의 경우 대략적인 성공 테스트와 실패 테스트는 다음과 같이 진행될 것이다.

성공 테스트

Repository에 성공 응답을 모킹한다.
이에 맞는 응답이 입력될 시, 성공 응답을 확인한다.

실패 테스트

Repository에 실패 응답을 모킹한다.
이에 맞는 응답이 입력될 시, 실패 응답을 확인한다.

단위 테스트가 필요한 이유?

통합 테스트만을 작성한다면, 모든 계층의 테스트를 자동으로 수행할 수 있다.
하지만 단위 테스트를 작성한다면, 모든 계층의 테스트를 별도로 작성해야 한다.

통합 테스트만으로도 모든 메서드의 테스트를 진행할 수 있다면, 왜 단위 테스트를 작성해야 할까?

테스트 비용 절약

통합 테스트는 여러 모듈간의 상호 작용을 통해 테스트를 진행한다.
다시 말해서, 통합테스트를 진행하기 위해서는 모듈간의 연결이 필수적이다.

하나의 WAS만으로 이루어진 간단한 프로젝트라면 모듈간의 연결이 부담스럽지 않을 수 있겠지만,
프로젝트의 규모가 매우 커진다고 생각해보자.

가령 LLM에 접속해 대량의 데이터를 생성하는 프로젝트를 진행한다고 가정하자.
이 프로젝트에서 통합 테스트를 진행한다면, 테스트를 실행할 때마다 LLM에 접속해야 하는 과정이 필수적이다.
이는 비용과 시간 측면에서 굉장한 낭비가 될 것이다.

하지만 이 과정을 모킹하여 생략한 후, 단위 테스트를 진행할 수 있다면 훨씬 적은 비용으로 테스트를 진행할 수 있다.

테스트 시간 절약

위와 비슷한 내용이다.

단위 테스트는 통합 테스트보다 빠르게 실행할 수 있으며, 이로 인해 리팩토링 등 코드의 변경이 일어났을 때에도 빠른 테스트를 진행하여 코드의 신뢰도를 높힐 수 있다.

참고자료

위키피디아 - 유닛 테스트
위키피디아 - 통합 테스트

0개의 댓글