[Spring] 스프링 DB 2편 3-2. 테스트 - 데이터베이스 분리

강우엉·2023년 8월 30일

Spring

목록 보기
299/359

로컬에서 사용하는 애플리케이션 서버와 테스트에서 같은 데이터베이스를 사용하고 있으니 테스트에서 문제가 발생한다.
이런 문제를 해결하려면 테스트를 다른 환경과 철저하게 분리해야 한다.

가장 간단한 방법은 테스트 전용 데이터베이스를 별도로 운영하는 것이다.

  • H2 데이터베이스를 용도에 따라 2가지로 구분하면 된다.
    • jdbc:h2:tcp://localhost/~/test local에서 접근하는 서버 전용 데이터베이스
    • jdbc:h2:tcp://localhost/~/testcase test 케이스에서 사용하는 전용 데이터베이스

데이터베이스 파일 생성 방법

  • 데이터베이스 서버를 종료하고 다시 실행한다.
  • 사용자명은 sa 입력
  • JDBC URL에 다음 입력,
  • jdbc:h2:~/testcase (최초 한번)
  • ~/testcase.mv.db 파일 생성 확인
  • 이후부터는 jdbc:h2:tcp://localhost/~/testcase 이렇게 접속

테이블 생성하기
testcase 데이터베이스에도 item 테이블을 생성하자.

sql/schema.sql 파일 참고

drop table if exists item CASCADE;
create table item
(
 id bigint generated by default as identity,
 item_name varchar(10),
 price integer,
 quantity integer,
 primary key (id)
);

main - application.properties
src/main/resources/application.properties

spring.profiles.active=local
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.username=sa

이제 테스트를 실행해보자
findItems() 테스트만 단독으로 실행해보자
처음에는 실행에 성공한다.
그런데 같은 findItems() 테스트를 다시 실행하면 테스트에 실패한다.

  • 테스트를 2번째 실행할 때 실패하는 이유는 testcase 데이터베이스에 접속해서 item 테이블의 데이터를 확인하면 알 수 있다.
  • 처음 테스트를 실행할 때 저장한 데이터가 계속 남아있기 때문에 두번째 테스트에 영향을 준 것이다.
  • 이 문제는 save() 같은 다른 테스트가 먼저 실행되고 나서 findItems() 를 실행할 때도 나타난다. 다른 테스트에서 이미 데이터를 추가했기 때문이다. 결과적으로 테스트 데이터가 오염된 것이다.
  • 이 문제를 해결하려면 각각의 테스트가 끝날 때 마다 해당 테스트에서 추가한 데이터를 삭제해야 한다. 그래야 다른 테스트에 영향을 주지 않는다.

테스트에서 매우 중요한 원칙은 다음과 같다.

  • 테스트는 다른 테스트와 격리해야 한다.
  • 테스트는 반복해서 실행할 수 있어야 한다.
profile
우엉이의 코딩 성장일기💻

0개의 댓글