작성
·
63
0
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
설정 관련하여 도움을 드릴 수 있는 기존 답변을 찾아보았습니다.
테스트 실행 시 각 테스트 클래스마다 JPA의 DDL-Auto 속성이 동작하지 않는 이유:
@SpringBootTest
는 기본적으로 애플리케이션 컨텍스트를 재사용합니다. 따라서 여러 테스트에서 동일한 애플리케이션 컨텍스트가 사용된다면, 데이터베이스 초기화가 예상과는 다를 수 있습니다. 이를 분리하려면 @DirtiesContext
를 사용하여 각 테스트 클래스 후에 컨텍스트를 새로 로드할 수 있으나, 이는 비용이 높을 수 있습니다.생성된 데이터베이스가 컨테이너들이 공유하는 이유:
withReuse(false)
) 사용을 고려해 보세요.TestContainers에 대한 질문입니다.
- 이 질문에서는 Testcontainers로 데이터베이스 생성 및 초기화 방법에 대해 다루며, DDL 초기화 스크립트 사용 방법도 설명하고 있습니다.
이 질문들이 송준희님께 도움이 될 수 있기를 바랍니다. 각 테스트가 독립적으로 실행되도록 정확한 Testcontainers 설정 방법을 이해하는 것이 중요합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.