Skip to content

test: enforce the Bun coverage threshold - #800

Merged
owjs3901 merged 1 commit into
mainfrom
fix/bun-coverage-threshold
Oct 21, 2026
Merged

owjs3901 merged 1 commit into
mainfrom
fix/bun-coverage-threshold

Conversation

@owjs3901

Copy link
Copy Markdown
Contributor

Refs #683. main 기준의 독립 PR이며, 먼저 병합되어야 하는 PR은 없습니다.

요약

main의 Bun 커버리지 100% 게이트가 실제로는 동작하지 않았습니다. bunfig.toml의 coverageThreshold가 단수형 키(line, function, statement)로 적혀 있는데, Bun은 모르는 키를 경고 없이 무시합니다. 그래서 bun test는 커버리지와 관계없이 exit 0으로 끝났고, pre-commit hook과 CI의 Bun 단계는 커버리지 때문에 실패한 적이 없습니다. 지금 main은 실제로 함수·줄 모두 100%지만, 앞으로 커버리지가 줄어도 잡지 못하는 상태였습니다.

재현 (Bun 1.4.3)

함수 2개 중 1개만 실행하는 fixture(함수 50%, 줄 66.67%)에서 bun test를 실행했습니다.

coverageThreshold exit
{ line = 1.0, function = 1.0, statement = 1.0 } (main) 0
{ lines = 1.0, functions = 1.0, statements = 1.0 } 1
1.0 1

Bun 문서(https://bun.com/docs/test/code-coverage)도 복수형 키를 씁니다.

변경

  • bunfig.toml: 기준을 { lines = 1.0, functions = 1.0, statements = 1.0 }로 고쳤습니다.
  • bunfig.toml에서 coverage = true를 빼고, 루트 test 스크립트의 Bun 단계를 bun test --coverage로 바꿨습니다. 기준이 실제로 적용되면 coverage = true 상태에서는 파일 하나만 실행하는 bun test <file>도 저장소 전체 기준에 걸려 항상 실패합니다. 예를 들어 bun test packages/__tests__/changepack-paths.test.ts는 17개 테스트가 모두 통과해도 함수 18.13%, 줄 33.49%로 exit 1이 됩니다. 그래서 커버리지는 hook과 CI가 실행하는 bun run test에서만 켭니다.
  • packages/__tests__/coverage-threshold.test.ts에 테스트 5개를 추가했습니다.
    • bunfig.toml의 기준이 복수형 키이고 값이 모두 1인지 확인합니다.
    • 루트 test 스크립트가 실행하는 모든 bun test에 --coverage가 붙어 있는지 확인합니다. 중간에 bun run으로 부르는 스크립트도 따라갑니다.
    • 루트 bunfig.toml의 설정을 그대로(저장소 파일을 가리키는 root, preload만 빼고) 임시 프로젝트에 넣고 bun test --coverage를 실제로 실행합니다. 덮이지 않은 줄이 있으면 exit 1, 덮이지 않은 함수가 있으면 exit 1, 모두 덮이면 exit 0이어야 합니다.

CI workflow는 바꾸지 않았습니다. CI는 그대로 bun run test를 실행하므로 새 스크립트가 적용됩니다. 패키지 동작은 바뀌지 않고, 관리 패키지를 바꾸지 않으므로 changepack은 없습니다.

남는 한계

  • statements는 Bun이 받기만 하고 아직 검사하지 않습니다(Bun 문서에 명시). 실제로 검사되는 것은 줄과 함수입니다.
  • 파일 하나만 실행할 때는 커버리지 표가 나오지 않습니다. 필요하면 bun test --coverage <file>로 볼 수 있으며, 이때 전체 기준에 걸려 실패하는 것은 정상입니다.

다른 PR과의 관계

  • #755와 #752도 bunfig.toml을 바꿉니다. 이 PR이 먼저 병합되면 preload 줄 바로 아래에서 충돌하므로, 두 변경을 모두 유지하면 됩니다.
  • main에서 이 게이트가 꺼져 있었으므로, 열린 PR들의 Bun 100%는 exit code가 아니라 커버리지 표의 All files 행으로 확인하도록 작업자들에게 알렸습니다.

검증 (Windows, Bun 1.4.3, Node 26.12.0, main 770aaac 기준)

  • RED: main 설정(단수형 키, coverage = true, bun test)에서 새 테스트를 실행하면 5개 중 4개가 실패합니다(기준 키, --coverage, 덮이지 않은 줄, 덮이지 않은 함수).
  • GREEN: 이 PR에서 5 pass / 0 fail이며, 1초 안에 끝납니다.
  • 스크립트를 나눠도 잡는지 확인: test가 bun run으로 부르는 스크립트 안의 두 번째 bun test에 --coverage가 없으면 실패하고, 붙이면 통과합니다.
  • pre-commit hook 전체 통과(793초): lint, Rust tarpaulin, Bun 6654 pass / 0 fail, 커버리지 표 All files | 100.00 | 100.00.
  • 변경 파일 eslint 통과.

@codecov

codecov Bot commented Oct 21, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@owjs3901
owjs3901 merged commit 56ccd05 into main Oct 21, 2026
20 of 21 checks passed
@owjs3901
owjs3901 deleted the fix/bun-coverage-threshold branch October 21, 2026 07:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant