Mock 이란?
정의
소프트웨어 테스트에서 실제 객체를 대신하여 사용하는 '가짜 객체'를 의미
사용하는 이유
- 테스트 환경을 구현하기 힘든 경우
- 테스트 대상이 외부 시스템과의 의존성이 높아 직접 테스트하기 힘든 경우
- 테스트하기 힘든 상황이 기대한 대로 상호작용하는지 검증하기 위한 경우
- 테스트 실행에 많은 시간이 걸리는 경우
사용되는 경우
- 데이터베이스 연동 테스트
- 외부 API 호출 테스트
- 네트워크 통신 테스트
- 파일 시스템 접근 테스트
사용하지 말아야하는 경우
- 순수 함수 : reduce, map 등등 은 입력이 같으면 항상 같은 결과를 반환
- 간단한 상태 관리 로직
- 단순한 의존성 또는 데이터 구조를 사용하는 경우
- 실제 동작 검증이 필요한 경우
- 과도한 mocking 으로 인해 테스트 유지보수가 어려운 경우
- Mock 객체의 설정이 실제 환경과 크게 다를 경우
- 상태 검증 기반이 더 적합한 경우
종류
- 스텁(stub) : 특정한 입력에 대해 미리 정해진 결과를 반환하도록 하드 코딩된 객체
- 페이크 객체 (fake object) : 실제로 동작하는 것처럼 보이지만, 프로덕션 환경에서 사용하기에는 단순화된 구현을 가진 객체
- 스파이 (spy) : 실제 객체를 부분적으로 목킹하여, 호출된 메서드나 파라미터 등을 기록하고 검증할 수 있는 객체
- Mock 객체 (mock object) : 실제 객체의 행위를 흉내내어 행위 기반 테스트를 위해 사용. 호출 여부, 호출 횟수, 전달된 파라미터 등을 검증가능
이점
- 외부 의존성(API, 데이터베이스 등) 없이 테스트 가능
- 테스트 실행 속도 향상
- 특정 상황(에러, 타임아웃 등)을 쉽게 시뮬레이션
- 함수 호출 여부, 인자, 횟수 등을 검증 가능
Mock 객체 사용 여부 판단 기준
- 이 코드가 외부 리소스에 의존하는가?
- API 호출
- 데이터베이스 접근
- 파일 시스템 사용 : 파일 읽기/쓰기 가 필요한 경우
- 테스트 실행이 느리거나 비용이 드는가?
- 무거운 연산
- 네트워크 지연
- API 호출 비용
- 테스트 결과가 비결정적인가?
- 랜덤 값 사용 : 무작위 값에 따라 결과가 달라지는 경우
- 시간에 의존적인 로직 : 현재 시간이나 날짜에 따라 동작이 변하는 경우
- 동시성 이슈 : 멀티스레딩 등으로 인해 겨로가가 일정하지 않은 경우
- 테스트 셋업이 복잡한가?
- 많은 의존성 필요 : 여러 모듈이나 서비스에 의존하는 경우
- 복잡한 상태 설정 필요
(단순한 예시) 테스트를 위해서 만들어진 user 객체 ?
▶ user 는 테스트를 위해서 임의로 만들어진 단순한 데이터 객체이지 행위는 없다. 그러므로 Mock 객체라고 할 수 없다.
'TDD > jest' 카테고리의 다른 글
[ jest] 레이터 테스트 중 sign up service 를 test 하기 (0) | 2024.12.05 |
---|---|
[ jest ] Reflect.getMetadata(metadataKey, target) - 설정된 메타데이터 확인하는 메서드 (0) | 2024.12.02 |
[ jest ] mockResolvedValue와 mockReturnValue의 차이 (0) | 2024.12.02 |
[ jest ] toBe vs toEqual vs toStrictEqual 차이점 (0) | 2024.12.01 |
[ jest ] 에러 처리를 위한 단위 테스트 작성 (Create) (0) | 2024.11.14 |