본문 바로가기
C.W.K.
Stream
Lesson 13 of 13 · published

병렬 작업

~12 min · parallel, jobs, split

Level 0견습생
0 XP0/101 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

실제 경과 시간이 핵심 지표야

테스트 묶음이 직렬로 30분 걸린다면, 6개의 병렬 작업으로 나누면 실제 경과 시간은 약 5분으로 줄어들어(물론 샤드마다 고정된 체크아웃과 설치 오버헤드는 추가돼). 유료 러너 요금 모델에서는 총 사용 시간은 비슷하게 들지만, 개발자는 30분 대신 5분만 기다리면 되니까.

테스트를 나누는 방법

  • 디렉터리별 — 한 작업에서는 pytest tests/api/를, 다른 작업에서는 pytest tests/db/를 실행해.
  • 마커별pytest -m 'unit'-m 'integration'을 나눠서 돌려.
  • 자동 샤드pytest-xdist --dist=loadgroup -n 4가 단일 러너 안에서 분할하고, 매트릭스와 결합하면 러너 간에도 나눌 수 있어.
  • 시간 버킷별 — 테스트마다 걸리는 시간을 기록해서 비슷한 시간대끼리 묶어. pytest-split이 이 역할을 해.

세팅할 때 주의할 점

  • 각 샤드마다 따로 설치해야 해. 캐시를 적극적으로 활용해.
  • 커버리지 리포트는 샤드 간에 병합해. coverage combine을 써.
  • 불안정한 테스트는 샤딩하면 더 자주 터질 수 있어 — 실패한 샤드만 다시 돌려.

Code

pytest-split으로 샤드 나누기·yaml
  test:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        shard: [1, 2, 3, 4]
    steps:
      - uses: actions/checkout@v4
      - uses: astral-sh/setup-uv@v3
      - run: uv sync --all-extras --dev
      - name: Run shard ${{ matrix.shard }} of 4
        run: uv run pytest --splits 4 --group ${{ matrix.shard }} --cov=src --cov-report=xml:coverage.${{ matrix.shard }}.xml
      - uses: actions/upload-artifact@v4
        with:
          name: coverage-${{ matrix.shard }}
          path: coverage.${{ matrix.shard }}.xml

  coverage:
    needs: test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/download-artifact@v4
        with: { pattern: coverage-*, merge-multiple: true }
      - run: pip install coverage && coverage combine && coverage report

External links

Exercise

테스트 묶음의 직렬 실행 시간을 재봐. 10분이 넘으면 pytest-split으로 4등분해. 실제 경과 시간과 총 사용 시간을 비교해봐. 실제 경과 시간은 약 3.5배 줄어들어야 하고, 총 사용 시간은 샤드별 오버헤드가 추가되니 대략 비슷하게 유지될 거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.