작성
·
52
0
junit5, jpa를 이용해서 테스트 코드를 작성하고 testcontainers를 이용해서 테스트를 수행하려고 합니다.
A entity는 n개의 B entity를 가지고 있고, B entity는 C entity를 가지고 있습니다.
A에 관련된 테스트 클래스, B에 관련된 테스트 클래스(A entity 이용), C에 관련된 테스트 클래스(A, B entity 모두 이용)를 클래스별로 각각 테스트를 진행하면 모두 정상적으로 통과합니다.
하지만 gradle test로 전체 클래스에 대해서 테스트를 진행하면 종종 실패합니다.
로그를 확인했는데 C 클래스를 테스트하면서 db에 A, B, C 데이터가 insert됐고 이어서 B 클래스를 테스트할 때 @BeforeAll로 B, A 순서로 데이터를 삭제하는 과정에서 C 데이터가 남아있기 때문에 B 데이터를 삭제할 수 없어 테스트가 실패합니다.
이해하기로는 testcontainers가 각 클래스에서 static으로 선언되면 테스트 시작 시점에 컨테이너가 생성되어 순수한 상태의 db로 테스트를 진행할 수 있고 테스트가 끝나면 컨테이너가 삭제되어 db도 자연스럽게 초기화된다고 생각했는데
실제로는 하나의 db를 여러 개의 container가 공유해서 사용하는 것처럼 보입니다.
컨테이너 생성이 db의 생명주기에 영향을 주나요?
답변 2
0
네 컨테이너가 생성될 때 테스트용 DB도 만들어집니다. 컨테이너를 static으로 만들어 모든 테스트에서 재사용하는 경우 그런 문제가 생길 수 있습니다.
컨테이너를 테스트르 마다 만드는건 테스트 실행 시간에 많은 영향을 줄 수 있으니, 테스트 클래스마다 데이터와 테이블을 초기화 하는 스크립트를 실행하거나, 코드를 넣는게 좋을 것 같습니다.
0
안녕하세요, 인프런 AI 인턴입니다. 송준희님!
테스트 컨테이너(Testcontainers)를 사용하면서 발생하는 DB 공유 이슈에 대해 설명드리겠습니다.
테스트 컨테이너는 일반적으로 컨테이너 시작 시 새로운 데이터베이스 인스턴스를 생성하는 형태로 동작하도록 설계되어 있습니다. 이 때문에 각 테스트 클래스가 자체적으로 컨테이너를 생성할 경우, 고립된 환경을 기대할 수 있습니다.
하지만, 여러 테스트 클래스가 동일한 컨테이너 인스턴스를 공유하게 되는 상황에서는 예상치 못한 데이터 충돌이 발생할 수 있습니다. 이는 각 테스트가 수행되는 순서와 데이터 정리의 문제에서 비롯됩니다. 현재 상황에서는 C 클래스의 테스트가 A, B, C에 대한 데이터를 모두 포함하고 있어, B 클래스의 @BeforeAll 메서드가 의도한 대로 데이터를 삭제하지 못하는 상황이라 할 수 있습니다.
이를 해결하는 몇 가지 방법을 제안드립니다:
개별 컨테이너 사용: 각 테스트 클래스에서 별도의 컨테이너 인스턴스를 사용해 보세요. 이를 위해 테스트 클래스에서 각각의 컨테이너를 인스턴스화하여 사용하면, 데이터베이스의 고립성을 유지할 수 있습니다.
테스트 순서 조정: 테스트가 서로 의존적이라면 실행 순서를 조정하여 문제가 되는 테스트가 먼저 실행되고 나머지 테스트가 그 상태를 참고할 수 있도록 변경해 보세요.
데이터 초기화: 각 테스트 클래스 내의 @BeforeAll 또는 @AfterEach 어노테이션을 활용하여 테스트 데이터의 초기화 및 정리를 철저히 이루어질 수 있도록 하세요. 이는 테스트 환경에서 항상 같은 상태로 시작하고 종료할 수 있게 합니다.
보다 자세한 내용은 다음 게시글을 참조해 보시기 바랍니다:
캡쳐 이미지를 활용한 이해를 돕는 방법은 불가능하나, 문제 해결에 대한 구체적인 설명을 제공해 드렸습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.