작성
·
162
·
수정됨
답변 2
0
안녕하세요, 해범 님!
말씀하신대로 병렬 테스트를 진행하다보면 같은 DB를 활용하기 때문에 데이터 셋의 오염으로 인한 테스트 실패, 충돌 등이 발생하는데요.
이를 방지하려면 결국 DB 환경도 테스트 환경에 따라 독립적으로 설정해주어야 합니다.
TestContainers를 활용하면 테스트별 독립적인 데이터베이스 환경을 구축하고 테스트를 수행할 수 있습니다.
인수 테스트의 경우도 마찬가지로, TestContainers를 활용해 각 테스트별로 스프링 컨텍스트를 다르게 가져가면 병렬 테스트를 시도해볼 수 있을 것 같아요. (저는 이렇게까지 해보지는 않았는데, 가능하지 않을까 싶네요 ㅎㅎ)
결국은 수행하려는 테스트 성격에 따라 독립적인 환경을 구성해주는 것이 포인트입니다!
도움이 되셨으면 좋겠네요.
감사합니다 🙂
0
안녕하세요, 인프런 AI 인턴입니다.
해범님 질문에 대한 답변입니다.
테스트를 병렬로 실행할 때 DB를 관리하는 방법으로는 몇 가지 옵션이 있습니다.
독립된 테스트 데이터베이스 사용: 각 병렬 테스트가 자신만의 독립된 데이터베이스 인스턴스를 사용하도록 설정할 수 있습니다. 이는 데이터 충돌을 방지하고 각 테스트가 다른 테스트와 독립적으로 실행될 수 있게 합니다.
@AutoConfigureTestDatabase 사용: Spring Boot에서는 @AutoConfigureTestDatabase
어노테이션이 제공되어, 테스트 실행 시 실제 데이터베이스 대신 임베디드 데이터베이스(예: H2)를 사용하도록 설정할 수 있습니다. 이렇게 하면 각 테스트가 독립된 컨텍스트를 갖게 되어 병렬 실행 시에도 데이터베이스 간의 충돌 없이 테스트를 진행할 수 있습니다.
Java 예제:
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
@DataJpaTest
@AutoConfigureTestDatabase(replace = Replace.NONE)
class MyRepositoryTests {
// ...
}
Kotlin 예제:
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class MyRepositoryTests {
// ...
}
인수 테스트(RestAssured)의 경우, 병렬 실행이 가능하지만, 실제 환경의 복잡성과 테스트 간의 데이터 격리가 필요한 경우 병렬 실행에서의 이점 대비 문제가 발생할 수 있습니다. 따라서 병렬 실행보다는 테스트 환경을 분리하거나 순차적으로 실행하는 방식을 선호할 수 있습니다.
병렬 테스트 실행 시 데이터 충돌을 방지하기 위해 독립된 테스트 데이터베이스를 사용하거나 Spring Boot의 테스트 유틸리티를 활용하는 것이 좋습니다.
항상 데이터 격리를 유지하고, 테스트 간에 영향을 주지 않도록 주의하는 것이 중요합니다.
참고 자료:
- Spring Boot Reference Documentation > 7. Core Features > 7.8. Testing > 7.8.3. Testing Spring Boot Applications > Auto-configured Data JPA Tests
- Spring Boot Reference Documentation > 18. “How-to” Guides > 18.16. Testing
해범님의 성공적인 테스트 실행을 응원합니다!