Jest Reference
Jest 테스트 프레임워크 레퍼런스
Jest Reference 소개
Jest 레퍼런스는 Jest JavaScript 테스팅 프레임워크를 위한 완전하고 검색 가능한 치트 시트입니다. 테스트 작성의 자연스러운 흐름에 따라 8개 카테고리로 구성됩니다: 기본(test, describe, it, beforeEach, afterEach, beforeAll, afterAll, test.only, test.skip), 매처(toBe, toEqual, toStrictEqual, toBeTruthy, toBeFalsy, toBeNull, toBeUndefined, toContain, toThrow, toMatch, toBeGreaterThan, toHaveLength, toHaveProperty), 모킹(jest.fn, mockReturnValue, mockResolvedValue, jest.mock, jest.spyOn, toHaveBeenCalled, toHaveBeenCalledTimes, jest.useFakeTimers), 비동기(async/await, resolves, rejects, done 콜백, jest.setTimeout), 스냅샷(toMatchSnapshot, toMatchInlineSnapshot, --updateSnapshot, toThrowErrorMatchingSnapshot), 설정(jest.config.js, transform, moduleNameMapper, setupFilesAfterFramework), 커버리지(--coverage, coverageDirectory, collectCoverageFrom, coverageThreshold), CLI(--watch, --verbose, 패턴 매칭, --bail, --runInBand).
이 레퍼런스는 Jest로 단위 테스트, 통합 테스트, 컴포넌트 테스트를 작성하는 JavaScript 및 TypeScript 개발자를 위한 것입니다. React, Node.js, 일반 TypeScript 프로젝트에서 사용되는 일반적인 패턴을 다룹니다. 모킹 섹션은 특히 상세하게 구성되어 있으며, 모듈 모킹, 함수 스파이, mockResolvedValue를 사용한 Promise 모킹, useFakeTimers를 사용한 타이머 모킹 — 실제 테스트 스위트에서 가장 일반적인 네 가지 모킹 시나리오를 다룹니다.
커버리지와 CLI 섹션은 CI 파이프라인을 설정하고 품질 게이트를 강제하는 엔지니어를 대상으로 합니다. coverageThreshold 설정을 통해 팀이 전역적으로 최소 브랜치, 함수, 라인 커버리지를 요구하여 회귀가 병합되는 것을 방지할 수 있습니다. CLI 섹션은 개발 중 로컬 테스트 실행(--watch), CI(--runInBand, --bail), 디버깅(--verbose)에 가장 유용한 플래그를 다룹니다.
주요 기능
- beforeEach, afterEach, beforeAll, afterAll 비동기 예제가 포함된 완전한 라이프사이클 훅
- toBe vs toEqual vs toStrictEqual: 엄격한 동등성, 깊은 동등성, undefined 속성 비교
- mockReturnValue, mockResolvedValue, 호출 어설션 매처가 있는 jest.fn() 모의 함수
- 원래 구현을 보존하면서 특정 메서드를 스파이하고 모킹하는 jest.spyOn()
- 테스트에서 전체 모듈을 자동 모킹하는 jest.mock(module)
- async/await, .resolves/.rejects 체이닝, done 콜백, setTimeout 비동기 테스트 패턴
- toMatchSnapshot(), toMatchInlineSnapshot() 및 업데이트 플래그를 사용한 스냅샷 테스트
- collectCoverageFrom 글로브 패턴과 coverageThreshold 강제를 사용한 커버리지 설정
자주 묻는 질문
Jest에서 toBe와 toEqual의 차이는 무엇인가요?
toBe는 엄격한 동등성(===)을 사용하며 숫자, 문자열, 불리언과 같은 기본 타입에 적합합니다. toEqual은 두 객체의 구조와 값이 동일한지 재귀적으로 확인하여 객체와 배열을 비교할 때 올바른 선택입니다. 객체의 경우 toBe는 구조적 동등성이 아닌 참조 동등성(메모리의 동일한 객체)을 확인합니다.
Jest에서 모듈을 모킹하는 방법은?
테스트 파일 상단에 jest.mock("./your-module")을 호출하세요. Jest는 실제 모듈을 내보낸 모든 함수가 jest.fn()이 되는 자동 모킹 버전으로 교체합니다. 그런 다음 mockReturnValue나 mockResolvedValue로 반환 값을 제어하고, toHaveBeenCalledWith로 호출을 어설트할 수 있습니다.
jest.fn()과 jest.spyOn()의 차이는 무엇인가요?
jest.fn()은 실제 구현에 연결되지 않은 독립적인 모의 함수를 생성합니다. jest.spyOn(object, method)은 기존 객체의 메서드를 스파이로 대체하여 선택적으로 원래 구현을 유지하면서 호출을 가로챌 수 있습니다. 실제 모듈의 실제 메서드 호출을 모니터링하려면 spyOn을 사용하세요.
Jest로 비동기 코드를 테스트하는 방법은?
Jest는 세 가지 패턴을 지원합니다: async/await(테스트 콜백을 async로 표시하고 promise를 await), .resolves/.rejects 매처(테스트에서 expect(...).resolves.toBe(...) 반환), done 콜백(비동기 작업이 완료되면 done() 호출). 일반적으로 async/await 패턴이 가장 명확합니다.
setTimeout이나 setInterval을 사용하는 코드를 테스트하는 방법은?
테스트 시작 시 jest.useFakeTimers()를 호출하여 브라우저 타이머 함수를 가짜 구현으로 교체하세요. 그런 다음 jest.advanceTimersByTime(ms)로 실제로 기다리지 않고 시간을 빠르게 앞으로 이동할 수 있습니다. 이를 통해 시간 의존적인 코드를 동기적으로, 훨씬 빠르게 테스트할 수 있습니다.
toMatchSnapshot은 무엇이며 언제 사용해야 하나요?
toMatchSnapshot()은 값을 직렬화하여 저장된 스냅샷 파일과 비교합니다. 스냅샷이 없으면 생성하고, 이후 실행에서 출력이 변경되면 실패합니다. UI 컴포넌트 테스트에서 의도하지 않은 렌더링 변경을 잡는 데 가장 유용합니다. 의도적으로 출력을 변경할 때는 jest --updateSnapshot을 실행하세요.
Jest에서 최소 코드 커버리지를 강제하는 방법은?
jest.config.js의 coverageThreshold에 branches, functions, lines, statements 키를 설정하세요. 커버리지가 임계값 아래로 떨어지면 테스트 실행이 비제로 코드로 종료되어 CI 파이프라인이 실패합니다. collectCoverageFrom을 사용하여 커버리지 분석에 포함할 파일을 지정하세요.
jest --runInBand는 무엇을 하나요?
--runInBand는 Jest가 워커 풀 대신 동일한 프로세스에서 모든 테스트를 순차적으로 실행하도록 강제합니다. 콘솔 출력을 순서대로 보기 위한 디버깅, 실제 데이터베이스를 통해 상태를 공유하는 테스트, 리소스가 제한된 CI 환경에서 유용합니다.