study/소프트웨어 공학

테스트 더블: Stub, Fake, Spy, Mock

836586697769 2024. 6. 27. 21:33
테스트 대상 객체가 다른 객체와 의존성이 있는 경우 테스트가 어려워짐 → 테스트에 영향이 없도록 의존성이 있는 객체에 대해서는 실제 구현체 대신 해당 객체의 동작을 모방하는 객체를 사용

 

테스트 더블(Test Double)

테스트에서 테스트 대상 코드와 상호작용하는 실제 객체를 대체하는 객체

  • 실제 객체를 사용하는 것보다 빠른 실행 가능
  • 외부 의존성(네트워크 지연, 데이터베이스 상태 등)을 제거하여 테스트를 쉽게 제어
  • 테스트 환경을 더욱 안정적이고 예측 가능하게 만들 수 있음

 

Stub

미리 정의된 값을 반환하도록 설정된 객체

  • 테스트 중 특정 메서드가 호출될 때, 복잡한 로직 없이 미리 정의된 값을 반환하고자 할 때 사용
  • 네트워크 요청이나 데이터베이스 조회와 등 외부 의존성을 제거하고 테스트를 단순화할 때 유용
  • e.g. 데이터베이스 조회 결과나 외부 API 호출 결과를 테스트에 필요한, 미리 정의된 값으로 대체할 때

Fake

실제 구현과 비슷하지만 단순화된 버전의 객체

  • 실제 구현을 대신하여 테스트 환경에서 사용될 수 있는 간단한 버전을 만들고자 할 때 사용
  • 실제 데이터베이스 대신 메모리 내 데이터베이스를 사용하여 테스트할 때 유용
  • e.g. 인메모리 데이터베이스를 사용하여 데이터베이스 의존성을 제거하고 테스트할 때

Spy

객체와의 상호작용을 기록하는 모방 객체

  • 실제 객체의 동작을 유지하면서 특정 메서드가 호출되었는지, 어떤 인자로 호출되었는지 검증하고자 할 때 사용
  • 실제 객체의 일부 메서드만 모킹하고 나머지 메서드는 실제 동작을 유지하고자 할 때 유용

Mock

동작을 사전 정의하고, 해당 동작이 호출되었는지 검증할 수 있는 객체

  • 테스트 후 특정 메서드가 호출되었는지, 어떤 인자로 호출되었는지 검증할 때 사용
  • 테스트 대상이 다른 객체와 상호작용하는 방식을 확인하고자 할 때 유용
  • e.g. 특정 메서드나 API 호출이 올바르게 이루어졌는지 확인할 때

 

Spy와 Mock의 차이점

  • Spy
    • 실제 객체를 감싸서 실제 메서드를 호출하며, 필요한 경우 일부 메서드만 모킹
    • 기본적으로 실제 객체의 메서드가 호출되며 특정 메서드만 별도로 정의할 수 있음
  • Mock
    • 기본적으로 사전 정의된 동작을 수행하며, 실제 객체와는 무관하게 동작
    • 메서드 호출 시의 행동을 사전에 정의 가능 (e.g. 특정 값을 반환하거나 예외를 던짐)

 

 

reference: https://kotlinworld.com/481#Test Doubles를 사용하기 위한 환경 설정-1