Skip to Content
Nextra 4.0 is released πŸŽ‰

πŸ§ͺ λ‹¨μœ„ ν…ŒμŠ€νŠΈ

⚑ Vitest 기반

이 ν”„λ‘œμ νŠΈλŠ” Vitest λ₯Ό ν…ŒμŠ€νŠΈ λŸ¬λ„ˆλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.

βš™οΈ Vitest μ„€μ •

곡톡 ν…ŒμŠ€νŠΈ 섀정은 configs/vitest-config/configs 디렉토리 λ‚΄ μ—¬λŸ¬ μ„€μ • 파일둜 λΆ„λ¦¬λ˜μ–΄ κ΄€λ¦¬λ©λ‹ˆλ‹€. 각 νŒ¨ν‚€μ§€/앱은 ν•„μš”μ— 따라 μ„€μ • νŒŒμΌμ„ ν™•μž₯ν•˜κ±°λ‚˜ μ‘°ν•©ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • base.ts

    • Vitest의 κ°€μž₯ 기본적인 섀정을 μ •μ˜ν•˜λŠ” νŒŒμΌμž…λ‹ˆλ‹€.
    • ν…ŒμŠ€νŠΈ 컀버리지 리포트 κ΄€λ ¨ μ„€μ • λ“±κ³Ό 같이
    • λͺ¨λ“  νŒ¨ν‚€μ§€/μ•±μ—μ„œ κ³΅ν†΅μ μœΌλ‘œ μ μš©ν•΄μ•Ό ν•˜λŠ” μ˜΅μ…˜μ„ ν¬ν•¨ν•©λ‹ˆλ‹€.
    • λ‹€λ₯Έ ν™˜κ²½λ³„ μ„€μ • 파일(ui.ts, node.ts λ“±)의 기반이 λ©λ‹ˆλ‹€.
  • ui.ts

    • React λ“± UI ν™˜κ²½μ—μ„œμ˜ ν…ŒμŠ€νŠΈμ— νŠΉν™”λœ μ„€μ • νŒŒμΌμž…λ‹ˆλ‹€.
    • UI μ»΄ν¬λ„ŒνŠΈ ν…ŒμŠ€νŠΈ 싀행을 μœ„ν•΄ JSDOM ν™˜κ²½μ„ μ‚¬μš©ν•˜λ„λ‘ μ„€μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
  • node.ts

    • Node.js ν™˜κ²½μ—μ„œμ˜ ν…ŒμŠ€νŠΈμ— νŠΉν™”λœ μ„€μ • νŒŒμΌμž…λ‹ˆλ‹€.
    • Node ν™˜κ²½μ—μ„œ μ‹€ν–‰λ˜λŠ” μœ ν‹Έλ¦¬ν‹°, μ„œλ²„ μ½”λ“œ, CLI λ“±μ—μ„œ μ‚¬μš©ν•˜λ©°
    • ν…ŒμŠ€νŠΈ ν™˜κ²½μ„ Node둜 μ§€μ •ν•˜κ³ , Node κ΄€λ ¨ λͺ¨λ“ˆ/κΈ€λ‘œλ²Œ 객체λ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ μ„€μ •ν•©λ‹ˆλ‹€.

πŸ“Š 톡합 컀버리지

μ—¬λŸ¬ νŒ¨ν‚€μ§€/μ•±μ—μ„œ μƒμ„±λœ 컀버리지 리포트λ₯Ό ν•˜λ‚˜λ‘œ λ³‘ν•©ν•˜κΈ° μœ„ν•΄
ν”„λ‘œμ νŠΈ 루트의 package.jsonκ³Ό configs/vitest-config/configs νŒ¨ν‚€μ§€μ— κ΄€λ ¨ λͺ…령어와 μŠ€ν¬λ¦½νŠΈκ°€ μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

  • collect-json-reports

    • λͺ…λ Ήμ–΄: node dist/scripts/collect-json-outputs.js
    • 각 νŒ¨ν‚€μ§€/μ•±μ—μ„œ μƒμ„±λœ κ°œλ³„ 컀버리지 JSON νŒŒμΌμ„ coverage/raw λ””λ ‰ν† λ¦¬λ‘œ μˆ˜μ§‘ν•©λ‹ˆλ‹€.
    • μ‹€μ œ μˆ˜μ§‘ λ‘œμ§μ€ configs/vitest-config/scripts/collect-json-output.ts μŠ€ν¬λ¦½νŠΈμ— κ΅¬ν˜„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
    • 이 μŠ€ν¬λ¦½νŠΈλŠ” glob νŒ¨ν„΄μ„ ν™œμš©ν•΄ μ›Œν¬μŠ€νŽ˜μ΄μŠ€ μ „μ²΄μ—μ„œ 컀버리지 νŒŒμΌμ„ μ°Ύμ•„ ν•œ 곳에 λͺ¨μλ‹ˆλ‹€.
  • merge-json-reports

    • λͺ…λ Ήμ–΄: nyc merge coverage/raw coverage/merged/merged-coverage.json
    • μˆ˜μ§‘λœ 컀버리지 JSON νŒŒμΌλ“€μ„ λ³‘ν•©ν•˜μ—¬ coverage/merged/merged-coverage.json 파일둜 λ§Œλ“­λ‹ˆλ‹€.
  • report

    • λͺ…λ Ήμ–΄: nyc report -t coverage/merged --report-dir coverage/report --reporter=html --exclude-after-remap false
    • λ³‘ν•©λœ 컀버리지 κ²°κ³Όλ₯Ό λ°”νƒ•μœΌλ‘œ HTML 컀버리지 리포트λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
  • view-report

    • λͺ…λ Ήμ–΄: open coverage/report/index.html
    • μƒμ„±λœ HTML 컀버리지 리포트λ₯Ό λΈŒλΌμš°μ €λ‘œ λ°”λ‘œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸŒ€ turbo ν™œμš©

이 ν”„λ‘œμ νŠΈλŠ” λ³€κ²½λœ λΆ€λΆ„λ§Œ λΉ λ₯΄κ²Œ ν…ŒμŠ€νŠΈν•˜κ³ , λΆˆν•„μš”ν•œ 쀑볡 싀행을 μ€„μ΄κ³ μž Turbo λ₯Ό ν™œμš©ν•˜μ—¬ ν…ŒμŠ€νŠΈ μž‘μ—…μ„ λΉ λ₯΄κ³  효율적으둜 μ‹€ν–‰ν•©λ‹ˆλ‹€.

πŸ§ͺ test νƒœμŠ€ν¬

turbo.json의 test taskλŠ” λ‹€μŒκ³Ό 같이 κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€:

  • μ˜μ‘΄μ„±: 각 νŒ¨ν‚€μ§€μ˜ μƒμœ„ νŒ¨ν‚€μ§€(^test)와 @repo/vitest-config#build μž‘μ—…μ΄ λ¨Όμ € μ‹€ν–‰λ©λ‹ˆλ‹€.
  • outputs: μ•„λž˜ νŒŒμΌλ“€μ΄ ν…ŒμŠ€νŠΈ μ‹€ν–‰ 결과둜 μƒμ„±λ˜μ–΄ μΊμ‹œ 및 κ³΅μœ λ©λ‹ˆλ‹€.
    • coverage.json,
    • apps/*/coverage.json,
    • packages/*/coverage.json,
    • configs/*/coverage.json,
    • shared/*/coverage.json,
    • tools/*/coverage.json
  • μΊμ‹œ μ „λž΅: TurboλŠ” outputs에 λͺ…μ‹œλœ 파일이 λ³€κ²½λ˜μ§€ μ•ŠμœΌλ©΄ 이전 ν…ŒμŠ€νŠΈ κ²°κ³Όλ₯Ό μž¬μ‚¬μš©ν•˜μ—¬ μ‹€ν–‰ 속도λ₯Ό λ†’μž…λ‹ˆλ‹€.
  • 병렬 μ‹€ν–‰: TurboλŠ” μ˜μ‘΄μ„± κ·Έλž˜ν”„λ₯Ό λΆ„μ„ν•˜μ—¬ κ°€λŠ₯ν•œ ν…ŒμŠ€νŠΈλ₯Ό λ³‘λ ¬λ‘œ μ‹€ν–‰ν•©λ‹ˆλ‹€.

πŸ“Š merge-json-reports νƒœμŠ€ν¬

configs/vitest-config/turbo.jsonμ—λŠ” λ‹€μŒκ³Ό 같은 컀버리지 리포트 톡합을 μžλ™ν™”ν•˜λŠ” νŒŒμ΄ν”„λΌμΈμ΄ μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€:

  1. collect-json-reports
  • 각 νŒ¨ν‚€μ§€μ˜ 컀버리지 κ²°κ³Όλ₯Ό ν•œ κ³³(coverage/raw/)에 λͺ¨μλ‹ˆλ‹€.
  1. merge-json-reports
  • μˆ˜μ§‘λœ 컀버리지 νŒŒμΌμ„ λ³‘ν•©ν•˜μ—¬ 톡합 컀버리지 JSON을 μƒμ„±ν•©λ‹ˆλ‹€.
  1. report
  • λ³‘ν•©λœ 결과둜 HTML 컀버리지 리포트λ₯Ό λ§Œλ“­λ‹ˆλ‹€.
  1. view-report
  • 리포트λ₯Ό λΈŒλΌμš°μ €λ‘œ μ—½λ‹ˆλ‹€.

이 과정을 톡해 λͺ¨λ…Έλ ˆν¬ μ „μ²΄μ˜ ν…ŒμŠ€νŠΈ 컀버리지λ₯Ό μ†μ‰½κ²Œ ν†΅ν•©Β·μ‹œκ°ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ–₯️ 둜컬 ν™˜κ²½μ—μ„œμ˜ λ‹¨μœ„ ν…ŒμŠ€νŠΈ

pnpm λͺ…λ Ήμ–΄

이 ν”„λ‘œμ νŠΈμ˜ λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” pnpm을 μ‚¬μš©ν•˜μ—¬ 둜컬 ν™˜κ²½μ—μ„œ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό 톡해 λͺ¨λ“  νŒ¨ν‚€μ§€/μ•±μ˜ λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

# 1회 μ‹€ν–‰ pnpm run test # watch λͺ¨λ“œλ‘œ μ‹€ν–‰ν•˜λ €λ©΄ pnpm run test:watch # λ§ˆμ§€λ§‰μ— μž‘μ„±λœ 톡합 컀버리지 리포트λ₯Ό μ›Ή λΈŒλΌμš°μ €λ‘œ μ—΄λ €λ©΄ pnpm run view-report

πŸ€– GitHub Actions μ—μ„œμ˜ λ‹¨μœ„ ν…ŒμŠ€νŠΈ

이 ν”„λ‘œμ νŠΈμ˜ λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” GitHub Actions의 unit-test μž‘μ—μ„œ μžλ™μœΌλ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€.

μ›Œν¬ν”Œλ‘œμš° κ°œμš”

이 μ›Œν¬ν”Œλ‘œμš°λŠ” λ‹€μŒκ³Ό 같은 μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€:

  • πŸ“₯ μ˜μ‘΄μ„± μ„€μΉ˜: pnpm을 μ‚¬μš©ν•˜μ—¬ λͺ¨λ“  μ›Œν¬μŠ€νŽ˜μ΄μŠ€μ˜ μ˜μ‘΄μ„±μ„ μ„€μΉ˜ν•©λ‹ˆλ‹€.
  • πŸ’Ύ μΊμ‹œ ν™œμš©: Turbo, node_modules, dist, 컀버리지 λ“± λ‹€μ–‘ν•œ μΊμ‹œλ₯Ό 적극적으둜 ν™œμš©ν•˜μ—¬ ν…ŒμŠ€νŠΈ 속도λ₯Ό λ†’μž…λ‹ˆλ‹€.
  • πŸ—οΈ ν”„λ‘œμ νŠΈ λΉŒλ“œ: 전체 ν”„λ‘œμ νŠΈλ₯Ό λΉŒλ“œν•˜κ³ , λΉŒλ“œ 둜그λ₯Ό μš”μ•½ 파일둜 μ €μž₯ν•©λ‹ˆλ‹€.
  • πŸ§ͺ λ‹¨μœ„ ν…ŒμŠ€νŠΈ μ‹€ν–‰: λͺ¨λ“  νŒ¨ν‚€μ§€/μ•±μ˜ λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•˜κ³ , ν…ŒμŠ€νŠΈ 둜그λ₯Ό μš”μ•½ 파일둜 μ €μž₯ν•©λ‹ˆλ‹€.
  • πŸ“Š 컀버리지 리포트 생성: μ—¬λŸ¬ νŒ¨ν‚€μ§€μ˜ 컀버리지 κ²°κ³Όλ₯Ό λ³‘ν•©ν•˜μ—¬ 톡합 컀버리지 리포트λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
  • ⬆️ μ•„ν‹°νŒ©νŠΈ μ—…λ‘œλ“œ: 컀버리지 리포트, λΉŒλ“œ/ν…ŒμŠ€νŠΈ μš”μ•½ 둜그 λ“± μ£Όμš” 결과물을 GitHub Actions μ•„ν‹°νŒ©νŠΈλ‘œ μ—…λ‘œλ“œν•©λ‹ˆλ‹€.

μ£Όμš” 단계

각 λ‹¨κ³„λŠ” λ‹€μŒκ³Ό 같은 μˆœμ„œλ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€:

  1. πŸ’Ύ Turbo/μ˜μ‘΄μ„±/λΉŒλ“œ/ν…ŒμŠ€νŠΈ/컀버리지 μΊμ‹œ 볡원
  2. πŸ“₯ μ˜μ‘΄μ„± μ„€μΉ˜ pnpm install --frozen-lockfile
  3. πŸ— ν”„λ‘œμ νŠΈ λΉŒλ“œ pnpm run build
  4. πŸ§ͺ λ‹¨μœ„ ν…ŒμŠ€νŠΈ μ‹€ν–‰ pnpm run test
  5. πŸ“Š 컀버리지 리포트 병합 pnpm run merge-json-reports
  6. ⬆️ μ•„ν‹°νŒ©νŠΈ μ—…λ‘œλ“œ
    • 컀버리지 리포트: configs/vitest-config/coverage/merged
    • λΉŒλ“œ/ν…ŒμŠ€νŠΈ μš”μ•½ 둜그

πŸ“Œ μ°Έκ³ 

  • turbo 섀정은 turbo.json νŒŒμΌμ„ μ°Έκ³ ν•˜μ„Έμš”.
  • 상세 μ›Œν¬ν”Œλ‘œμš°λŠ” .github/workflows/test.yml 파일의 unit-test job을 μ°Έκ³ ν•˜μ„Έμš”.
  • ν…ŒμŠ€νŠΈ κ²°κ³Όλ¬Ό(컀버리지, 둜그 λ“±)은 GitHub Actions의 β€œArtifactsβ€μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

Last updated on