Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Java 변환의 단위 테스트

Java transforms는 CI checks에서 배치 파이프라인의 단위 테스트를 실행합니다. 이 테스트 환경은 스트리밍 파이프라인을 지원하지 않으며, Code Repositories의 대화형 테스트나 Java 디버깅도 제공하지 않습니다. 대화형 디버깅이 필요하면 Python 변환을 검토합니다.

Java 하위 프로젝트에 com.palantir.transforms.lang.java-defaults 플러그인을 적용하면 테스트 환경과 JUnit, Mockito, AssertJ 의존성을 구성합니다. 테스트 파일은 해당 하위 프로젝트의 src/test/java 아래에 둡니다. 사용하는 Gradle 템플릿의 테스트 의존성 구성을 유지합니다.

JUnit 5 extension

SparkSessionExtension은 관리되는 SparkSession을 제공합니다. 다음 파일은 src/test/java/myproject/SparkExtensionTest.java의 예입니다. 외부 데이터셋 대신 Spark가 생성한 0~9 값을 필터하여 실제 결과를 검사합니다.

package myproject;

import static org.junit.jupiter.api.Assertions.assertEquals;

import com.palantir.transforms.lang.java.testing.api.SparkSessionExtension;
import org.apache.spark.sql.SparkSession;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

public final class SparkExtensionTest {
    @RegisterExtension
    public static final SparkSessionExtension SPARK = new SparkSessionExtension();

    @Test
    public void keepsOnlyValuesBelowTwo() {
        SparkSession session = SPARK.get();
        long rows = session.range(0, 10).filter("id < 2").count();
        assertEquals(2L, rows);
    }
}

Extension의 get()으로 받은 session을 테스트의 실제 변환 입력 생성과 결과 확인에 사용할 수 있습니다.

기존 JUnit 4 ClassRule

JUnit 4 경로는 deprecated 상태지만 기존 테스트에서 사용할 수 있습니다. ClassRule은 클래스의 여러 테스트가 같은 SparkSession을 공유하여 초기화 비용을 줄입니다. 이전 테스트의 classpath를 이어받을 수 있으므로 테스트 사이의 격리 요구를 고려해야 합니다.

파일 src/test/java/myproject/SharedSparkTest.java:

package myproject;

import static org.junit.Assert.assertEquals;

import com.palantir.transforms.lang.java.testing.api.SparkSessionResource;
import org.junit.ClassRule;
import org.junit.Test;

public final class SharedSparkTest {
    @ClassRule
    public static final SparkSessionResource SPARK = new SparkSessionResource();

    @Test
    public void keepsOnlyValuesBelowTwo() {
        assertEquals(2L, SPARK.get().range(0, 10).filter("id < 2").count());
    }
}

테스트별 JUnit 4 Rule

각 테스트마다 새 SparkSession을 만들려면 인스턴스 Rule을 사용합니다. @Rule 필드는 public이어야 하며 static이면 안 됩니다.

파일 src/test/java/myproject/IsolatedSparkTest.java:

package myproject;

import static org.junit.Assert.assertEquals;

import com.palantir.transforms.lang.java.testing.api.SparkSessionResource;
import org.junit.Rule;
import org.junit.Test;

public final class IsolatedSparkTest {
    @Rule
    public final SparkSessionResource spark = new SparkSessionResource();

    @Test
    public void keepsOnlyValuesBelowTwo() {
        assertEquals(2L, spark.get().range(0, 10).filter("id < 2").count());
    }
}

테스트가 많으면 session을 반복 생성하는 비용이 커집니다. 격리가 꼭 필요한 경우가 아니라면 ClassRule 또는 JUnit 5 extension을 우선 사용하는 것이 권장됩니다.

테스트 변경을 commit하면 저장소 CI의 결과에서 상태를 확인할 수 있습니다. 이 단위 테스트와 실제 Foundry 입출력, 프로젝트 권한을 포함한 운영 빌드는 다른 범위의 검사입니다.