Skip to content

Latest commit

 

History

History
121 lines (88 loc) · 4.9 KB

testing.md

File metadata and controls

121 lines (88 loc) · 4.9 KB

테스트 정책

KAC GW 회귀

tests/test_kac_gateway.py는 실제 XML 파서를 거쳐 페이지 축소·메타데이터 누락·변경, 중간 빈 페이지, 중복 항공편, 두 방향 합산 예산, 403 무재시도와 입력 검증을 확인한다. 기본 실행은 외부 요청을 하지 않는다. 승인 거부의 skip을 live 성공으로 보고하지 않는다. GitHub CI는 Python 3.11/3.12/3.13 오프라인 회귀·커버리지와 Ruff/mypy를 실행한다. 기존 CI workflow가 없어 이번 GW PR에 추가했으며 운영 키를 주입하지 않는다.

tests/test_kac_codeshare.py는 공개 김포 첫 페이지 100행을 XML로 재생해 공동운항 개별 편명·문자열 ID·원본·KST를 검증한다. 방향별 중복, 페이지 겹침, 모순된 공동운항과 생성 시각 차이도 다룬다. fixture는 100행 부분 집합이며 실제 하루 전체 수용과 분리한다. 요청 공항과 다른 노선/역방향의 공동운항 4반례는 거부하고 기존 단일 행 정책은 보존한다. 실제 수용의 공항/날짜·호출 제한·결과는 GW 계약에 기록한다.

Debug UI fixture replay

디버그 UI에서 저장한 JSON fixture는 tests/fixtures/{function}/{case}.json에 둡니다. tests/test_generated_fixtures.py는 이 파일들을 자동으로 읽고, 저장된 response.body를 tests/runners.py의 parser에 다시 넣어 processed와 비교합니다.

기본 실행:

python -m pytest tests/test_generated_fixtures.py

지원 assertion mode:

  • snapshot: processed 전체 비교, exclude_fields 적용
  • schema_only: parser/processor 성공 여부만 확인
  • required_fields: 지정 필드 존재 여부 확인
  • count: 결과 개수 비교

새 fixture 대상 public 함수가 늘어나면 tests/runners.py의 RUNNERS에 parser와 processor를 추가하고, 민감정보는 fixture 저장 전에 <REDACTED>로 마스킹합니다. 상세 포맷은 docs/debug-fixtures.md에 정리합니다.

krairport 테스트는 기본적으로 네트워크 없이 돌아가야 합니다. KAC와 IIAC 모두 일별 트래픽 제한이 있고, 운항/혼잡도 데이터는 시점에 따라 쉽게 달라지므로 fixture 기반 테스트가 기본입니다.

원칙

  • 기본 pytest 실행은 실 API를 호출하지 않습니다.
  • 모든 provider 테스트는 고정 fixture 또는 mock response를 사용합니다.
  • live 테스트는 별도 marker로만 실행합니다.
  • 타입 assertion을 반드시 포함합니다.
  • 현재 기준선은 90 passed, 2 skipped, coverage fail-under 85입니다.

필수 오프라인 테스트

라우팅

  • ICN -> IIAC
  • ICN 이외 공항 -> KAC
  • IIAC 전용 메서드에 비-ICN 공항코드 전달 시 예외

파싱

  • KAC XML items.item이 dict 하나일 때
  • KAC XML items.item이 list일 때
  • IIAC JSON items.item이 dict 하나일 때
  • IIAC JSON items.item이 list일 때
  • 빈 문자열/공백/-가 None으로 정규화되는지
  • 2.02112E+11 같은 IIAC 시간 예시가 파싱되는지

모델 타입

  • Flight.scheduled_at / estimated_at는 aware datetime
  • codeshare는 bool | None
  • ParkingFee 요금 필드는 int | None
  • ArrivalCongestion 인원수 필드는 int | None
  • PassengerForecast 구간 값은 int | None
  • Provider / Direction은 StrEnum이지만 문자열 비교가 가능해야 함
  • public 응답 모델은 Pydantic BaseModel이며 frozen field validation과 model_dump(mode="json")를 검증
  • krairport.Coordinate는 WGS84 decimal degrees, GeoJSON 순서, DMS 파싱을 검증
  • 시설 주소는 str | None으로 반환되고 JSON 직렬화되는지 검증
  • AirportMetadata는 provider/active 필터와 nearest airport 계산을 검증

Live 테스트

pytest -m live_kac
pytest -m live_iiac
pytest --cov=krairport --cov-fail-under=85

환경변수:

  • DATA_GO_KR_SERVICE_KEY
  • .env / .env.local의 DATA_GO_KR_SERVICE_KEY

규칙:

  • 키가 없으면 skip
  • -m live_kac 또는 -m live_iiac로 명시 실행했을 때만 실제 API 호출
  • 라이브 테스트와 KrairportClient.from_env()는 process env를 먼저 보고, 없으면 로컬 .env 값을 사용합니다.
  • 응답 shape와 타입만 검증
  • 특정 편명, 주차대수, 혼잡도 수치를 고정값으로 단정하지 않음

fixture 작성 규칙

  • KAC는 실제 XML 응답 구조를 유지합니다.
  • IIAC는 실제 JSON 응답 구조를 유지합니다.
  • 숫자형 문자열은 fixture 안에서는 원본 문자열 상태를 유지하고, 테스트가 변환 코드를 지나가도록 합니다.
  • 서비스키는 반드시 [REDACTED] 처리합니다.

권장 marker

  • live_kac
  • live_iiac
  • integration

회귀 테스트 우선순위

버그를 고칠 때는 항상:

  1. 재현 fixture 추가
  2. 실패하는 테스트 작성
  3. 구현 수정
  4. README / 명세 / troubleshooting 반영