Test Double

FreshBreeze·2024년 10월 24일
post-thumbnail

Test Double 이란?

Stunt double (대역 배우) 에서 유래한 용어로
실제 배우가 촬영하기 어려운 장면들을 대역 배우가 대신 촬영하듯이,

테스트를 진행하기 어려운 경우,
이를 대신해 테스트를 진행할 수 있도록 만들어주는 객체를 말합니다.

정리해서, 복잡한 시스템의 특정 부분을 독립적으로 테스트 하기 위한 객체 입니다.

종류

  1. Dummy : 인스턴스화된 객체가 필요해서 구현한 기능 없는 객체
  • 아무것도 하지 않은, 모방하기만 한 깡통 객체 입니다.
  • 기능이 없기 때문에, 동작하지 않아도 테스트에는 영향을 미치지 않습니다.

  1. Fake : 동작은 하지만 실제 사용되는 객체처럼 정교하게 동작하지는 않는 객체
  • 단순한 형태로 동일한 기능은 수행하지만, 프로덕션에서 쓰기에는 부족한 객체 입니다.
  • 예시로, List 자료형도 DB 처럼 CRUD가 가능하지만, DB대신 쓰기에는 부족합니다.

  1. Stub : 테스트에서 요청한 것에 대해 미리 준비한 결과를 제공하는 객체
  • 테스트를 위해 의도한 결과만 반환되도록 하기 위한 객체 입니다.
  • 어떤 것들을 return 하는지 미리 정의 하고, 그 외의 요청에는 응답하지 않습니다.

  1. Spy : Stub이면서 호출된 내용을 기록하여 보여줄 수 있는 객체
  • 예시로, 얼마나 많은 메세지를 보냈는지 기록하는 이메일 서비스를 들 수 있습니다.

  1. Mock : 행위에 대한 기대를 명세하고, 그에 따라 동작하도록 만들어진 객체
  • 예외를 던질 수 있고, 호출을 검증할 수 있습니다.

Stub vs Mock

스텁과 목의 차이는 검증하려는 목적에 있습니다.

Stub상태를 검증 (State Verification)
어떤 기능을 요청하고 내부적인 상태가 어떻게 바뀌었는 지에 초점

MailServiceStub mailer = new MailServiceStub();
...
order.fill(warehouse); 
...

// 상태 검증 : 메일이 몇 번 전송되었는지 확인
assertEquals(1, mailer.numberSent());

Mock행위를 검증 (Behavior Verification)
when(send) 했을 떄 어떤 값을 return 하는지와 같은 행위에 초점

MailService mailer = mock(MailService.class);
...
order.fill(warehouse);
...

// 행위 검증: 메일 전송(send)이 한 번 호출되었는지 확인
verify(mailer, times(1)).send();

출처

인프런 - Practical Testing: 실용적인 테스트 가이드 (박우빈)
Test Doubles
https://martinfowler.com/bliki/TestDouble.html
https://tecoble.techcourse.co.kr/post/2020-09-19-what-is-test-double/
Stub vs Mock
https://martinfowler.com/articles/mocksArentStubs.html

0개의 댓글