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

해범님의 프로필 이미지

작성한 질문수

Practical Testing: 실용적인 테스트 가이드

테스트 간 독립성을 보장하자

병렬 테스트 시 DB처리

24.07.15 07:28 작성

·

119

·

수정됨

0

안녕하세요 강의 정말 잘 듣고 있습니다~!


한가지 궁금한 점이 있는데,
테스트 병렬 실행 시에 db는 어떻게 관리되는지 궁금합니다.

테스트가 많아지면서 병렬로 실행하고 싶은데,
db는 지금 h2 mem db 한군데만 바라보고 있어서

테스트 간 같은 항목에 대한 처리들을 하면 실패로 이어집니다.

어떻게 병렬로 실행할 수 있게 하는지 궁금합니다 ㅎㅎ

그리고 인수테스트(RestAssured)도 진행중인데,
인수테스트는 병렬 실행을 포기하는 편인지도 궁금하네요.. 

답변 2

0

박우빈님의 프로필 이미지
박우빈
지식공유자

2024. 07. 20. 16:38

안녕하세요, 해범 님!

말씀하신대로 병렬 테스트를 진행하다보면 같은 DB를 활용하기 때문에 데이터 셋의 오염으로 인한 테스트 실패, 충돌 등이 발생하는데요.
이를 방지하려면 결국 DB 환경도 테스트 환경에 따라 독립적으로 설정해주어야 합니다.

TestContainers를 활용하면 테스트별 독립적인 데이터베이스 환경을 구축하고 테스트를 수행할 수 있습니다.

인수 테스트의 경우도 마찬가지로, TestContainers를 활용해 각 테스트별로 스프링 컨텍스트를 다르게 가져가면 병렬 테스트를 시도해볼 수 있을 것 같아요. (저는 이렇게까지 해보지는 않았는데, 가능하지 않을까 싶네요 ㅎㅎ)

결국은 수행하려는 테스트 성격에 따라 독립적인 환경을 구성해주는 것이 포인트입니다!

도움이 되셨으면 좋겠네요.
감사합니다 🙂

0

인프런 AI 인턴님의 프로필 이미지

2024. 07. 17. 07:31

안녕하세요, 인프런 AI 인턴입니다.

해범님 질문에 대한 답변입니다.

테스트를 병렬로 실행할 때 DB를 관리하는 방법으로는 몇 가지 옵션이 있습니다.

  1. 독립된 테스트 데이터베이스 사용: 각 병렬 테스트가 자신만의 독립된 데이터베이스 인스턴스를 사용하도록 설정할 수 있습니다. 이는 데이터 충돌을 방지하고 각 테스트가 다른 테스트와 독립적으로 실행될 수 있게 합니다.

  2. @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

해범님의 성공적인 테스트 실행을 응원합니다!

해범님의 프로필 이미지

작성한 질문수

질문하기