Polars 변환의 실제 출력값 검사
이 예제는 300석을 초과하고 운항 상태가 Yes인 항공기만 출력합니다. 계산은 실제 Polars로 수행하고 플랫폼 입출력 핸들만 test double로 대체합니다.
변환 모듈
src/myproject/datasets/find_aircraft_polars.py에 둡니다. 실제 runtime은 compute_data와 같은 구현을 등록하여 호출합니다.
import polars as pl
from transforms.api import Input, Output, transform
def compute_data(output, aircraft):
rows = aircraft.polars()
selected = rows.filter(
(pl.col("number_of_seats") > 300)
& (pl.col("operating_status") == "Yes")
)
output.write_table(selected)
compute = transform.using(
output=Output("/Example Project/Outputs/aircraft_polars"),
aircraft=Input("/Example Project/Inputs/aircraft"),
)(compute_data)
가상 자산 경로는 실제 프로젝트에 맞춥니다. 계산 함수를 보관한 뒤 동일한 함수를 decorator에 전달하므로 테스트가 decorator의 비공개 내부 속성을 읽을 필요가 없습니다.
CSV 기반 테스트
입력 및 기대 CSV를 src/test/resources/에 두고 다음을 src/test/test_find_aircraft_polars.py에 작성합니다.
from pathlib import Path
from unittest.mock import MagicMock
import polars as pl
from polars.testing import assert_frame_equal
from myproject.datasets.find_aircraft_polars import compute_data
RESOURCES = Path(__file__).parent / "resources"
def test_find_aircraft():
source_frame = pl.read_csv(RESOURCES / "aircraft_mock.csv")
expected = pl.read_csv(RESOURCES / "expected_filtered_aircraft.csv")
aircraft = MagicMock(spec_set=["polars"])
aircraft.polars.return_value = source_frame
output = MagicMock(spec_set=["write_table"])
compute_data(output=output, aircraft=aircraft)
output.write_table.assert_called_once()
actual = output.write_table.call_args.args[0]
assert actual.columns == expected.columns
assert actual.height == expected.height
assert_frame_equal(
actual.sort(actual.columns),
expected.sort(expected.columns),
)
이 테스트는 실제 필터 결과의 열, 행 수와 값을 비교하고 출력 메서드가 한 번 호출되는지도 확인합니다. Mock에 지정하지 않은 메서드를 부르면 실패하므로 실제 쓰기 계약이 write_table과 맞는지 확인할 수 있습니다.
자산 등록, 프로젝트 권한과 실제 commit은 이 단위 테스트의 범위가 아니며 플랫폼 빌드에서 별도로 확인합니다.