본문 바로가기
IT/스터디

단위 테스트

by 봉즙 2025. 5. 17.

단위 테스트 요약 정리

「단위 테스트 – 생산성과 품질을 위한 단위 테스트 원칙과 패턴」 (블라디미르 코리코프 저) 기반


단위 테스트란?

단위 테스트(Unit Test)는 작은 코드 조각(보통 메서드 수준)정확히 동작하는지 자동으로 검증하는 테스트입니다. 주요 특징은 다음과 같습니다:

  • 빠르게 실행되어야 하며
  • 외부 의존성 없이 격리된 환경에서 동작해야 합니다
  • 코드의 일부(단위)만을 독립적으로 검증합니다

단위 테스트의 목적과 원칙

1. 코드의 분리와 테스트 용이성

단위 테스트 작성이 어렵다면, 테스트 대상 코드가 다른 컴포넌트와 강하게 결합되어 있기 때문일 수 있습니다. 이는 적절히 분리되어 있지 않다는 신호입니다. 테스트 가능한 구조로 만들기 위해선 리팩터링이 필요합니다.

2. 테스트와 코드의 동반 리팩터링

  • 기반 코드를 리팩터링할 때는 테스트 코드도 함께 리팩터링해야 합니다.
  • 코드 변경 후에는 반드시 테스트를 실행하여 회귀(regression)를 방지합니다.
  • 테스트가 잘못된 경고나 실패를 일으킬 경우 원인을 파악하고 신속하게 처리합니다.
  • 코드의 작동 방식을 이해하기 위해 테스트 코드를 읽는 데 시간을 투자하는 것도 좋은 습관입니다.

AAA 패턴 구조

단위 테스트의 전형적인 구조는 아래와 같은 AAA(Arrange - Act - Assert) 패턴을 따릅니다:

  1. Arrange (준비): 테스트 대상 객체와 필요한 데이터를 준비
  2. Act (실행): 테스트 대상 메서드를 호출
  3. Assert (검증): 기대한 결과가 실제 결과와 일치하는지 확인

테스트 명명 지침

  • 엄격한 명명 규칙보다 이해하기 쉬운 시나리오 중심의 명명을 지향합니다.
  • 비개발자도 도메인에 익숙하다면 이해할 수 있을 정도로 설명적인 테스트 이름을 사용하는 것이 이상적입니다.

MUT & SUT 정의

  • SUT (System Under Test): 테스트 대상 시스템 또는 클래스 전체
  • MUT (Method Under Test): 테스트 중인 SUT 내의 특정 메서드

좋은 단위 테스트의 4대 요소

  1. 회귀 방지

    • 가능한 많은 코드를 테스트하여 새로운 변경이 기존 동작을 깨뜨리지 않도록 방지합니다.
  2. 리팩터링 내성

    • SUT의 내부 구현에 의존하지 않아야 하며, 거짓 실패(False Positive)가 발생하지 않도록 해야 합니다.
  3. 빠른 피드백

    • 테스트는 즉시 실행 가능하고 빠르게 결과를 확인할 수 있어야 합니다.
  4. 유지 보수성

    • 테스트는 작고 이해하기 쉬워야 하며, 외부 의존성(네트워크, 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

댓글