테스트 대역(Test-Double)
테스트를 작성할 때 운영 코드를 대신해 행동하는 행동 대장들
마틴 파울러 문서 중 일부입니다. 더 이상 혼동하지 않게 되길…
용어
Mock 이란 아래 이야기할 것들의 집합입니다. 우리가 예상된 결과를 미리 작성해두는 형태의 프로그램 된 개체들입니다.
- Dummy: 실제 사용하는 운영 코드가 아니라 테스트를 위해 작성한 코드
- Fake: 실제로 작동하는 구현체이지만 운영에 사용하기 적합하지 않음(ex: 인 메모리 디비)
- Stub: 테스트 작성 시 지정된 호출에 지정된 답을 함
- Spy: 호출 시 일부 정보를 기록, 이 정보를 테스트의 말미에 검증
- 이메일 전송 서비스: 얼마나 많은 메시지가 전송되었는지
- 회원 가입: 이메일, 비밀번호 저장
- etc.
예
어떤 정보를 이메일로 전송하는 EmailService를 생각해보면, 테스트를 구동할 때마다 메일을 보내고 싶은 사람은 없을 것입니다.
우리가 작성한 Stub은 이메일을 전송하는 대신
- 메일 정보를 저장하고 테스트에선 이메일 정보가 몇 개가 있는지 확인할 수 있습니다(행위 검증).
- 물론 이 경우에는 실제 EmailService에서 이메일 전송에 사용할 메소드 외에 추가로 테스트에 사용할 메소드도 작성해야 합니다.
- 혹은 메일 주소는 정확한지, 메일 내용은 특정 문구가 포함되었는지 등 정보를 확인해볼 수도 있습니다(상태 검증).
이렇게 Stub은 행위를 검증할 수도 있고 상태를 검증할 수도 있습니다(마틴 파울러는 독자가 직접 두 가지 모두 경험해보길 바라고 있습니다). 제 경험에는 상태를 검증하는 경우 테스트가 더 깨지기 쉽게 되고 행위를 검증하는 경우 조금은 더 안정적으로 테스트를 유지할 수 있다고 판단했습니다. 한쪽이 더 뛰어난 것은 없습니다. 언제나 그렇듯 우리는 선택지가 있다면 저울질해 보고 그 상황에 맞는 답
을 택하는 방법이 최선이란 것을 알고 있습니다.