jest 테스트 환경 설정
jest.config.cjs 환경설정
client 폴더에 가서 jest.config.cjs 파일을 생성합니다.
module.exports = {
roots: ['<rootDir>/src'],
testEnvironment: 'jsdom',
testEnvironmentOptions: {
url: 'http://localhost:3080',
},
collectCoverage: true,
collectCoverageFrom: [
'src/**/*.{js,jsx,ts,tsx}',
'!<rootDir>/node_modules/',
'!src/**/*.css.d.ts',
'!src/**/*.d.ts',
],
coveragePathIgnorePatterns: ['<rootDir>/node_modules/', '<rootDir>/test/setupTests.js'],
// Todo: Add coverageThreshold once we have enough coverage
// Note: eventually we want to have these values set to 80%
// coverageThreshold: {
// global: {
// functions: 9,
// lines: 40,
// statements: 40,
// branches: 12,
// },
// },
moduleNameMapper: {
'\\.(css)$': 'identity-obj-proxy',
'\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
'jest-file-loader',
'^test/(.*)$': '<rootDir>/test/$1',
'^~/(.*)$': '<rootDir>/src/$1',
'^librechat-data-provider/react-query$': '<rootDir>/../node_modules/librechat-data-provider/src/react-query',
},
restoreMocks: true,
testResultsProcessor: 'jest-junit',
coverageReporters: ['text', 'cobertura', 'lcov'],
transform: {
'\\.[jt]sx?$': 'babel-jest',
'\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
'jest-file-loader',
},
transformIgnorePatterns: ['node_modules/?!@zattoo/use-double-click'],
preset: 'ts-jest',
setupFilesAfterEnv: ['@testing-library/jest-dom/extend-expect', '<rootDir>/test/setupTests.js'],
clearMocks: true,
};
Jest 테스트 프레임워크의 설정 파일인 jest.config.cjs
입니다.
Jest는 JavaScript 코드를 테스트하는 데 널리 사용되는 강력한 테스트 러너이며, 이 설정 파일은 Jest가 테스트를 어떻게 찾고, 실행하고, 보고할지를 정의합니다.
이 설정은 주로 React 및 TypeScript 기반의 프론트엔드 프로젝트를 테스트하는 데 최적화되어 있습니다.
Jest 설정 파일의 구성 요소 설명
1. 테스트 파일 위치 (roots
)
JavaScript
roots: ['<rootDir>/src'],
- 용도: Jest가 테스트 파일을 찾아야 할 루트 디렉토리를 지정합니다.
<rootDir>/src
: 프로젝트의 루트 디렉토리(package.json
이 있는 곳)에서src
폴더를 기준으로 테스트 파일을 찾겠다는 의미입니다.
2. 테스트 환경 (testEnvironment
, testEnvironmentOptions
)
JavaScript
testEnvironment: 'jsdom',
testEnvironmentOptions: {
url: 'http://localhost:3080',
},
testEnvironment: 'jsdom'
: 테스트 코드를 실행할 환경을 지정합니다.jsdom
은 Node.js 환경에서 브라우저와 유사한 DOM 환경을 시뮬레이션해 줍니다. 이는 React 컴포넌트와 같이 브라우저 DOM에 의존하는 코드를 Node.js 환경에서 테스트할 때 필수적입니다.testEnvironmentOptions: { url: 'http://localhost:3080' }
:jsdom
환경의 옵션을 설정합니다.url
을 지정하여 테스트 환경의window.location.href
와 같은 브라우저 URL 관련 속성들이 특정 값으로 설정되도록 합니다. 이는 특정 URL에 따라 다르게 동작하는 코드를 테스트할 때 유용할 수 있습니다.
3. 코드 커버리지 (collectCoverage
, collectCoverageFrom
, coveragePathIgnorePatterns
, coverageReporters
)
JavaScript
collectCoverage: true,
collectCoverageFrom: [
'src/**/*.{js,jsx,ts,tsx}',
'!<rootDir>/node_modules/',
'!src/**/*.css.d.ts',
'!src/**/*.d.ts',
],
coveragePathIgnorePatterns: ['<rootDir>/node_modules/', '<rootDir>/test/setupTests.js'],
coverageReporters: ['text', 'cobertura', 'lcov'],
// coverageThreshold: { ... } (주석 처리됨)
collectCoverage: true
: 테스트 실행 후 코드 커버리지(테스트가 코드의 얼마나 많은 부분을 실행했는지)를 수집하도록 설정합니다.collectCoverageFrom
: 커버리지를 수집할 파일들의 패턴을 지정합니다.src
폴더 내의.js
,.jsx
,.ts
,.tsx
파일들을 포함하되,.css.d.ts
(CSS 모듈 타입 선언 파일)와.d.ts
(TypeScript 타입 선언 파일)는 제외합니다.node_modules
도 제외합니다.coveragePathIgnorePatterns
: 커버리지 수집에서 제외할 파일 또는 폴더의 패턴을 지정합니다.node_modules
와test/setupTests.js
파일은 커버리지 보고서에 포함되지 않습니다.coverageReporters
: 커버리지 보고서의 형식을 지정합니다.text
: 터미널에 텍스트 요약 보고서를 출력합니다.cobertura
: Jenkins와 같은 CI/CD 도구에서 사용되는 XML 형식의 보고서를 생성합니다.lcov
: HTML 보고서 등을 생성하는 데 사용되는 LCOV 형식의 보고서를 생성합니다.
coverageThreshold
(주석 처리됨): 코드 커버리지 최소 임계값을 설정하는 부분입니다. 현재는 주석 처리되어 있지만, 프로젝트의 코드 커버리지가 일정 수준에 도달하면 이 값을 설정하여 코드 품질을 강제할 수 있습니다. (예:functions: 80
이면 함수 커버리지가 80% 미만일 경우 테스트 실패)
4. 모듈 매퍼 (moduleNameMapper
)
JavaScript
moduleNameMapper: {
'\\.(css)$': 'identity-obj-proxy',
'\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
'jest-file-loader',
'^test/(.*)$': '<rootDir>/test/$1',
'^~/(.*)$': '<rootDir>/src/$1',
'^librechat-data-provider/react-query$': '<rootDir>/../node_modules/librechat-data-provider/src/react-query',
},
- 용도: 특정 파일 확장자나 경로 패턴을 Jest가 모의(mock)하거나 다른 파일로 매핑하도록 지시합니다. Jest는 기본적으로 JavaScript 파일만 이해하므로, CSS나 이미지 같은 자산 파일은 테스트 환경에서 로드할 수 없습니다.
'\\.(css)$': 'identity-obj-proxy'
:.css
파일에 대한 임포트가 발생하면identity-obj-proxy
라는 가짜 객체로 대체합니다. 이는 CSS 모듈을 사용하는 경우className
이undefined
가 되는 문제를 방지합니다.'\\.(jpg|...)$': 'jest-file-loader'
: 이미지, 폰트, 오디오/비디오 등 비-JS 자산 파일에 대한 임포트가 발생하면jest-file-loader
를 통해 처리합니다. 이 로더는 파일을 모의하여 테스트 오류를 방지합니다.'^test/(.*)$': '<rootDir>/test/$1'
:test/
로 시작하는 임포트 경로를프로젝트루트/test/
로 매핑합니다.'^~/(.*)$': '<rootDir>/src/$1'
:~/
로 시작하는 임포트 경로를프로젝트루트/src/
로 매핑합니다. 이는 Babel이나 Vite 설정의 경로 별칭(alias
)과 동일한 기능을 Jest에서도 사용할 수 있도록 합니다.'^librechat-data-provider/react-query$': '<rootDir>/../node_modules/librechat-data-provider/src/react-query'
:librechat-data-provider/react-query
라는 특정 모듈을node_modules
내의 특정 소스 파일로 직접 매핑합니다. 이는 번들된 버전 대신 소스 코드를 직접 테스트해야 할 때 유용할 수 있습니다.
5. 테스트 결과 처리 및 정리 (restoreMocks
, testResultsProcessor
, clearMocks
)
JavaScript
restoreMocks: true,
testResultsProcessor: 'jest-junit',
clearMocks: true,
restoreMocks: true
: 각 테스트 전에 모든 모의(mock) 상태를 원래 구현으로 되돌립니다.testResultsProcessor: 'jest-junit'
: 테스트 결과를 JUnit XML 형식으로 처리하여 출력합니다. 이는 CI/CD(지속적 통합/배포) 시스템에서 테스트 결과를 분석하고 보고하는 데 일반적으로 사용됩니다.clearMocks: true
: 각 테스트 전에 모든 모의 함수 호출 통계(mockFn.mock.calls
,mockFn.mock.instances
)를 초기화합니다.
6. 코드 변환 (transform
, transformIgnorePatterns
, preset
)
JavaScript
transform: {
'\\.[jt]sx?$': 'babel-jest',
'\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
'jest-file-loader',
},
transformIgnorePatterns: ['node_modules/?!@zattoo/use-double-click'],
preset: 'ts-jest',
transform
: Jest가 파일을 임포트하기 전에 변환해야 하는 방법을 지정합니다.'\\.[jt]sx?$': 'babel-jest'
:.js
,.jsx
,.ts
,.tsx
확장자를 가진 파일들을 Jest가babel-jest
를 사용하여 변환하도록 지시합니다. 이는 최신 JavaScript, React JSX, TypeScript 문법을 Jest가 이해할 수 있는 형태로 바꿔줍니다.- 비-JS 자산 변환:
moduleNameMapper
와 동일하게 이미지, 폰트 등의 비-JS 자산 파일을jest-file-loader
로 변환합니다.
transformIgnorePatterns
: 변환하지 않고 건너뛸 파일 패턴을 지정합니다.node_modules
폴더는 일반적으로 변환되지 않지만,?!@zattoo/use-double-click
부분은@zattoo/use-double-click
패키지는 예외적으로 변환하도록 합니다. 이는 이 패키지가 최신 문법을 사용하여 Jest가 기본적으로 처리할 수 없을 때 필요할 수 있습니다.preset: 'ts-jest'
: Jest가 TypeScript 파일을 처리할 수 있도록ts-jest
프리셋을 사용합니다. 이는babel-jest
와 유사하게 TypeScript 코드를 변환하지만,ts-jest
는 타입 검사에도 더 중점을 둡니다. (babel-jest
와ts-jest
를 함께 사용하는 설정이므로, 상황에 따라서는 하나만 사용하는 것이 더 적절할 수도 있습니다.)
7. 테스트 설정 파일 (setupFilesAfterEnv
)
JavaScript
setupFilesAfterEnv: ['@testing-library/jest-dom/extend-expect', '<rootDir>/test/setupTests.js'],
- 용도: 각 테스트 파일이 실행되기 전에 특정 설정 파일을 실행하도록 합니다.
@testing-library/jest-dom/extend-expect
:@testing-library/jest-dom
라이브러리에서 제공하는 추가적인 Jest 매처(matcher)를 활성화합니다. 이를 통해<div data-testid="my-element">
와 같은 DOM 요소를.toBeInTheDocument()
와 같이 더 쉽게 테스트할 수 있습니다.<rootDir>/test/setupTests.js
: 사용자 정의 전역 설정 파일을 실행합니다. 이 파일에는 모든 테스트에서 공통적으로 필요한 초기화 코드(예: 전역 모의, 환경 설정)가 포함될 수 있습니다.
요약
이 jest.config.cjs
파일은 React, TypeScript 기반의 프론트엔드 프로젝트를 위한 강력하고 포괄적인 Jest 테스트 환경을 설정합니다. 주요 목적은 다음과 같습니다:
- 브라우저 환경 시뮬레이션:
jsdom
을 사용하여 Node.js 환경에서 브라우저 DOM을 모방하여 UI 컴포넌트를 테스트할 수 있게 합니다. - 최신 문법 및 타입스크립트 지원: Babel과
ts-jest
를 통해 JSX, 최신 JavaScript, TypeScript 코드를 변환하여 테스트할 수 있게 합니다. - 자산 파일 처리: CSS, 이미지 등 비-JS 파일을 Jest가 이해할 수 있도록 모의하거나 변환합니다.
- 코드 커버리지 분석: 테스트 커버리지를 수집하고 다양한 형식으로 보고합니다.
- 테스트 환경 관리: 모의를 자동으로 복원/초기화하고, CI/CD를 위한 JUnit 보고서를 생성합니다.
- 개발 편의성: 경로 별칭을 지원하여 모듈 임포트를 간소화합니다.
전반적으로 이 설정은 효율적이고 안정적인 프론트엔드 유닛 테스트 파이프라인을 구축하는 데 필요한 모든 요소를 포함하고 있습니다.
댓글