빠른 흐름
javascript
import { test, describe, it, mock } from "node:test";
import assert from "node:assert/strict";
describe("formatPrice", () => {
it("정수 금액을 천 단위로 포맷한다", () => {
assert.strictEqual(formatPrice(1000), "1,000원");
});
});
test("비동기 함수도 검증한다", async () => {
const result = await fetchUser(1);
assert.deepStrictEqual(result, { id: 1, name: "Alice" });
});테스트 흐름
먼저 눈에 들어와야 하는 기본형은 아래입니다.
- 단일 테스트:
test(name, fn) - 그룹 묶기:
describe()/it() - 비동기 테스트:
asynctest 함수 - 엄격 비교:
node:assert/strict - 간단한 의존성 대체:
mock.fn()
"내장 기본값으로 충분한가"를 먼저 판단한다
Node 프로젝트라고 해서 처음부터 Jest/Vitest가 꼭 필요한 건 아닙니다. 작은 유틸, CLI, 서버 도구는 node:test만으로도 꽤 잘 굴러갑니다.
node:assert/strict가 사실상 기본이다
테스트 러너보다 더 중요한 기본값은 strict assert입니다. 느슨한 비교를 허용하면 타입 문제를 놓치기 쉽습니다.
비동기 테스트는 그냥 Promise를 반환하면 된다
done 스타일보다 async 함수나 Promise 반환 쪽이 기본 감각에 가깝습니다.
내장 러너를 가볍게 유지하고 싶다면 이 흐름이 가장 단순합니다.
mock.fn()은 경계 격리용으로 충분히 쓸 만하다
알림 전송, 저장소 호출, 외부 API 래퍼처럼 함수 경계를 검증할 때는 별도 mocking 프레임워크 없이도 꽤 깔끔하게 갈 수 있습니다.
러너 기능보다 테스트 경계 설계가 더 중요하다
node:test가 충분한지 아닌지는 matcher 수보다도, 브라우저 DOM 가상화나 복잡한 snapshot 생태계가 필요한지에 더 가깝습니다.
작은 Node 도구나 서버 유틸이면 내장 러너가 오히려 유지가 쉽습니다.
언제 내장 러너로 충분한가
체크포인트
- 단일 테스트:
test() - 관련 테스트 묶기:
describe()/it() - 엄격 비교:
node:assert/strict - 비동기 기본값:
asynctest 함수 - 의존성 대체:
mock.fn() - 실행:
node --test
주의할 점
내장 러너를 쓰면서 느슨한 assert를 쓰면 테스트 신뢰도가 바로 떨어진다. 기본값은 node:assert/strict라고 생각하는 편이 맞다.
참고 링크
2 sources