Lv1_junior_dev
자라나라실력실력
Lv1_junior_dev
전체 방문자
오늘
어제

주인장 GitHub 바로가기

    • 분류 전체보기 (112)
      • 주절주절 (6)
      • 프로젝트 회고록 (3)
      • 꿀팁 (3)
      • 알고리즘 풀이 (26)
      • 이것 저것 (2)
      • 자바스크립트 - Vanilla JS (25)
      • 자바스크립트 - React.js (37)
      • 자바스크립트 - Next.js (4)
      • 자바스크립트 - TypeScript (5)
      • HTML (0)
      • CSS (1)

    인기 글

    hELLO · Designed By 정상우.
    Lv1_junior_dev

    자라나라실력실력

    변경된 파일에 한해서만 테스트할 수 있도록 해보자 ! (feat.Github Actions, Jest)
    이것 저것

    변경된 파일에 한해서만 테스트할 수 있도록 해보자 ! (feat.Github Actions, Jest)

    2025. 6. 13. 22:33

    ❗️문제 상황

    • 발생한 문제
      • PR 생성 시 마다 Github Action의 CI Action에서 약 160개 테스트와 500개의 테스트 케이스가 매 번 실행되어 완료까지의 과도한 소요 시간이 발생
    • 목표
      • CI Action 시 테스트 시간 단축을 통한 생산성 향상

    시도한 해결 방법들

    ❎ 1차 시도: Jest 내장 옵션 --onlyChanged 활용 (실패)

    npm test --onlyChanged

    결과: PR 환경에서 "No tests found related to files changed since last commit" 에러 발생

     

    에러 원인:

    • --onlyChanged 옵션은 마지막 커밋 이후의 변경사항만 감지
    • PR 환경에서는 모든 변경사항이 이미 커밋되어 있어 Jest가 변경된 파일을 찾지 못함
    • Git working directory에 staged되지 않은 변경사항이 없으면 테스트 대상이 없다고 판단

     

    ❎ 2차 시도: --shard 활용 (실패)

    jest --shard=1/2
    jest --shard=2/2

    결과: 테스트 케이스 간 의존성 문제로 인한 타임아웃 발생

     

    실패 원인:

    • --shard 옵션을 이용해 테스트케이스 병렬 실행 시 테스트 케이스간에 의존성 문제로 인해 테스트가 서로 영향을 주어 타임아웃이 계속 발생
    • 타임아웃 문제를 해결하려면 테스트 케이스 간 의존성 제거 및 실행 순서 조정 등 번거로운 작업이 필요
    • 이러한 번거로움 때문에 --shard 옵션은 패스 !

     

    ✅ 채택한 해결책 (--findRelatedTests, --passWithNoTests 옵션 사용)

    - name: Test Changed Files
      run: |
        BASE_BRANCH="origin/${{ github.event.pull_request.base.ref || 'main' }}"
        CHANGED_FILES=$(git diff $BASE_BRANCH --name-only)
        
        if [ -n "$CHANGED_FILES" ]; then
          echo "📝 변경된 파일 목록:"
          echo "$CHANGED_FILES" | nl -w2 -s'. '
          npm test --silent -- --findRelatedTests $CHANGED_FILES --passWithNoTests
        else
          echo "변경된 파일이 없어 테스트를 진행하지 않습니다."
        fi

    적용 사항

    1. fetch-depth: 0 설정으로 전체 Git 히스토리 확보 (base 브랜치 감지 시 Git 히스토리가 필요함.)
    2. 조건부 실행 적용
      • 변경된 파일이 있을 땐 목록을 출력 후 테스트 진행
      • 변경된 파일이 없을 때 테스트 미진행 멘트 출력 후 테스트 패스
    3. 동적 base 브랜치 감지를 통한 다양한 브랜치 환경 대응

     

    ** 적용 완료 시 결과 이미지


    ✅ 결과

    • 약 160개 테스트와 500개의 테스트 케이스 중 실제 변경된 파일과 관련된 테스트만 실행
    • CI Action 시 빌드 시간 단축 
      • 소규모 기능 개발건 기준 : 약 9분 -> 약 4분으
    • 빠른 피드백으로 개발 생산성 향상

    ** --findRelatedTests, --passWithNoTests 옵션의 안정적인 사용을 위한 Jest 버전 권장사항

    • 최소 요구사항: Jest 22 이상 (--findRelatedTests 기본 지원)
    • 권장 버전: Jest 27.4.7 이상

     

     

    ** 참고 : https://jestjs.io/docs/cli

    '이것 저것' 카테고리의 다른 글

    Figma MCP를 이용해서 사이드 프로젝트 디자인, 퍼블리싱 해보기 (feat. Readdy ai)  (0) 2025.05.19
      '이것 저것' 카테고리의 다른 글
      • Figma MCP를 이용해서 사이드 프로젝트 디자인, 퍼블리싱 해보기 (feat. Readdy ai)
      Lv1_junior_dev
      Lv1_junior_dev
      나는 성장이 고프다. 자라나라 개발 실력 !

      티스토리툴바