[test] - 테스트 환경을 따로 만들어 사용해보자

yeom yaloo·2023년 8월 12일
0

백엔드 관련 지식

목록 보기
3/7
post-thumbnail

[적용 이유]

  1. 데이터 무결성 위험: 실제 데이터베이스에 테스트용 데이터를 추가하거나 수정하는 작업을 진행하면 실제 데이터의 무결성이 위협받을 수 있습니다. 실수로 데이터를 삭제하거나 변경하여 실제 서비스에 영향을 줄 수 있습니다.

  2. 데이터 손실: 테스트를 위해 실제 데이터를 사용하다 보면, 테스트 작업 중에 데이터가 삭제되거나 수정되어 데이터 손실이 발생할 수 있습니다.

  3. 테스트 결과 불일치: 실제 데이터베이스에서 실행한 테스트는 실제 환경과 유사한 결과를 얻을 수 있지만, 테스트 도중 실제 데이터베이스의 상태가 변하면 예상치 못한 결과가 발생할 수 있습니다.

  4. 의존성 문제: 실제 데이터베이스에 의존하는 테스트는 환경에 의존성을 가지기 때문에 테스트를 다른 환경으로 이전하기 어려울 수 있습니다.

  5. 테스트 속도: 실제 데이터베이스를 사용한 테스트는 데이터베이스에 대한 I/O가 발생하므로 테스트 속도가 느려질 수 있습니다.

  6. 테스트 제어 어려움: 실제 데이터베이스를 사용한 테스트는 테스트 데이터의 상태에 따라 결과가 바뀔 수 있어 테스트 제어가 어려울 수 있습니다.

이런 저런 이슈가 유닛 테스트를 진행하면서 발생하게 되어서 늦게나마 로컬 테스트 환경을 따로 만들어 진행하기로 했다.

[적용 방법]

1. 라이브러리 추가

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>test</scope>
</dependency>
  • h2를 테스트 환경에서 사용할 수 있게 설치하고, 해당 라이브러리를 추가해준다.
  • brew를 사용해서 다운받은 경우 해당 경로를 찾아야 하는 번거로움이 있으니까 그냥 zip 파일을 받아서 원하는 경로에 설치해주자
  • scope을 test로 설정해서 테스트 컴파일 시점에만 작동할 수 있게 설정 해준다.

2. properties/yml 파일에 설정

2-1. 경로

  • /src/test/resources/application.yml
  • /src/test/resources/application-local-test.yml

[application.yml]

spring:
  profiles:
    active: local-test

[application-local-test.yml]

spring:
  datasource:
    url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
    driver-class-name: org.h2.Driver
    username: sa
    password:
  h2:
    console:
      enabled: true

  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true
    database-platform: h2
  • 한 번에 설정이 가능하지만 그냥 환경 별로 나누고 싶어서 작업을 진행
  • jpa.hibernate.ddl-auto: create는 사실 추천하지 않는 방법이지만 지금은 테스트를 빠르게 진행하고 다시 기능을 구현해야해서 사용 (비추비추비추!!!)

3. @ActiveProfile


import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.transaction.annotation.Transactional;


@SpringBootTest
@Transactional
@ActiveProfiles("local-test")
class QuerydslProductRepositoryTest {
    @PersistenceContext
    private EntityManager entityManager;

    @Autowired
    private QuerydslProductRepository querydslProductRepository;
    
    
                               ....
}
  • @ActiveProfiles에 해당하는 profile 이름을 넣어주면 해당 작업을 이용해서 테스트 작업을 진행할 수 있다.
profile
즐겁고 괴로운 개발😎

1개의 댓글

comment-user-thumbnail
2023년 8월 12일

정리가 잘 된 글이네요. 도움이 됐습니다.

답글 달기