개발
프로그래밍/소프트웨어 개발
Level Up Your Testing Game with Jest Spies and Asymmetric Matchers
분야 프로그래밍/소프트웨어 개발
대상자
- 소프트웨어 개발자 (특히 AWS SDK나 3rd-party API를 사용하는 함수의 단위 테스트를 작성하는 개발자)
- 난이도: 중급~고급 (Jest의 스파이 및 비대칭 매처 기능 활용 능력이 필요)
핵심 요약
- Jest 스파이는 실제 코드를 변경하지 않고 함수 호출의 행동을 모니터링할 수 있는 테스트 도구로,
jest.spyOn
을 사용해 SDK 호출 시점과 파라미터를 검증할 수 있습니다.
- 비대칭 매처(Asymmetric Matchers)는 부분 일치 검증을 가능하게 하여, GetCommand의 메타데이터와 같은 추가 정보를 무시하면서도 필수 파라미터를 검증할 수 있습니다.
expect.objectContaining
은 객체 내 특정 필드만 검증하는 유연한 검증 방식으로, 테스트의 정밀도와 효율성을 높입니다.
- 테스트의 핵심은 실제 SDK와의 상호작용을 정확히 반영하는 것이며,
expect.any
와 같은 일반적 매처는 과도하게 사용할 경우 테스트의 신뢰성을 떨어뜨릴 수 있습니다.
섹션별 세부 요약
1. 3rd-party API 테스트의 어려움
- 실제 AWS SDK 호출이 필요한 함수의 단위 테스트는 AWS 계정 접근 또는 로컬 DynamoDB 설정 등 복잡한 환경 설정이 필요합니다.
- 모의 객체(mock)를 사용해 SDK 호출을 대체하더라도, 호출 시점 및 파라미터 검증이 부족한 경우 테스트의 신뢰성이 떨어집니다.
- 테스트 대상 함수는 DynamoDB의
GetCommand
를 사용해 테이블명과 키 값을 기반으로 데이터를 조회합니다.
2. Jest 스파이로 SDK 호출 검증
jest.spyOn
을 사용해 docClient.send
메서드를 모니터링하여, 호출 횟수와 전달된 파라미터를 검증할 수 있습니다.
- 예:
expect(spyOnDB).toHaveBeenCalledTimes(1)
로 정확한 호출 횟수를 확인하거나, toHaveBeenCalledWith
로 전달된 인자 검증.
- 모의 응답을 설정해 테스트가 성공적으로 동작하는지 확인할 수 있습니다.
3. 비대칭 매처로 복잡한 파라미터 검증
expect.objectContaining
은 객체 내 특정 필드만 검증할 수 있는 유연한 검증 방식으로, GetCommand의 메타데이터와 같은 추가 정보는 무시할 수 있습니다.
- 예:
expect.objectContaining({ TableName: 'Todos', Key: { id: '123' } })
로 테이블명과 키 값만 검증.
expect.stringContaining
또는 expect.stringMatching
은 문자열 형식 검증에 유용하며, 테스트의 구체성을 높입니다.
4. 테스트 최적화 및 주의 사항
- 비대칭 매처는 과도하게 사용하지 않도록 주의해야 하며,
expect.anything
이나 expect.any
와 같은 일반적 매처는 테스트의 정밀도를 떨어뜨릴 수 있습니다.
- 테스트의 핵심은 실제 SDK와의 상호작용을 정확히 반영하는 것이며, 테스트는 함수의 기능뿐만 아니라 SDK 호출의 적절성도 검증해야 합니다.
- 모의 객체를 사용할 때도, 실제 시나리오에 가까운 파라미터를 전달해 테스트의 현실성과 신뢰성을 높이는 것이 중요합니다.
결론
- Jest 스파이와 비대칭 매처를 결합하면, 3rd-party API와의 상호작용을 정확하게 검증할 수 있는 강력한 테스트 전략을 구축할 수 있습니다.
- 테스트는 함수의 기능을 확인하는 것뿐만 아니라, SDK 호출의 정확성도 검증해야 하며, 이는 애플리케이션의 신뢰성과 안정성을 유지하는 데 필수적입니다.
- 비대칭 매처는 유연성을 제공하지만, 과도한 사용은 테스트의 부정확성을 초래할 수 있으므로, 필요한 부분만 정밀하게 검증하는 것이 중요합니다.
- 모의 객체를 사용할 때도 실제 시나리오에 기반한 파라미터를 전달해 테스트의 현실성을 높이는 것이 추천됩니다.
Jest Spies
Asymmetric Matchers
Unit Testing
AWS
SDK
Mocking
Testing