웹개발/Spring

TestContainer를 활용한 테스트 코드 작성하기.

slown 2025. 1. 22. 15:47

목차

1.TestContainer?

2.테스트 컨테이너의 장단점

3.작성 방법

 

1.TestContainer?

테스트컨테이너란 코드로 도커 컨테이너를 제어하여 통합테스트를 도와주는 라이브러리입니다. 로컬에 설치된 도커데몬과 연동되어 테스트코드가 실행되기 전 코드를 통해 해당 테스트를 위한 일회성 컨테이너를 생성하고 테스트 수행 후 컨테이너를 삭제합니다. 테스트컨테이너를 응용하면 테스트 때 뿐만 아니라 런타임 중에도 컨테이너를 생성하고 활용할 수 있습니다.  

2.각 테스트 컨테이너의 장단점

장점

  • 실제 환경과 유사한 테스트 환경 제공
  • 다양한 데이터베이스 및 서비스 제공
  • 테스트가 끝나면 자동으로 컨테이너 정리
  • JUnit 4, JUnit 5 지원

단점

  • 테스트 실행 속도가 느려질 수 있음
    • 컨테이너를 실행하는 데 시간이 소요되므로, 단순한 단위 테스트보다 실행 시간이 길어질 수 있습니다.
  • 리소스 사용량 증가
    • 컨테이너를 실행할 때마다 메모리와 CPU 리소스를 소비하므로, 테스트 환경에서 리소스 제약이 있는 경우 주의가 필요합니다.

3.작성 방법

테스트컨테이너를 스프링부트와 같이 사용을 해보기 위해서는 다음과 같이 진행을 해주시면 됩니다.

 

3-1.라이브러리 의존성 추가.

	testImplementation 'org.springframework.boot:spring-boot-testcontainers'
    testImplementation 'org.testcontainers:testcontainers' // TC 의존성
    testImplementation 'org.testcontainers:junit-jupiter'
    testImplementation 'org.testcontainers:mysql'
    testImplementation 'org.testcontainers:jdbc'

3-2.테스트 리소스 디렉토리에 있는 설정 파일 작성하기. 

application-test.properties

spring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDriver
spring.datasource.username=test
spring.datasource.password=test
spring.datasource.jdbc-url=jdbc:tc:mysql:latest://localhost/container

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=create


application.properties

spring.profiles.active=test

 

3-3. 테스트 코드를 작성

@SpringBootTest
@Testcontainers
@ActiveProfiles("test")
public class BoardRepositoryTest {

    @Container
    @ServiceConnection
    static MySQLContainer<?> container = new MySQLContainer<>("mysql:latest")
            .withDatabaseName("testdb")
            .withUsername("test")
            .withPassword("test");

    @Autowired
    private BoardRepository boardRepository;

    @Test
    void boardCreatTest() {
        Board board = Board
                .builder()
                .title("test title")
                .contents("test contents")
                .author("test author")
                .build();

        boardRepository.save(board);

        List<Board> list = boardRepository.findAll();
        assertThat(board).isNotNull();
        assertThat(list).isNotNull();
    }

    @Test
    void selectBoardTest() {
        Board board = boardRepository.findById(1L).get();
        assertThat(board).isNotNull();
        assertThat(board.getTitle()).isEqualTo("test title");
        assertThat(board.getContents()).isEqualTo("test contents");
        assertThat(board.getAuthor()).isEqualTo("test author");
    }
}