DataJpaTest 세팅

spring boot 에서 Repository의 기능을 테스트 할 수 있다.
Repository 관련 빈만 등록하여 테스트를 진행한다.
DB에 데이터가 잘 저장이 되는지 조회는 잘 되는지 등을 확인 할 수 있다.

TestContainer

실제 DB 와의 연결을 통해 DB에 값을 넣고 조회하고 등의 테스트를 수행하게 된다.
Test DB에 붙어서 테스트를 진행하게되면 개발 중간의 데이터에 대해 오동작 할 수 있다.
commit을 하지 않고 테스트 종료후 롤백을 하기도 하지만 확실한 테스트가 되지 않는 것 같다.

테스트 할 때만 DB를 띄웠다가 테스트가 끝나면 DB를 없애면 테스트가 깔끔할 것 같다.
그래서 TestContainer 에서 테스트 할 동안 관련 DB를 컨테이너로 띄웠다가 종료하면 삭제해준다.

서버에 Docker 가 기본으로 설치가 되어 있어야한다.

메이븐 설정

유닛 테스트를 위해 의존성을 추가한다.

<!-- spring boot test (exclude junit4)-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
  <exclusions>
    <exclusion>
      <groupId>org.junit.vintage</groupId>
      <artifactId>junit-vintage-engine</artifactId>
    </exclusion>
  </exclusions>
</dependency>

spring boot starter test를 의존성에 추가한다.
junit 5를 사용할 예정이며 junit 4를 제외하기위해 junit-vintage-engine을 제외한다.

testcontainers를 위해 의존성을 추가한다.

<!-- using container for unit test-->
<dependency>
  <groupId>org.testcontainers</groupId>
  <artifactId>junit-jupiter</artifactId>
  <scope>test</scope>
</dependency>

<!-- postgresql container for test -->
<dependency>
  <groupId>org.testcontainers</groupId>
  <artifactId>postgresql</artifactId>
  <scope>test</scope>
</dependency>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.testcontainers</groupId>
      <artifactId>testcontainers-bom</artifactId>
      <version>1.17.6</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

testcontainers 에서 postgresql의 의존성을 주입했다.
사용하는 data store 에 맞는 의존성을 주입하면 된다.

Testcontainers 설정

src 의 main 이 아닌 test 디렉토리의 resources 디렉토리 하위에 application.yml 파일을 생성한다.

spring:
  datasource:
    driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver
    url: jdbc:tc:postgresql:///test-database
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    database: postgresql

driver-class-name 과 url 을 샘플과 같이 작성하여 컨테이너로 생성되는 DB에 연결되도록 한다.

Sample Code

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Rollback(false)
@Testcontainers
public class BoardRepositoryTest {

    @Autowired
    BoardRepository boardRepository;

    @Test
    @DisplayName("Board 생성 테스트")
    void insertBoard(){
        Board board = new Board();
        board.setTitle("hi");
        board.setContent("It's first content");
        board.setUserName("Hitec");
        
        Board savedBoard = boardRepository.save(board);
        Board queryBoard = boardRepository.findById(savedBoard.getId()).orElseThrow();

        Assert.assertEquals(queryBoard.getTitle(), board.getTitle());
    }

}

@DataJpaTest 로 repository 테스트 파일임을 설정한다.
AutoConfigureTestDatabase.Replace.NONE 으로 설정함으로써 내부적으로 embeded db로 테스트 하지 않고 실제 DB로 테스트 하도록 설정한다.
새로 생성된 컨테이너에서의 테스트임으로 롤백을 할 필요는 없음으로 Rollback 은 false로 설정한다.

mvn test

mvn package 를 통해 컴파일, 테스트, 패키징까지 할 수 있다
mvn test를 통해 테스트만 수행할 수 있다.
테스트 수행 중 새로 container가 뜨고 테스트가 진행되는 것을 확인할 수 있다.

  • 개발환경이나 테스트 환경이 컨테이너이거나 다른 환경에서 테스트 컨테이너 DB가 실행되게 될 때 컨테이너와 연결이 잘 안될 경우가 있다.
  • 이런경우 환경변수 TESTCONTAINERS_HOST_OVERRIDE 값에 docker 의 IP를 설정하면 연결이 된다.
    export TESTCONTAINERS_HOST_OVERRIDE=<host IP>
    

    TestContainers

    자세한 사항은 다음 참조 TestContainers


Page last modified: Mar 29 2023 at 12:00 PM.