본문 바로가기
테스트 쉽게하기

Redis 로컬 테스트 하는 두 가지 방법 : testContainers

by 6161990 2024. 12. 1.


Redis 구현 후 local 에서 실행시키는 여러가지 방법이 있습니다. 하나씩 실험삼아 기록해두려고합니다.

 

첫번째는 아주 쉽고 베이직한 접근방법입니다. application.yaml 세팅없이 실행시 localRedisConfig 로 세팅할 수 있습니다.

 

 

다음은 그냥 redis 서버 포트를 yaml 에 세팅해둘 수 있는 방법입니다.

 

 

 

둘 중 어느 방법을 선택하던지 아래 테스트 코드를 통해 결과를 확인해볼 수 있습니다.

 

 

 

메인 코드는 아래를 참조해보실 수 있습니다. 

 

 

org.springframework.boot.autoconfigure.data.redisRedisAutoConfiguration 을 디버깅을 해보았습니다.

 

 

 

RedisTemplate 생성시, yaml 에 설정해놓은대로 127.0.0.1 들어갔습니다. 

 

 

다음은 testContainers 를 이용하는 방법을 소개해보겠습니다. 대신 스프링 3.1.0 버전 이상이여야한다는 제한이 있습니다. 저도 로컬에서 갖고 놀던 프로젝트를 2.7 대에서 3.1.0 으로 업그레이드하였습니다.

 

 

 

추가로 testcontainersdependencies 해야합니다.

 

 

 

바로 테스트 코드를 돌려보겠습니다. 

 

 

테스트가 성공합니다. redis debug 레벨 로그도 확인됩니다.

 

 

 

이 방법은 첫 테스트 코드과 동일하지만, 다른 한 가지가 있습니다. (숨은 그림 찾기.. 위로 올려서 찾아보세요) AbstractTestcontainers 를 상속한다는 점입니다. AbstractTestcontainers 를 살펴보겠습니다. 

 

 

 

TestContainers 는 뭘까요. 우선 TestContainers 는 다음과 같은 고민의 해답이 될 수 있습니다.

  • JPA 이용하여 CRUD 테스트 코드를 작성할 때 어떤 DB 환경이 좋을까?
  • 어떻게 Kafka 메시징 produce, consume 테스트를 할 수 있을까?
  • redisTemplate 을 이용하여 작성한 코드를 어떻게 테스트할 수 있을까?


일반적으로 JPA CRUD 테스트시에는 운영환경과 유사한 스펙의 DB(개발 환경 DB) 사용하거나 인 메모리 DB(ex H2) 사용합니다. 독립적인 공간에서 테스트를 실행하지만, 실제 운영환경 DB 와 다릅니다. 어떤 엣지 케이스가 발생할지 테스트에서 확인할 수 없습니다. (격리레벨 or 전파레벨 등의 테스트). Docker 사용하는 방법도 있습니다. 근데 docker compose 에 대한 스크립트를 작성해야합니다.

그리고 마지막 방법으로 TestContainers 가 있습니다, 위에 나열한 도구들의 한계를 극복할 수 있는 도구가 TestContainers 입니다. 도커 컨테이너를 직접 관리하지 않고도 테스트 코드가 실행될 때 자동으로 도커 컨테이너를 실행합니다. 테스트가 끝나면 자동으로 컨테이너를 종료 하고 정리까지 합니다. 다양한 모듈 및 테스트 라이브러리를 지원하고 있습니다. S3, kafka 도 역시 가능합니다.

 

spock 도 가능함

 

JDBC 테스트 경우 spring.datasource.urljdbc:tc:... 로 하면 port, database name 을 testContainerDriver 가 알아서 지정을 해줍니다. port 같은 경우, 충돌되지 않을 random port 로 설정됩니다.

 

 

제가 실험해보았던 redis 의 경우, Docker imageTestContainer 와 연동하는 방식으로 사용해본 사례입니다. new GenericContainer() 키워드와 관련있습니다. 관심있다면 더 찾아보세요 ㅎ 참고로 키고 끌 때 시간이 오래 걸리므로 싱글톤으로 관리하는 게 좋습니다. 공식 문서에 관련 내용이 있습니다. 

 

 

단적으로 redis 를 테스트하는 두 가지 방법을 소개해보았습니다. 근데 사실 testContainer 를 이용한다면 카프카든, S3 든 쉽게 테스트 해볼 수 있을 것 같습니다.