test flakiness

TL;DR: **테스트 플레이키니스(test flakiness)**는 코드·테스트·환경을 바꾸지 않았는데도 같은 테스트가 어떤 땐 통과, 어떤 땐 실패하는 비결정적 현상이에요. CI 신뢰를 깎고, 배포 속도를 느리게 합니다. (Google Testing Blog)

개념 한 줄 정의

동일 조건에서 통과/실패가 오락가락하는 테스트. 구글은 전체 테스트 실행의 약 1.5%가 플레이키라고 보고했어요. (Google Testing Blog)

왜 생기나(대표 원인)

  • 비동기/레이스 조건, 시간·타임존 의존, 랜덤 시드 고정 안 함, 순서 의존(테스트 간 상태 공유), 네트워크·외부 서비스 의존, 인프라/환경 불안정. 대규모 사례 연구에서도 비동기 호출이 주원인으로 자주 지목됩니다. (Google Testing Blog)

빠른 탐지법(실용)

  • 다회 반복 실행으로 재현율 측정: 같은 테스트를 N회 돌려 flake rate = 실패 횟수/N 혹은 flip(통과↔실패) 발생 여부를 기록. (Semaphore)
  • pytest:
    • 전용 플러그인: pip install pytest-flakefinderpytest --flake-finder --flake-runs=20 (PyPI)
    • 재시도 플러그인: pip install pytest-rerunfailurespytest --reruns 3 --reruns-delay 1 (완화용) (PyPI)
  • Jest: 테스트 내부에서 jest.retryTimes(3)로 재시도(확인·완화)하거나, 스크립트로 N회 반복 실행하여 불안정을 포착. Jest 30부터 재시도 옵션이 강화됐습니다. (archive.jestjs.io)

줄이는 법(가이드)

  • 비동기 안정화: 임의의 sleep 대신 명시적 신호/조건 대기로 전환.
  • 결정성 보장: 랜덤 시드 고정, 가짜 시간(freezegun류) 사용, 네트워크/파일 I/O 목킹.
  • 격리: 테스트 간 공유 상태 제거, 순서 의존성 없애기, 독립 데이터 픽스처.
  • 환경 고정: 컨테이너/샌드박스, 동일 타임존·로케일, 리소스 제한 동일화.
  • CI 정책: 플레이키로 판정된 테스트는 일시 격리(quarantine) + 이슈화하고, 재시도는 임시 완화로만 사용(신호 왜곡 주의). (Google Testing Blog)

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다