Pandas 변환의 CSV 결과 검사
Pandas로 실제 행을 필터하고 출력 핸들에 전달한 DataFrame을 기대 CSV와 비교합니다. 테스트용 핸들은 데이터셋을 쓰지 않으며 실제 계산은 운영 코드와 같은 함수를 사용합니다.
변환 모듈
src/myproject/datasets/find_aircraft_pandas.py:
from transforms.api import Input, Output, transform
def compute_data(output, aircraft):
rows = aircraft.pandas()
selected = rows.loc[
(rows["number_of_seats"] > 300)
& (rows["operating_status"] == "Yes")
]
output.write_table(selected)
compute = transform.using(
output=Output("/Example Project/Outputs/aircraft_pandas"),
aircraft=Input("/Example Project/Inputs/aircraft"),
)(compute_data)
Pandas를 환경에 추가하고 가상 경로를 실제 자산으로 바꿉니다. 300석 자체는 > 조건을 통과하지 않습니다.
테스트
입력과 기대 CSV를 src/test/resources/에 두고 src/test/test_find_aircraft_pandas.py에 다음을 작성합니다.
from pathlib import Path
from unittest.mock import MagicMock
import pandas as pd
from myproject.datasets.find_aircraft_pandas import compute_data
RESOURCES = Path(__file__).parent / "resources"
def test_find_aircraft():
source_frame = pd.read_csv(RESOURCES / "aircraft_mock.csv")
expected = pd.read_csv(RESOURCES / "expected_filtered_aircraft.csv")
aircraft = MagicMock(spec_set=["pandas"])
aircraft.pandas.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 list(actual.columns) == list(expected.columns)
assert len(actual) == len(expected)
pd.testing.assert_frame_equal(
actual.sort_values(list(actual.columns)).reset_index(drop=True),
expected.sort_values(list(expected.columns)).reset_index(drop=True),
check_dtype=False,
)
테스트 입력은 pandas()로 프레임을 반환하는 핸들입니다. Input은 변환을 등록할 때 쓰는 정의이므로, 실행 중 데이터를 반환하는 핸들과 구분합니다. 출력 검사는 write_table()에 전달한 DataFrame을 사용합니다.
내부 dtype을 제외한 값, 열과 행 수를 검사하므로 schema의 구체적인 자료형 계약이 중요하면 해당 검사를 추가로 구성합니다. 플랫폼 권한과 트랜잭션은 단위 테스트의 mock 쓰기로 검증되는 대상이 아닙니다.