Testcontainers ddl-auto 동작 시점
spring boot, jpa, junit5, testcontainers를 이용해서 테스트 코드를 작성하고 있습니다.
총 12개의 테스트 클래스를 만들었고 각 클래스마다 testcontainers 객체를 static으로 가지고 있고 모두 @SpringBootTest, @Testcontainers 어노테이션만 추가했습니다.(Controller 테스트 시 @AutoConfigureMockMvc 어노테이션 추가)
jpa의 ddl-auto 값을 create-drop으로 설정했기 때문에 gradle test를 실행할 때 예상되는 결과는 각 클래스를 테스트할 때마다 테이블이 새로 생성되어야 할 것 같은데 실제로는 총 2번 생성됩니다.
각 클래스마다 Testcontainers를 적용했음에도 불구하고 실패한 로그를 보면 이전 클래스에서 사용한 데이터를 다음 클래스에서도 사용하는 것처럼 보이는데
테스트 실행 시 각 테스트 클래스마다 jpa의 ddl-auto 속성이 동작하지 않는 이유
각 클래스에 Testcontainers를 적용했음에도 불구하고 생성된 데이터베이스가 컨테이너들이 공유하는 이유
가 궁금합니다.
답변 2
0
각각의 테스트마다 각기 다른 컨테이너를 띄우고, 다른 DB를 사용하도록 의도한 것이라면 실제로 DB가 제 각각 생성됐는지 connection URL을 출력해보면 확인하실 수 있을것 같습니다.
그리고 ddl-auto 관련된 질문에서는 우선 가정하고 계신, "jpa의 ddl-auto 값을 create-drop으로 설정했기 때문에 gradle test를 실행할 때 예상되는 결과는 각 클래스를 테스트할 때마다 테이블이 새로 생성되어야 할 것" 이 문장이 사실인가부터 확인할 필요가 있겠습니다.
0
안녕하세요, 인프런 AI 인턴입니다. 송준희님께서 질문하신 Testcontainers와 JPA의 ddl-auto 설정 관련하여 도움을 드릴 수 있는 기존 답변을 찾아보았습니다.
Testcontainers와 JPA의 DDL-Auto 동작에 관한 이해
테스트 실행 시 각 테스트 클래스마다 JPA의 DDL-Auto 속성이 동작하지 않는 이유:
@SpringBootTest는 기본적으로 애플리케이션 컨텍스트를 재사용합니다. 따라서 여러 테스트에서 동일한 애플리케이션 컨텍스트가 사용된다면, 데이터베이스 초기화가 예상과는 다를 수 있습니다. 이를 분리하려면@DirtiesContext를 사용하여 각 테스트 클래스 후에 컨텍스트를 새로 로드할 수 있으나, 이는 비용이 높을 수 있습니다.
생성된 데이터베이스가 컨테이너들이 공유하는 이유:
- Testcontainers는 기본적으로 동일한 Docker 네트워크 내에서 컨테이너를 실행합니다. 각 테스트에서 고유한 데이터베이스를 사용하려면, 각 테스트 컨테이너 인스턴스가 고유하게 설정되었는지 확인해야 합니다. 예를 들어, 각 인스턴스에 대해 고유한 데이터베이스 이름을 설정하거나 일회용 컨테이너(
withReuse(false)) 사용을 고려해 보세요.
- Testcontainers는 기본적으로 동일한 Docker 네트워크 내에서 컨테이너를 실행합니다. 각 테스트에서 고유한 데이터베이스를 사용하려면, 각 테스트 컨테이너 인스턴스가 고유하게 설정되었는지 확인해야 합니다. 예를 들어, 각 인스턴스에 대해 고유한 데이터베이스 이름을 설정하거나 일회용 컨테이너(
유사한 질문 및 답변
- Testcontainers와 DDL 설정 관련하여 유사한 질문과 답변을 확인해 보실 수 있습니다:
TestContainers에 대한 질문입니다.
- 이 질문에서는 Testcontainers로 데이터베이스 생성 및 초기화 방법에 대해 다루며, DDL 초기화 스크립트 사용 방법도 설명하고 있습니다.
이 질문들이 송준희님께 도움이 될 수 있기를 바랍니다. 각 테스트가 독립적으로 실행되도록 정확한 Testcontainers 설정 방법을 이해하는 것이 중요합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
테스트 반복하기 관련 질문입니다
0
102
1
testcontainers DB 공유 이슈
0
238
2
질문있습니다.
0
334
3
동시성 테스트는 어떻게 작성해야하는지 궁금합니다.
2
1234
0
안녕하세요, 테스트의 displayName 관련 질문이 있습니다!
0
469
0
intellij 테스트 실행시 engine 이 나오게 하는 방법이 궁금합니다.
0
412
0
thenThrow() 안에는 runtime 익셉션만 선언가능한가요?
0
1348
1
안녕하세요 @BeforeAll관련해서 질문이 있습니다.
0
390
1
Test 중단 방법(?)
1
428
1
junit 프로퍼티
1
411
1
강의 섹션별 Git Code
1
365
1
Gradle 프로젝트
0
359
1
강의 문서
0
398
1
if나 case를 통한 분기와 Assumptions의 차이점 문의
1
380
1
Study .setOwnerId( id ) 로 예제를 구성하신 이유가, 특정한 시나리오를 가정하기 때문인가요?
0
319
1
Mock에 Stubbing 중 발생하는 에러
0
3986
1
제 블로그에 공부 내용을 정리해도 될까요?
1
382
1
@Order와 @Order가 없는 순서가 있는 케이스
0
440
1
enum은 또 "이늄"인가요?
-5
1709
2
"assume" 발음이 "어줌"인가요?
-7
1620
4
검색을 해도 해결이 안되어 질문드립니다
0
2210
1
test 환경의 다른 컨테이너(Mock 어플리케이션)
0
378
2
중복 저장
0
299
1
Mapped port can only be obtained after the container is started
1
502
1





