inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

병렬 테스트 시 DB처리

357

해범

작성한 질문수 5

0

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


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

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

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

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

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

spring tdd jpa mockito 소프트웨어-테스트 junit5

답변 2

0

박우빈

안녕하세요, 해범 님!

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

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

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

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

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

0

인프런 AI 인턴

안녕하세요, 인프런 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

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

private 상수 테스트 관련 질문

0

87

1

void는 어떻게 테스트하나요..? void로 애초에 코딩하면 안되나요??

0

128

2

커버리지는 어떻게 활용하시는지 궁금합니다.

0

163

2

테스트 문서화 질문입니다

0

107

2

단위테스트 질문이 있습니다

0

96

2

컨트롤러는 모킹을 한 이유가 궁금합니다.

0

106

2

ERD 가장자리에 있는 도메인 테스트 질문

0

90

2

DTO 검증 필드에 대한 테스트 코드 작성은 어디까지?

0

136

2

OrderCreateRequest DTO에 대해서 궁금한점

0

104

2

고전파의 테스트 대역 사용 대상, 공유 의존성

0

157

2

계층 관련 질문이 있습니다.

0

140

3

'코틀린'에서는 빌더를 따로 쓰지 않는데, 이 때는 어떻게 test fixture를 만드시는지 궁금합니다

1

124

2

혹시 update 로직은 어떻게 테스트하나요? (@Setter?)

0

135

2

단위테스트와 통합테스트의 경계가 궁금합니다.

0

235

2

Service+Repository 통합테스트 관련 질문입니다.

0

151

2

OrderControllerDocsTest 작성 해봤는데요. 날짜 형식이 이상하게 나와요

0

186

2

test 용 .yml

0

91

2

throws Exception

0

81

2

카페키오스크 클래스 문의 ,,

0

90

2

Rest docs 문서용 테스트코드를 따로 작성해야 되나요?

0

176

2

테스트 코드에서 필요한 생성자

0

139

1

tearDown 순서

0

116

2

@Builder 생성자 private

0

137

2

@DisplayName gradle / intellJ

0

94

2