테스트 더블이란

이규훈·2024년 8월 19일

백엔드 공부 정리

목록 보기
1/1

테스트 더블(Test Double)이란?

테스트 더블은 소프트웨어 테스트에서 실제 객체를 대신해 사용하는 모의 객체를 의미합니다. 테스트 중 코드의 특정 부분을 격리하고 독립적으로 테스트할 수 있도록 도와줍니다. 이 개념은 소프트웨어 테스트에서 중요한 요소로, 다양한 상황에서 테스트 환경을 제어하고 예상 결과를 검증하기 위해 사용됩니다.

테스트 더블의 주요 종류

  1. 더미(Dummy)

    • 정의: 테스트에서 사용되지만, 실제 테스트 시 아무런 영향을 미치지 않는 객체입니다. 단지 메서드 호출이나 인터페이스 요구 사항을 만족시키기 위해 자리를 채우는 용도로 사용됩니다.
    • 특징: 테스트에 직접적인 관심사가 아니며, 가장 단순한 형태의 테스트 더블입니다.
    • 예시: null object 또는 빈 객체.
  2. 페이크(Fake)

    • 정의: 실제 구현을 포함하지만, 제품에서 사용하기에는 부적합한 간단한 형태의 테스트 더블입니다.
    • 특징: 실제로 동작하지만, 매우 단순화되어 있어 주로 테스트 환경에서만 사용됩니다.
    • 예시: 인메모리 데이터베이스, 간단한 로직으로 구성된 할인을 적용하는 객체 (예: 항상 5% 할인을 적용).
  3. 스텁(Stub)

    • 정의: 특정 테스트 시나리오에 대해 미리 정의된 응답을 제공하는 객체입니다.
    • 특징: 테스트 중 특정 상태를 검증할 때 사용되며, 복잡한 로직을 간단하게 대체할 수 있습니다.
    • 예시: 특정 할인율을 설정하고 그에 따른 결과를 반환하는 객체.
  4. 스파이(Spy)

    • 정의: 스텁과 유사하지만, 메서드 호출 기록을 저장하는 기능이 추가된 객체입니다.
    • 특징: 호출된 메서드의 매개변수나 호출 횟수를 기록하여 나중에 검증할 수 있습니다. 부분적인 목(Mock)으로도 불립니다.
    • 예시: 호출된 할인율을 기록하고 그에 따라 다른 동작을 수행하는 객체.
  5. 목(Mock)

    • 정의: 스텁의 기능을 포함하면서, 특정 행위가 발생했는지 검증하기 위해 사용되는 객체입니다.
    • 특징: 행위 검증에 중점을 두며, 테스트 시나리오에 따라 미리 정의된 동작을 수행합니다.
    • 예시: 특정 할인율을 설정한 후, 그 할인율이 제대로 호출되었는지를 검증하는 객체.

Classicist vs. Mockist (고전파 vs. 런던파)

테스트 방법론에서 두 가지 주요 접근법이 있습니다: Classicist(고전파)Mockist(런던파)입니다. 이 두 접근법은 테스트 대상과 의존성 사이의 격리 여부에 따라 나뉩니다.

  1. 고전파(Classicist)

    • 정의: 테스트 대상 객체와 그 의존성을 격리하지 않고 함께 테스트하는 방식입니다.
    • 특징: 이 방식은 Sociable Test라고도 불리며, 테스트 시 여러 클래스의 상호 작용을 중점적으로 다룹니다.
    • 장점: 클래스 간의 상호작용을 자연스럽게 테스트할 수 있어, 시스템 전체의 연동성을 파악할 수 있습니다.
    • 단점: 의존성이 많은 경우, 테스트가 복잡해지고 관리하기 어려워질 수 있습니다.
  2. 런던파(Mockist)

    • 정의: 테스트 대상 객체를 격리하여 단독으로 테스트하는 방식입니다.
    • 특징: Solitary Test라고 불리며, 하나의 클래스만을 최소 단위로 테스트합니다.
    • 장점: 빠르게 테스트할 수 있고, 테스트 중 문제를 쉽게 파악할 수 있습니다.
    • 단점: 서비스 간 상호작용이 테스트되지 않아, 실제 환경에서의 문제를 놓칠 수 있습니다.

Sociable Test vs. Solitary Test

테스트 방법론에서 단위 테스트의 범위를 설정하는 데 있어, Sociable TestSolitary Test가 대조적으로 사용됩니다.

  1. Sociable Test:

    • 정의: 단위 서비스의 전체 맥락에서 여러 클래스와의 상호작용을 포함해 테스트하는 방법입니다.
    • 특징: 서비스 간의 상호작용을 포함하므로, 복잡한 시나리오에서도 연동성을 테스트할 수 있습니다.
    • 단점: 테스트 범위가 넓어질수록, 테스트가 무거워지고 속도가 느려질 수 있습니다.
  2. Solitary Test:

    • 정의: 특정 클래스만을 격리하여 단독으로 테스트하는 방법입니다.
    • 특징: 테스트 속도가 빠르고, 문제가 발생할 때 원인을 명확히 특정할 수 있습니다.
    • 단점: 서비스 간의 상호작용을 무시하기 때문에, 통합 테스트에서 문제를 발견할 가능성이 있습니다.

최종 정리

  • 테스트 더블은 소프트웨어 테스트에서 필수적인 도구로, 다양한 상황에 따라 더미, 페이크, 스텁, 스파이, 과 같은 여러 형태가 존재합니다.
  • ClassicistMockist 접근법은 테스트 환경에서 의존성을 어떻게 처리할지에 대한 다른 철학을 가지고 있으며, 각각의 장단점을 이해하고 적절하게 활용하는 것이 중요합니다.
  • Sociable TestSolitary Test는 테스트의 범위를 결정하는 기준으로, 상황에 따라 적절한 방법을 선택해야 합니다.

-> solitary Test를 선호한다고함

profile
개발취준생

0개의 댓글