Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

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은 이 단위 테스트의 범위가 아니며 플랫폼 빌드에서 별도로 확인합니다.