Data Pipelines에서 자동화된 테스트의 중요한 역할

이 웹 사이트는 귀하가 웹 사이트를 탐색하는 동안 귀하의 경험을 향상시키기 위해 쿠키를 사용합니다. 이 쿠키들 중에서 필요에 따라 분류 된 쿠키는 웹 사이트의 기본적인 기능을 수행하는 데 필수적이므로 브라우저에 저장됩니다. 또한이 웹 사이트의 사용 방식을 분석하고 이해하는 데 도움이되는 제 3 자 쿠키를 사용합니다. 이 쿠키는 귀하의 동의하에 만 브라우저에 저장됩니다. 이러한 쿠키를 거부 할 수도 있습니다. 이러한 쿠키 중 일부를 선택 해제하면 검색 환경에 영향을 미칠 수 있습니다. 이러한 쿠키 중 일부를 선택 해제하면 검색 환경에 영향을 미칠 수 있습니다. 이러한 쿠키 중 일부를 선택 해제하면 검색 환경에 영향을 미칠 수 있습니다.

Spark Pipelines용 테스트 프레임워크 설계

Spark의 강력한 테스트 프레임 워크는 반복 가능한 엔지니어링 분야로 데이터 파이프라인 개발의 예술을 변화시킵니다. 프레임 워크는 모듈, 통합 및 엔드 투 엔드 테스트를 위해 구성 될 수있는 모듈 형, 재사용 가능한 구성 요소로 분리해야합니다. 아래는 필수 빌딩 블록입니다.

Test Data Generation의 개발

이 웹 사이트는 귀하가 웹 사이트를 탐색하는 동안 귀하의 경험을 향상시키기 위해 쿠키를 사용합니다. 이 쿠키들 중에서 필요에 따라 분류 된 쿠키는 웹 사이트의 기본적인 기능을 수행하는 데 필수적이므로 브라우저에 저장됩니다. 또한이 웹 사이트의 사용 방식을 분석하고 이해하는 데 도움이되는 제 3 자 쿠키를 사용합니다. 이 쿠키는 귀하의 동의하에 만 브라우저에 저장됩니다. 이러한 쿠키를 거부 할 수도 있습니다. 이러한 쿠키 중 일부를 선택 해제하면 검색 환경에 영향을 미칠 수 있습니다.

시험 케이스 및 보조

각 시험 케이스는 특정 입력 상태를 정의하고 변환 또는 일련의 변환을 실행하고 출력에 대한 assertions를 적용합니다. 일반적인 assertion 패턴은 다음과 같습니다.

  • Row-level equality: 예상되는 실제 DataFrames의 모든 행을 비교합니다.
  • Schema validation: 출력 스키마가 의도한 유형과 무효 속성에 일치합니다.
  • Aggregate checks: 그룹별 운영 후 계산, 합계 또는 고유값을 검증합니다.
  • 비즈니스 규칙 시행:] 은 (예: 나이 물통, 무너무 깃발) 은 허용 범위 내에서 떨어지는 것을 확인합니다.

clear, self-documenting 문으로 assertions를 작성합니다. ScalaTest 사용 또는 ; PyTest는 pandas-compatible assertions 또는 전용 chisui/assert-spark] 라이브러리와 결합합니다.

실행 환경

Spark test는 클러스터의 오버 헤드를 피하기 위해 로컬 모드에서 실행됩니다. ]를 로 구성하여 단일 JVM 또는 Python 프로세스에서 다중 스레드 실행을 위한 것입니다. 낮은 숫자(예:3)에 평행을 설정하여 테스트 시간을 단축합니다. Scala 프로젝트를 위해 SLT:0]SLT:]를 사용하여 세션을 단축하고, 세션을 단축할 수 있습니다.

검증 및 보고

자동화된 테스트 실행은 로그, 패스/패밀리 수, 오류 세부 정보를 생성합니다. 테스트 보고서를 연속 통합 (CI) 대쉬보드로 통합하여 팀 구성원은 신속하게 구성 요소가 깨어나 왜 파이프라인을 식별할 수 있습니다. Allure 또는 ScalaTest의 내장 XML 보고자는 입력 데이터, 예상된 versus 실제 결과, 실행 기간을 표시하는 풍부한, browsable 보고서를 생성합니다. 이 투명성 분석은 품질 분석 및 품질 분석의 촉진을 가속화합니다.

Practical 구현 전략

다음 접근 방식은 실제 스파크 파이프라인 테스트 시나리오에 프레임 워크 구성 요소를 맵니다.

단위 테스트 Transformations

단일 함수 또는 메소드를 검증하여 DataFrame을 조작합니다. 예를 들어, 타임 스탬프 문자열을 정리하는 함수를 고려하십시오. . Unit Test는 유효성, 변형 및 null 타임스탬프를 가진 작은 DataFrame을 생성하고, 함수를 호출하고, 출력 컬럼이 예상되는 값만 포함된다는 것을 주장합니다. 테스트가 로컬 모드에서 실행되고 프로세스는 몇 줄 만에 완료되기 때문에, 두 번째로 테스트가 테스트하는 경우, 각 테스트 엘리먼트를 테스트하는 경우 테스트가 완료됩니다.

통합 테스트

통합 테스트는 여러 가지 변화가 올바르게 작동한다는 것을 확인합니다. 예를 들어, 파이프라인은 원시 JSON 이벤트, 평평한 배열 구조, 차원 테이블과 함께 가입하고 창 기능을 적용합니다. 통합 테스트는 모든 소스 데이터 (또는 현실적 합성 대용품)을로드하고, 특정 단계로 전체 작업 논리를 실행하고, 그 단계의 출력이 알려진 황금 데이터 세트와 일치합니다. 이것은 일치한 결합 키와 같은 하위 버그를 잡는다, 분할 또는 전술 단계에 걸쳐 변형으로 인해 손실.

End-to-End 파이프라인 테스트

이 테스트는 전체 수명주기를 시뮬레이션합니다. 소스 (예 : Parquet 파일 또는 Kafka 주제), 처리 및 대상 싱크로 작성합니다. 이러한 테스트는 외부 구성 요소에 따라 달라지기 때문에 전용 테스트 환경 또는 컨테이너 설정 (예 : Docker Compose with Spark, MinIO for Object Storage 및 Dark Kafka)에 가장 적합합니다. 예상 데이터 파일에 대한 최종 출력을 검증하거나 최종적으로 측정하여 최종 결과를 읽을 수 있습니다. 최종 테스트는 낮을수록 가장 잘 작동하지만 가장 잘 작동합니다. (예 : 끊어지지 않는 테스트는 없습니다.).

고급 시험 고려 사항

정확함 외에도 현대 데이터 파이프라인은 데이터 품질, 성능 SLA 및 탄력성을 시행해야 합니다. 자동화된 테스트는 이러한 치수를 덮을 수 있습니다.

Data Quality Checks with Deequ의 품질 보증

Deequ은 데이터 품질 제약을 정의하고 검증하는 Spark의 상단에 내장된 라이브러리입니다. Deequ는 테스트 스위트에 체크를 통합하여 완성(비누엘 수), 독특성(반환 키 없음), 규정 준수(예: 범위 내에서 떨어지는 값의 비율)을 확인합니다. 테스트 케이스로 각 제약을 치료합니다. constraint는 해당 데이터의 영향을 받는 후 해당 데이터를 테스트하지 못하지만, 해당 데이터의 품질에 대한 영향을 받지 못하게 합니다.

성능 및 스트레스 테스트

이 테스트는 파이프라인이 예상되는 데이터 볼륨을 시간 내에 처리할 수 있는지 측정합니다. 동일한 로컬 스파크 세션을 사용하지만 일반적인 배치 크기의 여러 테스트 데이터를 스케일링합니다. 각 단계에 대한 실행 지속 시간을 기록하고 기본으로 비교하십시오. 코드 변경이 새로운 shuffle 또는 inefficient Join을 도입하면 테스트는 회귀를 밝혀줍니다. 더 현실적인 성능 프로파일링을 위해 작은 클러스터 (예 : ephemeLTral [Data] [Frop] [Frop] [Frop] [Frop]] [Frop] [Frop] [Frop] [Frop]] [Frop] [Frop] [F]] [F]] [F]] [F]] [F]] [F] [F]] [F]] [F]] [F] [F] [F] [F] [F] [F] [F] [F] [F] [F]]] [F]] [F] [F] [F] [F] [F] [F] [F] [F] [F] [F] [F]]]] [F]]] [F] [F] [F

CI/CD 테스트

Spark Test Suite를 Jenkins, GitLab CI, GitHub Actions와 같은 지속적인 통합 파이프라인에 통합합니다. 파이프라인은 다음과 같습니다.

  • 코드 및 부하 테스트 데이터 정착물을 확인하십시오.
  • 로컬 모드(빠른 피드백)에서 Unit 및 Integration 테스트를 실행합니다.
  • 모든 패스가 선택적으로 일시적인 클러스터에서 end-to-end 또는 performance 테스트를 실행하면 됩니다.
  • 시험 보고서를 게시하고 테스트가 실패하면 빌드를 실패합니다.

이 자동화는 코드가 체크의 건전지를 통과하지 않고 주요 분지를 도달하지 않습니다. 그것은 또한 특정한 커밋에 회귀를 추적하는 데 쉽게 테스트 결과의 역사 기록을 제공합니다.

유지 가능한 Test Suites에 대한 모범 사례

  • Keep 테스트 독립: 각 테스트는 자체 입력 데이터 프레임을 만들고 공유 된 뮤블 상태에 의존하지 않아야 합니다. 크로스 테스트 오염을 방지하기 위해 신선한 불꽃 세션 (또는 재사용 가능하지만 재설정 세션)을 사용합니다.
  • 대표하지만 작은 데이터 사용: 몇 밀리 초에서 실행되는 테스트는 빈번한 실행을 권장합니다. 테스트가 의미있는 결과를 생성하기 위해 큰 데이터를 필요로 하는 경우, 하룻밤 실행하는 더 느린 CI 단계로 분리하십시오.
  • 이름의 테스트는 설명적으로: ] 같은 테스트 이름은 정확히 어떤 행동이 확인되고 예상되는 결과를 정확히 알려줍니다.
  • Refactor test helpers: Extract common pattern (e.g., Spark session을 만들고, 정착물 DataFrame을 로딩) 유틸리티 함수나 트레잇으로 로딩합니다. 이것은 복제를 줄이고, 파이프라인 변경 시 테스트 스위트를 쉽게 만들 수 있습니다.
  • Version control test data:] 디렉토리 아래 저장소에 작은 고정 파일 (예: CSV, Parquet) 저장. 더 큰 데이터셋을 위해, DVC와 같은 데이터 버전 도구를 사용하거나 체크섬과 전용 S3 버킷에 저장하십시오.
  • 부정적인 테스트 포함:) 명확한 메시지와 예외를 제거하거나 적절한 경우 빈 데이터 프레임을 생성하는 파이프라인 핸들을 검증한다.
  • Document test 시나리오: 각 고정 데이터셋 및 테스트하는 사업 규칙의 목적을 설명하는 테스트 디렉토리 내부의 짧은 README를 유지합니다.

관련 기사

Spark 기반 엔지니어링 데이터 파이프라인의 자동화된 테스트 프레임 워크를 구축하는 것은 한 번의 노력이 아니라 데이터 신뢰성에 대한 지속적인 투자가 아닙니다. 신중하게 건설된 테스트 데이터, 잘 정의된 주장, 로컬 실행 환경 및 CI/CD 통합을 결합하여 데이터 엔지니어링 팀은 버그를 초기에 잡을 수 있으며 데이터 품질 사고를 방지하고, 신뢰를 가진 배 파이프라인 변경을 방지합니다. Deequ constraints 및 성능 벤치 마크와 같은 고급 기술을 통합하면 안전망을 강화할 수 있습니다. 결과적으로, 급속한 조직의 가장 중요한 결정이 될 수 있는 개발 주기입니다.