통합 테스트(Integration Test)
통합 테스트란?
다양한 구성 요소(서비스) 간 연결 및 종속성에서 버그를 찾고 안정성을 유지하기 위한 테스트이다. DB, Caching, MQ Server 등..다른 구성요소와 연동이 되는지 확인하기 위한 테스트이다.
목적
- 유효하지 않은 인수 확인
- DB schema 와 Application 간 싱크 확인
- Cache 가 적용되는지 확인
- 데이터 flow 오류 확인
통합 테스트 코드 작성
- Test 순서 또는 종속성이 테스트 결과를 변경해서는 안된다.(이 부분은 Unit Test 또한 같다.) 각 Test 는 언제 실행해도 동일한 결과를 반환해야 한다.
- 시스템 전체가 올바로 동작하는지 확인하고, 모든 경우의 수보다는 모듈간 연결에 중점을 둔다. 성공 케이스만 테스트하는 것이 일반적이다.
- db 스키마가 깨지는지, cache 가 적용이 되는지 등.. 연동성을 중심적으로 테스트 코드를 작성한다.
통합 테스트 환경 만들기
테스트 단계에서 상용서버나 개발서버의 실제 서비스 애플리케이션과 연동을 하게되면 데이터가 꼬일 수 있다. 혹은 문제 발생시 디버깅이 어려워지거나…
통합 테스트만을 위한 새로운 인스턴스가 필요한데, 새로운 서버를 발급받아 돌리기엔 테스트에만 사용하기 때문에 비효율적이다. 테스트할 때만 생성하고 테스트 후에는 지워질 수 있는 것이 필요하다.
docker
docker(또는 docker-compose) 를 사용하여 테스트에 필요한 인스턴스를 띄운 후 통합 테스트를 진행할 수 있다.
testcontainers
testcontainers
라는 라이브러리를 사용하면, docker 를 띄우는 것과 동일하게 만들 수 있다. (정확히는 내부적으로 실제 docker 인스턴스를 띄우기 때문에 docker 를 띄우고 내리는 과정을 자동화해주는 것이다. 그래서 test 를 돌리는 환경에서 docker 도 설치되어 있어야 한다.) testcontainer 로 컨테이너화된 DB 인스턴스를 띄울 수 있고, 그 인스턴스를 사용하여 통합 테스트를 할 수 있다. (java, node 등 다양한 언어 지원, https://github.com/testcontainers)
만약 testcontainers 가 없다면, docker up → run test code → docker kill 과 같은 과정을 직접 해야할 것 이다.
ex) Database 통합 테스트
Database 에 대한 통합 테스트를 작성하는 경우 연동하는 DB 에 대한 table schema 생성 쿼리가 필요하다. 컨테이너를 띄우면서 인스턴스에 테이블을 생성하고, Application 에서 사용하는 CRUD Query 를 실행해본다.
vs 단위 테스트(Unit Test)
단위 테스트의 목적
- 요구사항이 올바로 반영되었는지 확인
- 단순히 동작하는 것 이상으로 코드를 깔끔하고, 고품질로 유지하기 위해
- vs 통합 테스트 : 시스템이 올바로 동작하는지 확인.
- 일종의 문서화 기능도…
- 모든 경우의 수를 확인
- 단위 테스트는 성공, 실패 케이스, 더 나아가 성공/실패 안에서도 더욱 세부적인 경우를 각각의 테스트 코드로 작성
- vs 통합 테스트 : Application 간 연결에 중점을 두어 테스트하고, 성공 케이스만 테스트하는 것이 일반적.
단위 테스트와 통합 테스트는 목적은 다르지만, 서로 보완적이기 때문에 둘 다 필요한 테스트.