본문 바로가기
지식

Test Double (테스트 더블)

by 코드 이야기 2023. 6. 19.
728x90

 

Test Double

  • 테스트가 어려운 객체를 테스트할 수 있게 해주는 객체 (ex. 데이터베이스에 영향을 주고 받는 경우.)
  • 스턴트맨(정식명칙: 스턴트더블)에서 비롯된 이름.
  • 크게 Dummy,Fake,Stub,Spy,Mock이 있다.

 


 

예제 코드 (kotlin)

 

 

 

Dummy

  • 테스트하고자 하는 객체의 생성을 위해 인스턴스화 하고 전달되는 객체. 실제 사용되지 않는 객체.
  • Dummy 객체의 메서드가 호출되었을 때 정상 동작은 보장하지 않는다.
  • 예제 코드) ExUserRepository 객체에서 User id를 사용해 User를 검색하는 기능을 테스트할 경우.
    ExUserRepository 객체를 인스턴스화 하기 위해 FailLogger를 생성자로 필요로 한다.
    성공을 가정한 테스트기에 FailLogger가 호출되는 일이 없다. 즉, FailLogger는 테스트를 위한 Dommy 객체이다.

Fake

  • 테스트하고자 하는 객체가 데이터베이스 등과 연관되어 있을 때 사용되는 객체.
    데이터베이스에 영향을 미치지 않기 위해 연동하지 않고 실제 기능을 비슷하게 따라 만든 객체.
  • 예제 코드) 제품 코드에서는 UserRepository의 구현체가 서버에 연동되어 데이터를 수정하는 요청을 보낼 수 있다. 
    테스트에 따라 불필요하게 데이터가 변경될 수 있다.
    때문에 UserRepository를 구현하는 데이터베이스와 연동되지 않은 테스트용 Fake 객체를 만든다.

Stub

  • 호출된 요청에 대해 미리 준비해둔 결과를 제공하는 객체.
  • 테스트하고자 하는 객체의 구현이 단순한 동작으로 정의된 객체.
  • 예제 코드) UserRepository를 통해 서버에 요청을 보내는 작업이 실패하였을 때의 작업이 잘 이루어지는지 테스트할 경우.
    UserRepository의 작업이 실패했음을 가정해야한다.
    즉, UserRepository의 메서드 호출에 대한 요청에 대한 응답을 실패로 준비한다.

Mock

  • 동작을 검증하는 객체.
  • 예제 코드) 제품 코드에 사용자를 검색해 사용자에 따라 이름을 변경하는 기능이 있다. 
    이 때 UserRepository의 findById, updateNameById가 호출되었는지 확인한다.

Spy

  • 객체를 복사해 테스트에 사용하는 객체.
  • 때문에 실제 객체를 mock객체처럼 사용할 수 있다.

 


 

stubbing vs mocking

  • Stubbing
    • stub: 테스트를 위해 의도한 결과가 반환되도록 설정된 객체
    • stubbing: 테스트할 메서드의 기능을 설정하는 것
  • mocking
    • mock: 호출이 예상되는 메서드에 대해 기대한 동작과 값이 설정된 객체
    • mocking: 설정된 메서드를 통해 기대값을 검증하는 것

mock object vs fake object

  • fake object
    • 기능을 간략하게 재구현한 것
    • 실제 객체와 비슷한 역할을 하도록 만들어 사용하는 객체 ⇒ 상태를 테스트할 때 용이
  • mock object
    • 기능의 결과를 가정한 것
    • 상호작용을 테스트하는 것 ⇒ 기능의 수행 여부, 동작을 검증할 때 용이

 


 

필자의 의견

mock test란 Unit Test의 목적, Unit에 집중하기 위해 외부 종속으로부터 분리하기 위한 것.


상세한 상태(domain에서 행위에 따른 상태 변화 테스트 등)를 테스트하기 위함이 아니다.

조금 더 유연한, 독립된 테스트를 위해 행위(MVP Presenter 기능에서 UI의 메서드 호출 여부 테스트 등)의 수행 여부를 테스트하는 것이다.

 

유연하고 정확하지 않을 수 있기 때문에 Mock 대신 Fake를 쓰라는 의견도 있다.

하지만, 문서화와 unit test 등의 목적에 따라 부합하게 사용한다면 mock도 좋은 테스트라고 생각한다.

 

 

 


 

참고

https://martinfowler.com/bliki/TestDouble.html

 

bliki: TestDouble

Test Double is generic term for fakes, mocks, stubs, dummies and spies.

martinfowler.com

https://microsoft.github.io/code-with-engineering-playbook/automated-testing/unit-testing/mocking/

 

Mocking in Unit Tests - Code With Engineering Playbook

Mocking in Unit Tests One of the key components of writing unit tests is to remove the dependencies your system has and replacing it with an implementation you control. The most common method people use as the replacement for the dependency is a mock, and

microsoft.github.io

https://tecoble.techcourse.co.kr/post/2020-09-19-what-is-test-double/

https://hudi.blog/test-double/

 

 

728x90

'지식' 카테고리의 다른 글

Parameter, Argument, Element  (0) 2022.05.21
OSI 7계층  (0) 2022.04.23
PM과 PMO  (0) 2022.04.01

댓글