# 테스트 용어 정리

#### SUT(System Under Test)

* 테스트의 대상이 되는 시스템 혹은 객체

#### 협력객체(collaborator)

* 부차적 객체(secondary objects)

#### 테스트 더블(Test Double)

* 진짜 객체 대신 테스트 용도로 사용되는 모든 종류의 위장 객체
* 종류
  * Dummy 객체: 전달되지만 실제로는 사용되지 않는다. 일반적으로 매개 변수 목록을 채우기 위해 사용된다.
  * Fake 객체: 프로덕션에는 적합하지 않은 방법으로 구현되어 있는 객체이다. 예를 들면 DB에 접근하는 대신 테스트 전용 인메모리 DB에 접근하는 방식에서 이를 사용한다.
  * Stub: 테스트 중에 호출되면 미리 준비된 결과를 제공한다. 보통은 테스트를 위해 프로그래밍한 내용이 아니면 응답하지 않는다.
  * Spy: 자신이 호출된 방법/과정 등의 정보를 기록하는 Stub이다. 이메일 서비스에서 몇 개의 이메일을 보냈는지 기록하는 형태가 Spy에 해당한다.
  * Mock: 호출했을 때 사전에 정의된 명세대로의 결과를 돌려주도록 미리 프로그램되어있다. 예상치 못한 상황에서 호출되면 예외를 발생시킬 수 있으며, 예상한 만큼 호출되었는지 확인한다.

#### 상태 검증

* 메서드가 수행된 후 SUT나 협력객체의 `상태`를 살펴봄으로써 올바르게 동작했는지 판단
* 상태를 검증하기 위해 프로덕션에서는 필요없는 상태 노출 메서드(ex. getter)가 추가될 수 있다.

#### 행위 검증

* 해당 메서드가 호출되었는지 검증함으로써 올바르게 동작했는지 판단한다.
* 구현에 의존적이기 때문에 프로덕션 코드가 수정될 때 테스트 코드가 변경될 확률이 높아진다.
* 테스트 작성이 상태 검증보다 쉽기 때문에 설계 상 문제점을 파악하기 어려워질 수 있다.
* 알람 등의 경우 상태 검증이 어려우므로 통합 테스트를 고려해볼 수 있지만 SUT가 아닌 다른 곳에 의존성이 생길 수 있어, 행위 검증을 하는게 나을 수도 있다.

#### 출처

<https://johngrib.github.io/wiki/test-terms/>

[https://joont92.github.io/tdd/상태검증과-행위검증-stub과-mock-차이/](https://joont92.github.io/tdd/%EC%83%81%ED%83%9C%EA%B2%80%EC%A6%9D%EA%B3%BC-%ED%96%89%EC%9C%84%EA%B2%80%EC%A6%9D-stub%EA%B3%BC-mock-%EC%B0%A8%EC%9D%B4/)
