테스트
modernGraphTool은 Vitest와 Playwright 브라우저 모드를 사용합니다. 스펙 파일은 대상 코드 옆에
*.spec.ts 이름으로 함께 둡니다.
테스트 실행하기
섹션 제목: “테스트 실행하기”| 명령어 | 설명 |
|---|---|
npm run test | 전체 스위트 — client와 server 두 프로젝트 모두 |
npm run test:coverage | 전체 스위트 + v8 커버리지 리포트를 coverage/에 생성 |
npm run test:smoke | 빌드된 dist/를 브라우저에서 부팅 (먼저 build 필요) |
두 개의 프로젝트
섹션 제목: “두 개의 프로젝트”파일 이름이 어느 프로젝트에서 실행될지 결정합니다.
*.svelte.spec.ts→client프로젝트. Playwright를 통해 실제 Chromium에서 실행- 그 외 전부 →
server프로젝트. node에서 실행
대부분의 스펙은 스토어와 서비스를 직접 다룹니다. 컴포넌트 스펙은 vitest-browser-svelte의
render()로 마운트하고 vitest/browser의 page.getBy*로 조회합니다.
커버리지
섹션 제목: “커버리지”설정은 vite.config.ts의 test.coverage 아래에 있으며, 그중 두 항목이 핵심입니다.
src전체를 포괄하는include글로브가 있어야 어떤 테스트도 불러오지 않는 파일이 집계에 포함됩니다. 이것이 없으면 테스트되지 않은 모듈이 0%로 표시되는 대신 분모에서 아예 사라집니다. eqcaps bridge로 대체되기 전device-peq/에 있던 약 25개의 기기 핸들러·커넥터 모듈 때문에 보고되는 수치가 그렇게 약 10포인트 낙관적으로 나왔습니다. (Vitest 4에서 기존coverage.all플래그가 제거되었습니다. 이제include가 그 역할을 하며,all을 넘기면 타입 오류입니다.)exclude는 Paraglide 산출물을 제외합니다.src/lib/paraglide/는 Paraglide Vite 플러그인이 생성하며 gitignore 대상입니다. 이를 집계에 넣으면 기계가 작성한 구문 약 3800개 — 전체의 3분의 1 — 가 더해져, 사람이 작성한 소스의 실제 수치보다 한참 낮은 값이 나옵니다.src/lib/types/**(타입 전용)와src/routes/**(부팅 테스트가 커버하는 셸)도 “의미 있게 측정할 수 없다”는 같은 이유로 제외됩니다.
스모크 테스트
섹션 제목: “스모크 테스트”npm run build && npm run test:smoke유닛 스위트는 컴포넌트를 소스 기준으로 마운트하므로, 빌드 산출물을 불러오는 일이 전혀 없습니다.
adapter-static 설정 오류, Vite 플러그인이 복사하지 않게 된 defaults/ 파일, 애셋 URL 회귀, 번들 이후
해석에 실패하는 워커 — 이 모두는 전체 스위트가 초록인 채로 빈 페이지를 배포하게 만듭니다.
scripts/smoke-dist.js는 dist/를 실제 HTTP로 서빙하고(.htaccess가 제공하는 SPA 폴백 포함),
Playwright chromium에서 부팅한 뒤 콘솔 오류, 처리되지 않은 예외, 4xx 응답, 그려지지 않는 그래프,
곡선이 하나도 나타나지 않는 ?share= 링크에 대해 실패합니다.
확장할 때 유념할 두 가지입니다.
- 200 응답이 파일의 존재를 증명하지는 않습니다. SPA 폴백은 디스크에 없는 요청에
index.html로 응답하며, 실제 Apache 호스트에서도 마찬가지입니다. 그래서 애셋 검사는 상태 코드를 믿는 대신 본문을 HTML 셸과 비교합니다. - 빌드 산출물이 필요하므로
npm run build이후buildCI 잡에서 실행됩니다.
지속적 통합
섹션 제목: “지속적 통합”.github/workflows/ci.yml은 모든 PR과 main으로의 모든 푸시에서 실행됩니다. ubuntu-latest와
windows-latest 양쪽에서 lint → check → test를 돌리고, Linux에서 앱·CDN 배포본·문서 사이트를
빌드합니다.
Windows 레그는 중복이 아닙니다. Git for Windows는 시스템 설정에서 core.autocrlf=true를 켜기
때문에, .gitattributes로 모든 텍스트 파일을 eol=lf로 고정하기 전에는 같은 커밋이 macOS에서는
Prettier 기준으로 깨끗하고 Windows에서는 더럽게 나왔습니다. Working tree must be clean 단계가
이 문제의 재발을 막습니다. 체크아웃과 설치만 했는데 무언가 수정된 상태로 남거나 CRLF가 인덱스에
들어가면 실패합니다.
npm run lint는 0으로 종료해야 합니다. ESLint _경고_는 빌드를 실패시키지 않습니다. 규칙 재정의는 eslint.config.js에 있으며 각각 이유를 주석으로
달아 두었습니다. 특히 no-useless-assignment는 $bindable() prop 기본값을 잘못 읽기 때문에
*.svelte에서 꺼져 있고, no-explicit-any는 설정 마이그레이션 도구가 운영자가 작성한 임의의 설정을
파싱하기 때문에 docs/ 아래에서 꺼져 있습니다.