-
Spring Boot: TestContainers 🍃🐳🧑🔧Spring Boot 🍃 2023. 12. 9. 00:01
CRUD 테스트 코드를 작성할 때 어떤 DB 환경이 좋을지에 대한 고민
다양한 선택지들
-
운영환경과 유사한 스펙의 DB (
개발 환경 DB
) 사용 👉 버전 이슈, 초기 설정 등등 초기 세팅이 복잡하다는 단점이 있다. -
인메모리 DB
(ex. h2) 사용 👉 운영환경과 다르기 때문에 통합테스트 환경에선 docker 또는 TestContainers 를 사용하게 된다. -
Docker
사용 👉 container 관리를 별도로 해주어야하기 때문에 관리포인트가 늘어나는 단점이 있고, docker를 실행하기 위해 docker-compose 와 같은 스크립트를 별도로 작성해주어야하는 단점이 있다. -
TestContainers
이용 👉 TestContainers 는 운영 환경과 유사한 DB 스펙으로 독립적인 환경에서 테스트 코드를 작성하여 테스트가 가능하다.
TestContainers
TestContainers 는
-
Java 언어만으로 docker container를 활용한 테스트 환경 구성이 가능하다.
-
도커를 이용하여 테스트할 때 컨테이너를 직접 관리해야 하는 번거로움을 해결해주며, 운영 환경과 유사한 스펙으로 테스트가 가능하다.
-
테스트 코드가 실행 될 때 자동으로 도커 컨테이너를 실행하여 테스트하고, 테스트가 끝나면 자동으로 컨테이너를 종료 및 정리해준다.
-
다양한 모듈이 존재한다.
적용
MariaDB와 Redis를 독립된 환경에서 테스트 코드 작성을 위해 TestContainers 적용
testcontainers jdbc 연동 공식 문서 링크
build.gradle 의존성 추가
redis의 경우 제공되는 모듈이 없기 때문에 , docker에서 직접 가져와야한다.
testImplementation 'org.testcontainers:spock:1.17.1' // test에 사용할 groovy 언어 기반 BDD 프레임워크 testImplementation 'org.testcontainers:mariadb:1.17.1'
test/resources/application.yml 작성
spring: datasource: driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver url: jdbc:tc:mariadb:10:///
redis 싱글톤 컨테이너 실행 코드 작성
@SpringBootTest abstract class AbstractIntegrationContainerBaseTest extends Specification { static final GenericContainer MY_REDIS_CONTAINER static { MY_REDIS_CONTAINER = new GenericContainer<>("redis:6") .withExposedPorts(6379) MY_REDIS_CONTAINER.start() System.setProperty("spring.redis.host", MY_REDIS_CONTAINER.getHost()) System.setProperty("spring.redis.port", MY_REDIS_CONTAINER.getMappedPort(6379).toString()) } }
spock 를 사용하고 있기 때문에, groovy 언어로 작성 ! java와 스타일이 굉장히 비슷하다.
'Spring Boot 🍃' 카테고리의 다른 글
Spring boot & thymeleaf : context path 변경 (0) 2023.12.10 Spring Boot: Retry (0) 2023.12.09 Spring Boot: profile 환경 나누기 (0) 2023.12.09 rest-projection (0) 2023.12.09 csrf (0) 2023.12.09 -