inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

@SpringBootTest 여러 개 사용 시 데이터 남아있는지 여부 문의

288

korn79

작성한 질문수 2

1

안녕하세요.
프로젝트 내에서 통합 테스트를 위해서 @SpringBootTest를 사용한 여러 테스트 코드를 작성하였습니다.

예를 들어 아래와 같이 별개의 2개 테스트 코드에는 각각 school table의 값을 생성 및 조회하는 코드가 들어있습니다.

@SpringBootTest
@Transactional
class aTest {
   // JPA 사용해서 school Table의 data 생성/조회
   
}

---------------------
@SpringBootTest
@Transactional
class bTest {
   // JPA 사용해서 school Table의 data 생성/조회
}

 

위와 같이 테스트 코드를 작성하고 aTest.java 에서 school table에 3개의 데이터를 넣은 경우, bTest.java 에서 school 테이블의 값을 읽었을 때, aTest.java에서 넣은 값은 지워지는 것인지요? 아니면 그대로 남아 bTest.java 에서 조회가 가능한 것인지요?

@Transactional이 들어가 있는 경우 데이터가 rollback 되는 것으로 알고 있어서, bTest.java에서 읽었을 때는 빈 테이블이 있을 것으로 예상했는데, 테스트를 해보면 School table의 id 값(자동 증가하는 값)이 bTest.java에서 처음 읽었을 때 4로 보이는 현상이 있어서 질문을 드립니다.

 

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

답변 2

1

박우빈

안녕하세요, korn79 님!

AI 인턴이 저보다 먼저 답을 잘 해주었네요. ㅎㅎ
데이터는 롤백되는 것이 맞지만, DB 레벨에서 제공하는 ID의 자동증가 값은 트랜잭션 롤백과 무관하게 계속 증가됩니다.
따라서 이런 테스트를 작성할 때에는, ID의 값이 얼마다(ex. id가 1이다)라고 검증하기 보다는 그 외 비즈니스 키(해당 객체를 식별할 수 있는 키)로 내가 조회한 데이터가 예상한 데이터가 맞는지 검증하는 것이 좋습니다.

도움이 되셨기를 바랍니다.
감사합니다. 🙂

0

korn79

딥변 감사합니다.

1

인프런 AI 인턴

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

@Transactional 어노테이션을 사용하면, 테스트가 종료된 후에 데이터 변경 사항을 롤백시키는 것으로 알려져 있습니다. 그런데, 여러분이 질문하신 현상은 자동 증가하는 id 값이 연속적으로 증가하는 것과 관련이 있습니다.

질문하신 내용에 따르면, @SpringBootTest를 사용하여 별도의 테스트 클래스에서 테스트를 진행할 때 @Transactional 어노테이션이 각 테스트의 데이터 변경 사항을 롤백시킵니다. 하지만, 테스트 간에 데이터베이스의 자동 증가 필드(예: AUTO_INCREMENT in MySQL, SERIAL in PostgreSQL) 값은 초기화되지 않습니다. 이는 데이터베이스의 자동 증가 카운터가 트랜잭션 롤백의 영향을 받지 않기 때문입니다.

따라서, aTest.java에서 school 테이블에 데이터를 삽입 후 테스트가 롤백되어도, bTest.java에서 처음 데이터를 삽입할 때의 id 값은 aTest.java에서의 마지막 id 값 이후가 됩니다. 이는 각 테스트 진행 후 데이터는 사라지지만, id 카운터는 리셋되지 않아서 발생하는 현상입니다.

테스트 환경에서 id 값의 연속성이 중요하지 않다면 이 현상은 일반적으로 큰 문제가 되지 않습니다. 하지만 테스트에서 id 값에 의존하는 특정 로직이 있을 경우, 테스트가 서로에게 영향을 주지 않도록 각 테스트 메서드나 클래스에서 필요한 초기화 코드를 명시적으로 작성해야 할 수도 있습니다.

이러한 상황을 제어하고 싶다면, @DirtiesContext 어노테이션을 사용하여 스프링 컨텍스트를 각 테스트 후에 재설정할 수 있습니다. 하지만 이 방법은 매우 비용이 많이 들기 때문에 신중하게 사용하는 것이 좋습니다.

private 상수 테스트 관련 질문

0

83

1

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

0

126

2

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

0

161

2

테스트 문서화 질문입니다

0

105

2

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

0

96

2

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

0

103

2

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

0

89

2

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

0

135

2

OrderCreateRequest DTO에 대해서 궁금한점

0

102

2

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

0

156

2

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

0

139

3

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

1

124

2

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

0

134

2

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

0

228

2

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

0

150

2

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

0

184

2

test 용 .yml

0

90

2

throws Exception

0

80

2

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

0

89

2

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

0

174

2

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

0

138

1

tearDown 순서

0

116

2

@Builder 생성자 private

0

136

2

@DisplayName gradle / intellJ

0

93

2