본문으로 건너뛰기
개발 머꼬
개발 노트Node.js
hohyeon.dev25

테스트 프레임워크를 추가하지 않고 node:test로 끝낸 이유

  • #Engineering Note
  • #Node.js
  • #Testing

문제 발생

DB 통합 테스트를 붙이려는데 러너 선택부터 막혔습니다. 프레임워크를 하나 더 넣으면 설정 파일, 트랜스파일 설정, 그 도구의 버전 정책까지 따라옵니다. 이 저장소의 원칙(의존성은 근거와 함께 추가한다)과 부딪혔습니다.

원인 분석

Node에 이미 러너가 있습니다. 문서 설명대로 node:test는 내장 테스트 러너 모듈이고 node --test로 실행합니다. 파일 탐색 규칙도 정해져 있습니다 — **/*.test.{js,mjs,cjs}, **/*-test.*, **/*_test.*, **/test-*.*, **/test.*, **/test/**/* 입니다. TypeScript 파일도 타입 스트리핑으로 그대로 실행됩니다.

작성 방식은 세 가지를 모두 지원합니다 — 동기(던지면 실패), 프로미스(거부되면 실패), 콜백(truthy 오류를 받으면 실패). describe/itsuite/test의 별칭이고 하위 테스트도 만들 수 있습니다.

실행 플래그 중 둘이 실전에서 중요합니다.

  • --test-concurrency=<n> — 병렬로 돌릴 테스트 프로세스 수
  • --test-force-exit — 이벤트 루프가 살아 있어도 테스트가 끝나면 프로세스를 종료

해결 방안

  1. 평범하게 작성합니다. 별도 설정 파일이 없습니다.
import assert from "node:assert/strict";
import test from "node:test";

test("좋아요 중복은 복합 PK가 거부한다", async () => {
  await likePost(postId, userId);
  await likePost(postId, userId);
  assert.equal(await countLikes(postId), 1);
});
  1. 공유 자원을 쓰면 순차 실행으로 고정합니다. 같은 로컬 DB를 쓰는 파일들이 병렬로 돌면 서로의 데이터와 autoincrement id를 사이에 끼워 넣습니다 — --test-concurrency=1이 그 답입니다.

  2. 커넥션 풀이 프로세스를 붙잡으면 --test-force-exit을 씁니다. 테스트는 끝났는데 종료되지 않는 증상의 원인이 대개 이것입니다.

  3. 탐색 규칙에 걸리는 이름을 헬퍼에 쓰지 않습니다. test-*.ts로 만든 픽스처 파일이 테스트로 오인됩니다 — fixtures.ts처럼 짓습니다.

  4. 경로 인자를 주지 않습니다. 디렉터리를 넘기면 해석 방식이 달라 실패하는 경우가 있습니다 — 기본 탐색에 맡깁니다.

  5. 부족해지면 그때 바꿉니다. 스냅샷·브라우저 환경·정교한 목이 실제로 필요해지면 프레임워크 도입을 재검토합니다 — 지금 필요 없는 도구를 미리 들이지 않는 것이 핵심입니다.

공식 문서

마지막 수정

좋아요북마크

댓글0

아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.