밖엔비가와요
24
2020-06-30 16:31:03
3
501

Repository Test시 ID 자동 증가


안녕하세요 테스트코드를 작성한지 얼마 안된 초보 개발자입니다.


토이 프로젝트 진행 중 Repository Test시 Test용으로 만든 데이터는

정상적으로 롤백되서 table에 저장되지 않는데

'Auto increment'로 지정한 ID 값은 증가되어 이를 어떻게 하는 것이 좋을지 여쭤봅니다.




## 상황 설명


현재 JpaRepository를 상속받은 Repository를 Junit으로 Test 하기 위해 아래와 같이 만들어서 테스트를 진행하였습니다.


@ExtendWith(SpringExtension.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class WordRepositoryTest {
...

@Test
    void findByUserId() {
        //given
        Word word = new Word();
        word.setLevel(1);
        word.setWord("test");
        word.setMeaning("확인");
        word.setNextDate(LocalDate.now());
        word.setUser(user);

        wordRepository.save(word);

        //when
        List<Word> list = wordRepository.findByUserId(USER_ID);

        //than
        assertThat(list).extracting("word", String.class)
                .contains("test");
        assertThat(list).extracting("meaning", String.class)
                .contains("확인");
    }

...

}


실제 구축한 mariadb에 접근해서 테스트를 진행하였는데

위에서 처럼 테스트용으로 save한 data는 test후 정상적으로 롤백이 되서 table에 저장되지 않았지만

'Auto increment'로 설정한 ID 값은 증가하여 이후 테스트가 끝난 후

실제로 서비스를 이용 할 때 데이터가 증가된 ID 값부터 저장됩니다.


예를 들면 아래 테이블 처럼


ID
단어

날짜
100
A
확인
오늘
110
B
확인
오늘


ID가 100 일 때 테스트를 10번 진행한 후 실제 서비스에서 save하면

테스트에서 10번 save한 만큼 ID가 증가되서 ID가 110으로 저장이 됩니다.




## 결론


1. Test를 진행할 때 저렇게 ID값이 증가되는 것이 상관이 없을까요?

2. 상관이 있다면 어떻게 하는 것이 좋을까요?

2-1. H2같은 내장 데이터베이스를 사용해서 Test 할 때만 사용해야하나요?

3. 실제 Junit등을 사용해서 테스트하는 현장에서는 어떻게 하고 있나요?





시간 내서 긴 글 읽어주셔서 감사합니다.

좋은 하루 보내세요.

0
  • 답변 3

  • rebwon
    433
    2020-06-30 17:06:12 작성 2020-06-30 17:09:17 수정됨

    테스트 환경은 로컬 환경 프로덕션 환경과 분리되어야 합니다. 

    보통은 테스트 환경으로 h2를 사용합니다.

    단, 실제 프로덕션 환경과 유사하게 테스트 환경을 만들고 싶다면 테스트 환경에서도 프로덕션 디비를 만들어서 사용합니다.

    Id값 증가같은 경우는 @AutoconfigureTestDatabase를 사용하셔서 로컬 환경에 영향이 발생하는 겁니다.

  • kiel
    55
    2020-06-30 17:17:53

    테스트의 목표가 Repository method 의 단위 테스트라면 실제 DB에 테스트 하시는것 보다는 Embeded DB인 H2 로 테스트 하시는 걸 권해 드립니다.


    그리고 assert문은 아래와 같이 바꾸셔도 될것 같습니다.

    assertThat(list)
        .contains(word);


  • 밖엔비가와요
    24
    2020-06-30 17:31:22 작성 2020-06-30 17:31:34 수정됨

    두분 모두 답변 감사드립니다. ^ ^ Test 환경에서 H2 DB를 적용하는 방법을 알아봐야겠네요.

  • 로그인을 하시면 답변을 등록할 수 있습니다.