Docker화된 Spring Boot 애플리케이션 테스트

이 샘플에서는 간단한/hello 끝점이 있는 🍀 Spring Boot 애플리케이션을 만든 다음 🐳 Docker 이미지로 배포합니다.

물론 Docker 이미지가 작동하는지 확인하고 싶으므로 Testcontainers 🤩을 사용하여 테스트합니다.



스포일러 경고! 👇


로저비나스 / 스프링 부트 도커


🐳 도커를 사용한 스프링 부트




준비가 된? 갑시다!

1) Spring Initialzr에서 시작하여 Webflux 및 Kotlin으로 빈 Spring Boot 프로젝트를 생성합니다.



2) 그런 다음 이 간단한 테스트를 추가합니다.




@SpringBootTest(webEnvironment = RANDOM_PORT)
class ApplicationTests {

  @LocalServerPort
  private var port: Int = 0

  @Test
  fun `should say hello`() {
    val responseBody = WebClient.builder()
      .baseUrl("http://localhost:$port").build()
      .get().uri("/hello")
      .exchangeToMono { response ->
        assertThat(response.statusCode()).isEqualTo(HttpStatus.OK)
        response.bodyToMono(String::class.java)
      }.block()
    assertThat(responseBody).isEqualTo("hello!")
  }
}


3) 그리고 우리는 이 간단한 구현을 추가합니다...




@RestController
class HelloController {

    @GetMapping("/hello")
    fun hello() = "hello!"
}


... 그리고 이제 우리의 테스트는 🟩👏입니다.

4) 다음으로 도커 이미지를 생성해야 합니다... 🤔



일부 대안은 Spring Boot with DockerTopical Guide on Docker에 문서화되어 있습니다.

다행히도 Spring Boot's Gradle plugin의 작업bootBuildImage을 사용하는 것만큼 쉽습니다.

./gradlew bootBuildImage


여태까지는 그런대로 잘됐다! 😁

이제 생성된 도커 이미지를 테스트해야 합니다...

5) 먼저 org.unbroken-dome.test-sets를 사용하여 container-test라는 새 테스트 소스 루트를 만듭니다.




plugins {
  id("org.unbroken-dome.test-sets") version "4.0.0"
}

testSets {
    "container-test"()
}

tasks.get("container-test").dependsOn("bootBuildImage")


bootBuildImage 작업은 container-test 작업보다 먼저 실행되므로 현재 소스 코드에서 방금 빌드한 도커 이미지를 항상 테스트하고 있는지 확인합니다.

6) 그런 다음 Testcontainers 및 JUnit5를 사용하여 테스트를 만듭니다.




@Testcontainers
class ApplicationContainerTests {

  companion object {

    private const val appPort = 8080

    @Container
    private val app = KGenericContainer(System.getProperty("docker.image"))
      .withExposedPorts(appPort)
  }

  @Test
  fun `should say hello`() {
    // ...
  }
}


7) 마지막으로 해야 할 일은 테스트를 실행하기 전에 시스템 속성 docker.image의 값을 설정하는 것입니다.




tasks.withType<Test> {
    useJUnitPlatform()
    systemProperty("docker.image", "${project.name}:${project.version}")
}

${project.name}:${project.version}bootBuildImage 작업에서 사용하는 기본값이므로

그게 다야! 즐거운 코딩하세요! 💙

좋은 웹페이지 즐겨찾기