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

simple님의 프로필 이미지
simple

작성한 질문수

호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)

전체 테스트시 id 값 증가로 인한 실패

해결된 질문

작성

·

579

2

안녕하세요.

단위테스트 할 때는 문제가 없으나 전체 테스트 할 때

PostControllerTest의 "글 여러개 조회" 테스트 와, "페이지를 0으로 요청하면 첫 페이지를 가져온다." 테스트 에서 에러가 납니다.

Spring Rest Docs 생성에도 지장이 있어, 현재는 임시방편으로

//.andExpect(jsonPath("$[0].id").value(30))

둘 다 이 id 체크를 주석처리해놓고 진행하고 있습니다.

구글링해서 찾아보니

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)

이 방식으로 컨텍스트를 매번 재생성 하는 방법도 있다곤 하지만 이렇게 해도 에러가 나고, 성능이 안좋아진다고 합니다. 이런 문제는 보통 어떤식으로 해결하는지 궁금합니다!

 

추가로 호돌맨님은 강의에서 따로 이 부분이 걸리진 않던데 이유도 궁금하네요,,,

답변 1

1

호돌맨님의 프로필 이미지
호돌맨
지식공유자

안녕하세요. 호돌맨입니다.
질문을 남겨주셔서 감사합니다.

1. JPA의 id값은 테스트하지 않습니다.

JPA id 값은 JPA전략과 DB 전략이 맞물려 알아서 생성될 겁니다. 저희가 크게 신경쓸 부분이 아닙니다. 1이 들어가던 10이 들어가던 고양이가 들어가던 그건 시스템에서 알아서 할 일 입니다.
mysql에서는 기본적으로 auto_increment를 통해 id값이 1부터 순차적으로 증가하여 insert됩니다. 그렇기 때문에 한 개의 테스트는 성공이 될 수 있지만 여러개를 테스트 한다면 이 전에 종료된 테스트의 id + 1로 입력되기 때문에 테스트가 실패 할 수 있습니다.
테스트가 모두 종료되면 테스트 환경에 맞는 database, h2나 mysql db등의 테이블이 리셋(drop)됩니다. 그리고 테스트를 실행하면 테이블이 생성되는 동시에 모든 테이블들의 id값이 1로 초기화 됩니다.

2. 그러면 어떻게 해야하는가

image꼭 필요하다면 given에서 주어진 entity의 id값으로 insert가 잘 되었는지 확인합니다. post.getId()가 내부적으로 어떤 기능을 하는지 모르는 상태로 값 비교를 하기 때문에 완벽하지 않습니다. 예를들어 db에 post.id값이 1로 들어가고, post.getId() 메서드가 무조건 1을 return하여 테스트가 통과 될 수도 있습니다. 그래서 이는 최소한으로 버그가 없는지 확인하는 정도로만 넣어둡니다.

감사합니다.

simple님의 프로필 이미지
simple
질문자

명쾌하게 해결됐습니다. 감사합니다!

simple님의 프로필 이미지
simple

작성한 질문수

질문하기