> Hello World !!!

     

@syaku

도커로 테스트 환경 구성하기 - Docker, Test Containers

애자일 하려면 우리가 개발한 서비스는 언제든지 로컬 PC에서 테스팅되어야 한다.

테스트를 위해 여러 서버 프로그램을 로컬 PC 에 구성하기란 간단한 일이 아니다. 관리도 복잡하고 인프라 자원을 공유하기도 쉽지 않다. 또한 회사 자원을 사용하려면 방화벽이란 벽이 있다. 이런 이슈는 최초 개발부터 고려되지 않으면 점점 테스팅 구현이 어려워지고 복잡해진다.

그래서 테스트시 필요한 인프라 자원를 쉽게 구성하여 사용하는 방법에 대해 가이드를 하였다.

인프라 자원을 사용하기 위해 Docker 를 사용하고 테스트시 효과적으로 Docker Container 를 관리할 수 있는 Test Containers 오픈 소스 라이브러리를 사용했다.

결론부터 말하면 운영 환경이 도커가 아니라면 Test Containers 를 사용하는 것은 추천하지 않는 다. 인텔리J 에 도커를 연동하여 사용하는 것을 추천한다. 맨 아래에 관련 내용을 정리하였다.

Test Containers (Docker) for Spring

이슈

  • 단위 테스트를 위한 선언적인 설정만 지원한다. 보일러플레이트 코드가 발생한다.
  • Junit 4 (Runner) 를 의존한다.

필수 사항

  • Docker
  • Gradle 5.0 or later
  • Spring Boot 2.4.x or later
  • Junit 5
  • test-containers 라이브러이에서 Junit 4 의존하므로 필요함

기본

implementation platform("org.testcontainers:testcontainers-bom:1.16.0")
testImplementation "org.testcontainers:junit-jupiter"

// 도커 이미지
testImplementation "org.testcontainers:mariadb"
  • testImplementation.exclude group: "junit", module: "junit"
    • junit 4 를 의존하므로 제외를 하면 안된다.

도커 이미지 설정

@Testcontainers
public class MariadbContainerIntegration {
    @Container
    static MariaDBContainer<?> mariadb = new MariaDBContainer<>("mariadb")
        .withDatabaseName("ipom_account_stage")
        .withUsername("ipom_stage")
        .withPassword("1234")
        .withUrlParam("useUnicode", "yes")
        .withUrlParam("characterEncoding", "UTF-8");

    @DynamicPropertySource
    static void mariadbProperties(DynamicPropertyRegistry registry) {
        registry.add("spring.database.driver-class-name", () -> "org.mariadb.jdbc.Driver");
        registry.add("spring.database.url", () -> "jdbc:mariadb://localhost:3306/ipom_account_stage?useUnicode=yes&characterEncoding=UTF-8");
        registry.add("spring.database.username", mariadb::getUsername);
        registry.add("spring.database.password", mariadb::getPassword);
        registry.add("spring.jpa.database", Database.MYSQL::name);
        registry.add("spring.jpa.database-platform", () -> "org.hibernate.dialect.MariaDB103Dialect");
    }
}

@DynamicPropertySource 을 이용하여 설정된 spring properties 를 강제로 변경한다.

테스트 작성

@ExtendWith(SpringExtension.class)
@SpringBootTest
class MariadbContainerTest extends MariadbContainerIntegration {
    @Autowired
    private DataSource dataSource;

    @Test
    void test() {

    }
}

결과

운영 환경이 도커를 필수적으로 사용한다면 Test Containers 사용을 추천한다.
그렇지 않다면 도커가 없는 상황도 고려해야하며 만약 로컬 PC로 테스트할 경우 도커를 필요에 따라 구동해야 한다.

차라리 Test Containers 를 사용하지 말고 로컬 PC에서 Docker를 직접 구동하여 사용하는 편이 효율적이고 설정도 일관되게 유지할 수 이점이 있다.

참고 링크