단위 테스트 요약 정리
「단위 테스트 – 생산성과 품질을 위한 단위 테스트 원칙과 패턴」 (블라디미르 코리코프 저) 기반
단위 테스트란?
단위 테스트(Unit Test)는 작은 코드 조각(보통 메서드 수준)이 정확히 동작하는지 자동으로 검증하는 테스트입니다. 주요 특징은 다음과 같습니다:
- 빠르게 실행되어야 하며
- 외부 의존성 없이 격리된 환경에서 동작해야 합니다
- 코드의 일부(단위)만을 독립적으로 검증합니다
단위 테스트의 목적과 원칙
1. 코드의 분리와 테스트 용이성
단위 테스트 작성이 어렵다면, 테스트 대상 코드가 다른 컴포넌트와 강하게 결합되어 있기 때문일 수 있습니다. 이는 적절히 분리되어 있지 않다는 신호입니다. 테스트 가능한 구조로 만들기 위해선 리팩터링이 필요합니다.
2. 테스트와 코드의 동반 리팩터링
- 기반 코드를 리팩터링할 때는 테스트 코드도 함께 리팩터링해야 합니다.
- 코드 변경 후에는 반드시 테스트를 실행하여 회귀(regression)를 방지합니다.
- 테스트가 잘못된 경고나 실패를 일으킬 경우 원인을 파악하고 신속하게 처리합니다.
- 코드의 작동 방식을 이해하기 위해 테스트 코드를 읽는 데 시간을 투자하는 것도 좋은 습관입니다.
AAA 패턴 구조
단위 테스트의 전형적인 구조는 아래와 같은 AAA(Arrange - Act - Assert) 패턴을 따릅니다:
- Arrange (준비): 테스트 대상 객체와 필요한 데이터를 준비
- Act (실행): 테스트 대상 메서드를 호출
- Assert (검증): 기대한 결과가 실제 결과와 일치하는지 확인
테스트 명명 지침
- 엄격한 명명 규칙보다 이해하기 쉬운 시나리오 중심의 명명을 지향합니다.
- 비개발자도 도메인에 익숙하다면 이해할 수 있을 정도로 설명적인 테스트 이름을 사용하는 것이 이상적입니다.
MUT & SUT 정의
- SUT (System Under Test): 테스트 대상 시스템 또는 클래스 전체
- MUT (Method Under Test): 테스트 중인 SUT 내의 특정 메서드
좋은 단위 테스트의 4대 요소
회귀 방지
- 가능한 많은 코드를 테스트하여 새로운 변경이 기존 동작을 깨뜨리지 않도록 방지합니다.
리팩터링 내성
- SUT의 내부 구현에 의존하지 않아야 하며, 거짓 실패(False Positive)가 발생하지 않도록 해야 합니다.
빠른 피드백
- 테스트는 즉시 실행 가능하고 빠르게 결과를 확인할 수 있어야 합니다.
유지 보수성
- 테스트는 작고 이해하기 쉬워야 하며, 외부 의존성(네트워크, DB 등)이 적어야 안정적입니다.
테스트 기법
입력/출력 테스트 (출력 기반 테스트)
- 가장 선호되는 방식
- 입력을 주고 출력 결과를 검증
- 숨은 입출력이 없다는 전제를 가지며 가장 유지 보수가 쉽고 결합도가 낮음
상태 기반 테스트
- SUT 실행 후 객체의 상태를 검증
- 고전파(Test Classicist)가 주로 선호
통신 기반 테스트
- Mock을 이용하여 SUT와 협력 객체 간의 상호작용을 검증
- 런던파(Test Londonist)가 주로 선호
- 테스트 가독성이 떨어질 수 있음
테스트 더블(Test Double) 종류
종류 | 설명 | 사용 목적 |
---|---|---|
Mock | 외부로 나가는 상호작용을 시뮬레이션 | 협력 객체와의 통신 검사 |
Spy | Mock과 유사하지만 수동으로 작성 | 호출 여부 및 횟수 검증 |
Stub | 내부로 들어오는 상호작용을 시뮬레이션 | 고정된 입력값 제공 |
Dummy | Stub과 유사하나 의미 없는 하드코딩 값 사용 | 존재만으로 테스트에 필요할 때 |
Fake | 간단한 실제 구현체 대체 | 예: 인메모리 DB |
함수형 프로그래밍과 단위 테스트
- 함수형 프로그래밍은 부작용(side-effect) 없는 순수 함수를 지향합니다.
- 이로 인해 테스트가 용이하며, 코드의 예측 가능성과 안정성을 높입니다.
- 단, 모든 애플리케이션을 함수형으로 설계하는 것은 현실적으로 어렵습니다.
통합 테스트와의 차이
- 단위 테스트는 비즈니스 로직 검증에 초점을 맞추며, 외부 시스템과 단절되어 있습니다.
- 반면, 통합 테스트는 외부 시스템(DB, 네트워크, API 등)과의 연계를 검증하며, 시스템 전체의 정상 작동을 보장합니다.
- 따라서 둘은 보완적인 관계이며, 단위 테스트만으로는 전체 품질을 보장할 수 없습니다.
요약
단위 테스트는 생산성과 품질을 높이는 강력한 도구입니다.
잘 설계된 테스트는 코드 변경에 대한 자신감을 주고, 유지보수를 용이하게 하며, 시스템의 회귀 가능성을 줄여줍니다.
좋은 단위 테스트는 코드보다 더 많은 가치를 줄 수 있다.
'IT > 스터디' 카테고리의 다른 글
2022-07-12-데이터 중심어플리케이션 설계 ch2 (0) | 2023.02.27 |
---|---|
2022-07-08-데이터 중심어플리케이션 설계 ch1 (0) | 2023.02.27 |
css (0) | 2020.02.06 |
Hook (0) | 2020.02.04 |
list와 key (0) | 2020.01.30 |
댓글