[java] TestContainers를 사용하여 Spark 애플리케이션 테스트하기

TestContainers는 테스트 환경에서 독립적인 컨테이너를 실행하여 애플리케이션을 테스트할 수 있게 해주는 유용한 도구입니다. 이번 블로그 포스트에서는 TestContainers를 사용하여 Spark 애플리케이션을 테스트하는 방법에 대해 알아보겠습니다.

Spark 애플리케이션 테스트를 위한 TestContainers 설정

처음으로, 프로젝트에 TestContainers를 추가해야 합니다. Maven을 사용하는 경우, pom.xml 파일에 다음 종속성을 추가합니다.

<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>testcontainers</artifactId>
    <version>1.16.0</version>
    <scope>test</scope>
</dependency>

그리고 다음과 같이 Docker 컨테이너를 사용하여 Spark 클러스터를 구동할 수 있는 단위 테스트 클래스를 작성합니다.

import org.apache.spark.sql.*;

import org.junit.*;
import org.testcontainers.containers.GenericContainer;

public class SparkApplicationTest {
    private static SparkSession spark;

    @ClassRule
    public static GenericContainer<?> sparkContainer = new GenericContainer<>("bitnami/spark:3.1.2")
            .withExposedPorts(8080);

    @BeforeClass
    public static void setUp() {
        String sparkUrl = "spark://" + sparkContainer.getContainerIpAddress() + ":" + sparkContainer.getMappedPort(8080);
        spark = SparkSession.builder()
                .appName("SparkApplicationTest")
                .master(sparkUrl)
                .getOrCreate();
    }

    @AfterClass
    public static void tearDown() {
        spark.close();
    }

    @Test
    public void testSparkApplication() {
        // Spark 애플리케이션 테스트 로직 작성
    }
}

SparkApplicationTest 클래스는 GenericContainer를 사용하여 Spark 컨테이너를 구동합니다. @ClassRule 애노테이션을 사용하여 스파크 컨테이너를 테스트 클래스 수준에서 공유하도록 지정합니다. @BeforeClass 메소드에서 Spark 클러스터에 연결하기 위해 SparkSession을 설정하고, @AfterClass 메소드에서 Spark 클러스터를 종료합니다. 마지막으로 @Test 메소드에서 실제로 Spark 애플리케이션을 테스트할 수 있는 로직을 작성합니다.

테스트 실행

이제 테스트를 실행해보겠습니다. 테스트 클래스를 실행하면 TestContainers가 자동으로 Docker 컨테이너를 시작하고 테스트를 수행합니다. 테스트가 완료되면 컨테이너는 자동으로 종료됩니다.

mvn test

혹은 IDE에서 테스트를 실행할 수도 있습니다. IntelliJ IDEA를 사용하는 경우, 테스트 클래스 우클릭 후 “Run ‘SparkApplicationTest’“를 선택하여 테스트를 실행할 수 있습니다.

결론

TestContainers를 사용하여 Spark 애플리케이션을 테스트하는 방법에 대해 배웠습니다. 이를 통해 테스트 환경에서 독립적인 Spark 클러스터를 실행할 수 있으며, 애플리케이션의 정확성을 검증할 수 있습니다. 이 방법을 적용하여 애플리케이션의 품질과 안정성을 높여보세요.

참고 자료