인프런 커뮤니티 질문&답변

송준희님의 프로필 이미지

작성한 질문수

더 자바, 애플리케이션을 테스트하는 다양한 방법

Testcontainers ddl-auto 동작 시점

작성

·

46

0

spring boot, jpa, junit5, testcontainers를 이용해서 테스트 코드를 작성하고 있습니다.

총 12개의 테스트 클래스를 만들었고 각 클래스마다 testcontainers 객체를 static으로 가지고 있고 모두 @SpringBootTest, @Testcontainers 어노테이션만 추가했습니다.(Controller 테스트 시 @AutoConfigureMockMvc 어노테이션 추가)

jpa의 ddl-auto 값을 create-drop으로 설정했기 때문에 gradle test를 실행할 때 예상되는 결과는 각 클래스를 테스트할 때마다 테이블이 새로 생성되어야 할 것 같은데 실제로는 총 2번 생성됩니다.

각 클래스마다 Testcontainers를 적용했음에도 불구하고 실패한 로그를 보면 이전 클래스에서 사용한 데이터를 다음 클래스에서도 사용하는 것처럼 보이는데

 

  1. 테스트 실행 시 각 테스트 클래스마다 jpa의 ddl-auto 속성이 동작하지 않는 이유

  2. 각 클래스에 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 동작에 관한 이해

  1. 테스트 실행 시 각 테스트 클래스마다 JPA의 DDL-Auto 속성이 동작하지 않는 이유:

    • @SpringBootTest는 기본적으로 애플리케이션 컨텍스트를 재사용합니다. 따라서 여러 테스트에서 동일한 애플리케이션 컨텍스트가 사용된다면, 데이터베이스 초기화가 예상과는 다를 수 있습니다. 이를 분리하려면 @DirtiesContext를 사용하여 각 테스트 클래스 후에 컨텍스트를 새로 로드할 수 있으나, 이는 비용이 높을 수 있습니다.
  2. 생성된 데이터베이스가 컨테이너들이 공유하는 이유:

    • Testcontainers는 기본적으로 동일한 Docker 네트워크 내에서 컨테이너를 실행합니다. 각 테스트에서 고유한 데이터베이스를 사용하려면, 각 테스트 컨테이너 인스턴스가 고유하게 설정되었는지 확인해야 합니다. 예를 들어, 각 인스턴스에 대해 고유한 데이터베이스 이름을 설정하거나 일회용 컨테이너(withReuse(false)) 사용을 고려해 보세요.

유사한 질문 및 답변

  • Testcontainers와 DDL 설정 관련하여 유사한 질문과 답변을 확인해 보실 수 있습니다:

TestContainers에 대한 질문입니다.
- 이 질문에서는 Testcontainers로 데이터베이스 생성 및 초기화 방법에 대해 다루며, DDL 초기화 스크립트 사용 방법도 설명하고 있습니다.

이 질문들이 송준희님께 도움이 될 수 있기를 바랍니다. 각 테스트가 독립적으로 실행되도록 정확한 Testcontainers 설정 방법을 이해하는 것이 중요합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.