개발 문화 · 협업 · 중급
테스트 더블(Test Double)의 개념과 종류(Dummy, Fake, Stub, Spy, Mock)에 대해 간략히 설명하고, 각각의 사용 사례를 예시로 들어주세요.
힌트 · 테스트 대상 객체의 의존성을 제어하기 위한 객체들로, 목적에 따라 다양한 유형이 있으며 특정 상황에서 유용하게 사용됩니다.
테스트 격리의존성 대체상태 검증행위 검증테스트 용이성
모범답안
테스트 더블은 테스트 대상 객체의 의존성을 대체하는 객체입니다. 테스트 격리를 통해 테스트를 용이하게 만들어주죠. 종류는 크게 다섯 가지가 있습니다.
Dummy: 단순히 객체 전달을 위해 존재하며, 실제로 사용되지는 않습니다. 예를 들어, 생성자에 객체를 넘겨줘야 하지만 테스트에서 필요 없는 경우에 사용합니다.
Fake: 실제 동작을 흉내 내지만, 단순화된 형태로 구현됩니다. 예를 들어, 실제 데이터베이스 대신 메모리 데이터베이스를 사용하는 경우가 있습니다.
Stub: 미리 정의된 결과를 반환하도록 설정된 객체입니다. 특정 입력에 대해 항상 같은 출력을 보장해야 할 때 유용합니다. 예를 들어, 외부 API 호출 결과를 미리 정의된 값으로 대체할 수 있습니다.
Spy: Stub과 유사하지만, 호출 정보를 기록합니다. 호출 횟수나 인자 등을 검증할 때 사용합니다. 예를 들어, 특정 함수가 몇 번 호출되었는지 확인할 수 있습니다.
Mock: Spy보다 더 강력하며, 행위 검증에 특화되어 있습니다. 예상되는 상호작용을 미리 정의하고, 실제로 그 상호작용이 발생하는지 검증합니다. 예를 들어, 특정 메서드가 특정 인자로 호출되는지 확인할 수 있습니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 테스트 (TDD / BDD) 면접 질문
- BDD 시나리오 작성 시 사용되는 Given-When-Then 구조에 대해 설명하고, 이 구조가 협업에 어떤 도움을 주는지 이야기해주세요.
- 단위 테스트(Unit Test) 작성 시 Mock이나 Stub 객체를 사용하는 이유와, 실제 객체를 사용하는 경우와 비교하여 설명해주세요.
- TDD/BDD 관점에서 단위 테스트, 통합 테스트, E2E 테스트의 적절한 비중과 각각의 역할에 대해 설명해주세요.
- TDD/BDD가 시스템 아키텍처 설계에 미치는 심층적인 영향은 무엇이며, 특히 모듈성, 응집도, 결합도 측면에서 어떤 변화를 가져온다고 생각하십니까? 실제 프로젝트에서 이러한 영향을 어떻게 경험하셨습니까?
- 마이크로서비스 아키텍처와 같은 분산 시스템 환경에서 TDD/BDD를 적용할 때 직면하는 주요 도전 과제는 무엇이며, 서비스 간의 상호작용 및 통합 테스트 전략을 TDD/BDD 원칙에 따라 어떻게 수립하고 구현할 수 있을까요?
- TDD/BDD는 주로 기능 요구사항(Functional Requirements)에 초점을 맞추는 경향이 있습니다. 성능, 보안, 확장성 등 비기능 요구사항(Non-functional Requirements)을 TDD/BDD 프로세스 내에서 효과적으로 테스트하고 검증하기 위한 구체적인 전략이나 접근 방식은 무엇입니까?