티스토리 뷰
[Test] Spring boot, Junit, Testcontainers를 이용한 테스트 환경 만들기
5_Clock 2024. 4. 11. 23:46서론
Testcontainers을 알게되기 전엔 테스트를 하며 임베디드 처리를 하던 DB, Kafka, Redis등의 인프라들이 있었습니다. 예를 들어, Redis는 https://www.baeldung.com/spring-embedded-redis를 참고하여 임베디드 처리했습니다. 그리고 Kafka는 @EmbeddedKafka를 사용하였습니다. 이런 임베디드 처리 코드를 늘려갈수록 불필요한 코드가 많아짐을 느꼈습니다. 또한, @Profile 처리를 해야하는 일이 많았습니다. 테스트 코드에는 어노테이션이 많아지고 이를 상속으로 해결하려해도 뭔가 지저분해 보여서 다른 방법이 없나에 대한 생각을 하다 Testcontainers를 발견하게 되었습니다. 임베디드보다 간단하게 설정이 가능하고 여러 인프라를 아우르기 때문에 편하다고 느꼈습니다.
Testcontainers 설정
testcontainers는 간단한게 dependency로 설치가 가능합니다.
testImplementation("org.testcontainers:junit-jupiter")
testImplementation 'org.testcontainers:mariadb:1.17.1'
위와 같이 junit용 testcontainers dependency를 입력해주면 됩니다.
만약 spock를 테스트 라이브러리로 사용한다면, 해당 dependency를 입력하면 됩니다.
그리고 mariadb와 같은 경우도 별도로 설치를 해줘야하고 사용하는 db에 맞게 찾아 설치하면 됩니다.
https://java.testcontainers.org/
위 링크에서 지원가능한 DB와 Module들이 모두 적혀있고, 해당 문서를 읽으면서 설정해주면 됩니다.
이 글에서는 mariadb와 redis만을 다루고자 합니다.
DB설정
application.yml 파일에 DB관련 설정 값들을 입력해줍니다.
여기서 주의할 점은 application.yml 파일은 "test/java/resources" 경로에 설정해주는 것입니다.
spring:
datasource:
driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver
url: jdbc:tc:mariadb:10:///
jpa:
hibernate:
ddl-auto: create
show-sql: true
간단한 jpa설정과 testcontainers의 url과 driver를 입력해주면 db설정은 끝입니다.
다른 DB를 사용한다면, https://java.testcontainers.org/modules/databases/jdbc/ 에서 url을 확인하고, https://java.testcontainers.org/modules/databases/에서 db dependency를 찾아 설치하면 됩니다.
Redis 설정
Redis는 앞선 DB와는 달리 설정이 다릅니다. 왜냐하면 기본적으로 testcontainers에서 지원하지 않기 때문입니다.
이렇게 지원하지 않는 인프라는 GenericContainer를 이용하면 됩니다.
테스트 폴더의 적당한 위치에서 아래의 파일과 같이 만들어줍니다.
@SpringBootTest
public class ProjectDirectionApplicationTests {
static final GenericContainer MY_REDIS_CONTAINER = new GenericContainer<>("redis:6")
.withExposedPorts(6379);
@Before
public void setup(){
System.setProperty("spring.redis.host", MY_REDIS_CONTAINER.getHost());
System.setProperty("spring.redis.port", MY_REDIS_CONTAINER.getMappedPort(6379).toString());
}
}
위처럼 property에 어떤 이미지를 어떤 포트에 띄울지 설정해주면 끝입니다.
https://java.testcontainers.org/features/creating_container/
위 링크에서 설정을 하는 방법이 설명되어 있습니다.
결론
testcontainers를 하면서 테스트를 위한 파일이나 임베디드 설정을 찾기 위해서 고생했던게 훨씬 쉽게 해결되면서 앞으로 테스트 환경을 구축할때는 testcontainer를 사용해야겠다고 생각했습니다. 또한, 어쨌든 라이브러리를 많이 사용해야하는 상황에서 각 라이브러리들의 문서들을 잘 찾아 읽는 능력도 중요하다고 생각이 들었습니다.
'Back End > Spring' 카테고리의 다른 글
Spring Caching으로 성능 올리기 - (1) 기본 사용법 (0) | 2024.12.01 |
---|---|
[Spring Data] Spring Data MongoDB - insert() vs save() (0) | 2024.04.06 |
[Spring] Logback으로 Spring 애플리케이션 Logging 하기 (2) | 2024.03.05 |
[Spring] Feign Client - (2) logger, interceptor, error decoder (1) | 2024.02.22 |
[Spring] Feign Client - (1) Naver API 호출하기 (0) | 2024.02.18 |
- Total
- Today
- Yesterday
- consumer
- JPA
- spring
- feign client
- API
- React
- Firebase
- frontend
- docker
- Container
- 프론트엔드
- Producer
- Java
- Linux
- broker
- cs
- KAFKA
- Data Engineering
- K8S
- 리액트
- NextJS
- apache kafka
- apache
- rhel
- Front
- centos
- spring boot
- OS
- zookeeper
- logback
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |