마이크로서비스패턴[9] — 9장
9장 마이크로서비스 테스트 1부
1장 모놀리식 지옥에서 벗어나라
2장 분해 전략
3장 프로세스 간 통신
4장 트랜잭션 관리: 사가
5장 비즈니스 로직 설계
6장 비즈니스 로직 개발: 이벤트 소싱
7장 마이크로서비스 쿼리 구현
8장 외부 API 패턴
9장 마이크로서비스 테스트 1부
10장 마이크로서비스 테스트 2부
11장 프로덕션 레디 서비스 개발
12장 마이크로서비스 배포
13장 마이크로서비스로 리팩터링
9. 마이크로서비스 테스트 1부
9.1. 마이크로서비스 아키텍처 테스트 전략
9.1.1. 테스트 개요
자동화 테스트 작성
JUnit 등의 테스트 프레임워크로 작성하며 아래와 같은 4단계로 구성된다.
1 ) 설정 : 테스트 클래스를 생성하고 초기화를 한다.
2) 실행 : 테스트 클래스의 메서드를 호출한다.
3) 확인 : 호출 결과 및 테스트 상태를 단언(assertion)한다.
4) 정리 : 테스트한 픽스처를 정리한다. 건너뛰는 경우도 있으며, 설정 단계에서 초기화 한 DB 트랜잭션을 롤백하는등의 정리를 한다.
Mock/Stub를 이용한 테스트
- Mock : 행위에 대한 검증 — 특정 행위를 수행했는지에 대한 테스트
- Stub : 상태에 대한 검증 — 흔히 Mockito의 mock()을 활용한 상태주입 후 검증 테스트
테스트 종류
- 단위 테스트 : 서비스의 작은 부분을 테스트(클래스)
- 통합 테스트 : 어플리케이션 서비스의 인프라 및 외부서비스와의 연동 테스트
- 컴포넌트 테스트 : 개별서비스들에 대한 인수테스트(Acceptance Test)
- 종단 간 테스트(end-to-end) : 전체 어플리케이션에 대한 인수테스트
테스트 분류 기준
1 ) 테스트 사분면
- 비즈니스 <->기술 테스트에 대한 지표 비교
- 테스트의 목적이 프로그래밍 지원인지, 어플리케이션의 평가를 위함인지 비교
2 ) 테스트 피라미드
- Unit Tests : 단위테스트. 비즈니스 로직을 테스트
- Integration Tests : 통합테스트. 서비스가 디펜던시와 원활하게 소통하는지 확인
- System Integration Tests( Service Acceptance Test) : 서비스 인수 테스트
- E2E(End-to-End) : 어플리케이션 인수 테스트
9.1.2. 마이크로서비스 테스트
IPC는 마이크로서비스환경에서 모놀리식 아키텍처보다 더 큰 역할을 맡고 있다. 마이크로서비스환경은 여러개의 서비스들로 이루어진 하나의 분산시스템으로, 서비스 개발자들은 디펜던시 및 클라이언트와 잘 연동되는지 테스트를 작성해야 한다. 서비스는 다양하게 IPC로 통신하기 때문에 각각의 상호작용 성격에 따라 API 테스트 유형을 정의해야 한다.
- REST 클라이언트 -> 서비스
API 게이트웨이는 서비스로 요청을 라우팅하고 API를 조합한다. - 도메인 이벤트 컨슈머 -> 구독기
- 커맨드 메시지 요청자 -> 응답자
컨슈머 주도 테스트 — Spring Cloud Contract
컨슈머 주도 테스트는 프로바이더의 API가 컨슈머가 기대한 바와 일치하는지 확인하는 프로바이더에 대한 통합 테스트이다.
컨슈머 주도 테스트의 초점은 프로바이더의 API 스팩이 컨슈머가 기대한 것과 부합하는지 확인하는 것이다.
컨슈머 주도 테스트는 Spring Cloud Contract와 Pact Foundation의 제품군으로 주로 테스트를 진행한다.
9.1.3. 배포 파이프라인
배포 파이프라인은 Jenkins같은 CI 툴로 배포 파이프라인을 구성한다.
배포 프로세스는 조직마다 상이할 수 있지만, 본 책에서는 아래와 같이 구성했다.
커밋 테스트 -> 통합 테스트 -> 컴포넌트 테스트 -> 배포
9.2. 서비스 단위 테스트 작성
단위테스트는 2가지 종류가 있다.
- 독립(solitary) 단위 테스트 : 클래스 디팬던시를 mock 객체로 나타내고, 클래를 따로 테스트한다.
- 공동(sociable) 단위 테스트 : 클래스와 디펜던시를 테스트한다.
단위테스트 작성
- 엔티티
- Value Object
- Saga
- Domain Service
- Controller
- Event/Message Handler
역시 필요한건 코드다.