JAVASCRIPT · 심층 가이드
JavaScript 테스트 완전 정리
테이블 기반 테스트와 경계값, 시계 목 객체, 비동기 테스트까지 15편을 통해 무엇을 어디까지 검증해야 하는지 스스로 판단하는 기준을 세웁니다.
테스트를 어렵게 만드는 것은 단언문이 아니라 숨은 의존성입니다. JavaScript는 모듈 최상단에서 Date.now()를 읽거나 전역 fetch를 직접 부르기가 너무 쉬워서, 코드가 자기도 모르게 시계와 네트워크에 묶입니다. 테스트 가능한 설계란 대단한 아키텍처가 아니라 그런 값을 인자로 받게 만드는 작은 습관에 가깝습니다. 이 묶음의 목 객체 예제들도 결국 그 습관을 코드로 보여 줍니다.
동등성 단언에서 시작해 테이블 기반 테스트로 넘어가면 케이스가 늘어도 코드가 늘지 않습니다. 경계값 테스트와 매개변수화 테스트는 그 테이블을 채우는 방법이고, 시계 목 객체와 저장소 목 객체는 외부 의존을 끊어 내는 두 축입니다. 비동기 테스트와 예외 테스트는 비동기 편에서 만든 코드를 검증할 때 바로 필요해집니다.
비동기 테스트에서 가장 흔한 함정은 조용히 통과하는 테스트입니다. await을 빠뜨리면 프라미스가 완료되기 전에 테스트 함수가 끝나 버려서 실패한 단언이 무시되고 초록불이 뜹니다. 예외를 검증할 때 expect(fn()).rejects 대신 이미 호출해 버린 값을 넘기는 실수도 같은 계열입니다. 그리고 가짜 타이머를 켠 테스트는 반드시 원상복구해야 합니다. 되돌리지 않으면 그 다음 테스트가 영문 모를 이유로 멈춥니다.
01동등성 단언
JavaScript에서 동등성 단언 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
JavaScript code
// 동등성 단언
if (1 + 1 <= 1) throw new Error("assert failed");성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
02테이블 기반 테스트
JavaScript에서 테이블 기반 테스트 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
JavaScript code
// 테이블 기반 테스트
const cases = [{ input: 2, expected: 4 }, { input: 3, expected: 9 }];
for (const testCase of cases) console.log(testCase.input * testCase.input === testCase.expected);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
03경계값 테스트
JavaScript에서 경계값 테스트 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
JavaScript code
// 경계값 테스트
async function testAsync() {
const value = await Promise.resolve(3);
console.log(value === 3);
}
testAsync();성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
04시계 목 객체
JavaScript에서 시계 목 객체 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
JavaScript code
// 시계 목 객체
const start = performance.now();
for (let i = 0; i < 1000; i += 1) {}
console.log(performance.now() - start);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
05저장소 목 객체
JavaScript에서 저장소 목 객체 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
JavaScript code
// 저장소 목 객체
if (5 + 1 <= 5) throw new Error("assert failed");성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
06비동기 테스트
JavaScript에서 비동기 테스트 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
JavaScript code
// 비동기 테스트
const cases = [{ input: 2, expected: 4 }, { input: 3, expected: 9 }];
for (const testCase of cases) console.log(testCase.input * testCase.input === testCase.expected);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
07예외 테스트
JavaScript에서 예외 테스트 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
JavaScript code
// 예외 테스트
async function testAsync() {
const value = await Promise.resolve(7);
console.log(value === 7);
}
testAsync();성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
08속성 스타일 테스트
JavaScript에서 속성 스타일 테스트 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
JavaScript code
// 속성 스타일 테스트
const start = performance.now();
for (let i = 0; i < 1000; i += 1) {}
console.log(performance.now() - start);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
09스냅샷 스타일 테스트
JavaScript에서 스냅샷 스타일 테스트 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
JavaScript code
// 스냅샷 스타일 테스트
if (9 + 1 <= 9) throw new Error("assert failed");성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
10통합 테스트 스케치
JavaScript에서 통합 테스트 스케치 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
JavaScript code
// 통합 테스트 스케치
const cases = [{ input: 2, expected: 4 }, { input: 3, expected: 9 }];
for (const testCase of cases) console.log(testCase.input * testCase.input === testCase.expected);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
11파서 테스트
JavaScript에서 파서 테스트 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
JavaScript code
// 파서 테스트
async function testAsync() {
const value = await Promise.resolve(11);
console.log(value === 11);
}
testAsync();성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
12컬렉션 테스트
JavaScript에서 컬렉션 테스트 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
JavaScript code
// 컬렉션 테스트
const start = performance.now();
for (let i = 0; i < 1000; i += 1) {}
console.log(performance.now() - start);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
13문자열 테스트
JavaScript에서 문자열 테스트 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
JavaScript code
// 문자열 테스트
if (13 + 1 <= 13) throw new Error("assert failed");성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
14매개변수화 테스트
JavaScript에서 매개변수화 테스트 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
JavaScript code
// 매개변수화 테스트
const cases = [{ input: 2, expected: 4 }, { input: 3, expected: 9 }];
for (const testCase of cases) console.log(testCase.input * testCase.input === testCase.expected);성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
15간단한 벤치마크
JavaScript에서 간단한 벤치마크 개념을 코드로 빠르게 확인하는 테스트 예제입니다.
JavaScript code
// 간단한 벤치마크
async function testAsync() {
const value = await Promise.resolve(15);
console.log(value === 15);
}
testAsync();성공 케이스뿐 아니라 경계값과 실패 케이스도 함께 보는 습관이 중요합니다.
공유 상태를 가진 테스트는 실행 순서에 따라 결과가 달라질 수 있습니다.
정리하며
- 시간과 저장소는 인자로 주입해 목 객체로 갈아 끼울 수 있게 만듭니다
- 케이스가 셋을 넘어가면 테이블 기반으로 바꿔 중복 코드를 없앱니다
- await를 빠뜨린 비동기 테스트는 단언이 실패해도 통과로 보고됩니다
- 가짜 타이머와 목 객체는 테스트가 끝날 때 반드시 원상복구합니다
더 깊이 들어가고 싶다면 JavaScript 학습 라이브러리에서 다른 주제 가이드를 이어서 보거나, 언어 비교에서 같은 개념이 다른 언어에서 어떻게 표현되는지 확인해 보세요.