Jest 配置文件(jest.config.js)
配置项
jest.config.js 详细介绍
jest.config.js 是 Jest 测试框架的核心配置文件,用于定制测试执行规则、环境、模块处理、覆盖率统计等所有核心行为。它支持 CommonJS 模块化(.js)或 ESM 模块化(.mjs/package.json 中指定 type: module),默认位于项目根目录,也可通过 jest --config <路径> 指定自定义路径。
核心配置分类与详解
一、基础配置(测试执行核心)
| 配置项 | 类型 | 默认值 | 核心作用 |
|---|---|---|---|
testRegex | string[] | [] | 用正则表达式匹配测试文件(优先级低于 testMatch,两者二选一即可)。 |
testTimeout | number | 5000 | 单个测试用例超时时间(毫秒),异步测试或真实接口测试需适当增大(如 10000)。 |
rootDir | string | 项目根目录 | 测试文件的根目录,testMatch 等路径基于此目录解析。 |
roots | string[] | ["<rootDir>"] | 用于查找测试文件和模块的根目录数组,限制 Jest 搜索范围以提升效率。 |
testEnvironment | string | "jsdom" | 测试运行环境:- "jsdom":模拟浏览器环境(Vue/React 前端测试常用)- "node":Node.js 环境(后端/工具库测试)- 自定义环境路径 |
testMatch | string[] | 匹配测试文件的路径规则(支持 glob 模式),指定哪些文件被视为测试文件。 |
二、模块解析与处理(适配项目目录结构)
| 配置项 | 类型 | 默认值 | 核心作用 |
|---|---|---|---|
moduleFileExtensions | string[] | ["js", "json", "jsx", "ts", "tsx", "node"] | Jest 识别的文件扩展名,按顺序尝试解析(如导入 .vue 需添加 "vue")。 |
moduleNameMapper | object | {} | 模块路径映射(类似 Webpack 的 resolve.alias),用于简化导入和处理非 JS 模块 |
moduleDirectories | string[] | ["node_modules"] | 查找模块时的目录优先级,可添加自定义目录(如 ["src", "node_modules"])。 |
transform | object | {"^.+\\.[jt]s?$": "babel-jest"} | 转换器配置:指定文件如何被编译,适配 ES6+/TS/Vue 等 |
transformIgnorePatterns | string[] | ["/node_modules/"] | 忽略转换的文件路径(正则),如第三方模块无需编译(需转换的模块可排除,如 "/node_modules/(?!@my-org)/")。 |
setupFiles | string[] | [] | 测试执行前运行的脚本(同步),用于初始化全局变量、环境配置(如 import "@/utils/global")。 |
setupFilesAfterEnv | string[] | [] | 测试环境初始化后运行的脚本(异步),用于配置 Jest 断言、Vue Test Utils 全局配置(如 import "@vue/test-utils")。 |
三、测试过滤与执行策略
| 配置项 | 类型 | 默认值 | 核心作用 |
|---|---|---|---|
testPathIgnorePatterns | string[] | ["/node_modules/"] | 忽略的测试文件路径(正则),如 ["/node_modules/", "/dist/"]。 |
collectCoverageFrom | string[] | ["**/*.{js,jsx,ts,tsx}", "!**/node_modules/**", "!**/vendor/**"] | 统计代码覆盖率的文件范围(glob 模式),排除无需统计的文件。 |
coverageReporters | string[] | ["json", "lcov", "text", "clover"] | 覆盖率报告格式: - "text":终端输出- "lcov":生成 LCOV 文件(适配 Codecov 等工具)- "html":生成 HTML 报告(可本地打开查看) |
coverageDirectory | string | "<rootDir>/coverage" | 覆盖率报告输出目录。 |
coverageThreshold | object | {} | 覆盖率阈值要求(未达标则测试失败),强制保证代码质量:javascript<br>{ global: { branches: 80, functions: 80, lines: 80, statements: 80 }, "./src/utils/": { lines: 90 } }<br> |
onlyChanged | boolean | false | 仅运行修改过的文件对应的测试用例(开发时提升效率),需配合版本控制(Git)。 |
四、Mock 与全局配置
| 配置项 | 类型 | 默认值 | 核心作用 |
|---|---|---|---|
automock | boolean | false | 自动模拟所有导入的模块(默认关闭,建议手动通过 jest.mock 控制)。 |
clearMocks | boolean | false | 每个测试用例执行后清除所有 mock 函数的调用记录(避免用例间污染)。 |
resetMocks | boolean | false | 每个测试用例执行后重置所有 mock 函数(保留实现,清除调用记录和实例)。 |
restoreMocks | boolean | false | 每个测试用例执行后恢复被 jest.spyOn 监视的方法(避免全局污染)。 |
globals | object | {} | 定义测试环境中的全局变量,如 { "Vue": Vue, "__DEV__": true }。 |
unmockedModulePathPatterns | string[] | [] | 不被自动 mock 的模块路径(正则),如真实接口测试时排除 axios。 |
五、Vue 项目专属配置(适配 Vue 2/3)
Vue 项目需结合 vue-jest 和 Vue Test Utils,补充以下配置:
javascript
module.exports = {
// 1. 识别 .vue 文件
moduleFileExtensions: ["js", "vue", "json"],
// 2. 映射 @ 到 src 目录(与 Vue CLI 一致)
moduleNameMapper: {
"^@/(.*)$": "<rootDir>/src/$1",
// 3. 忽略样式文件(用 stub 替代)
"^.+\\.(css|scss|less)$": "jest-transform-stub",
},
// 4. 转换 .vue 和 JS 文件
transform: {
"^.+\\.js$": "babel-jest", // 编译 ES6+
"^.+\\.vue$": "vue-jest", // 编译 .vue 文件(Vue 2 用 vue-jest@3,Vue 3 用 vue-jest@5)
},
// 5. 测试环境(Vue 前端测试用 jsdom)
testEnvironment: "jsdom",
// 6. 忽略 node_modules 中的 Vue 相关模块转换
transformIgnorePatterns: ["/node_modules/(?!vue|@vue/shared)/"],
// 7. 测试前初始化 Vue Test Utils
setupFilesAfterEnv: ["<rootDir>/tests/setup.js"],
};六、TypeScript 项目专属配置
需配合 ts-jest 处理 TypeScript 文件:
javascript
module.exports = {
preset: "ts-jest", // 预设 ts-jest 配置(简化配置)
testEnvironment: "jsdom",
moduleFileExtensions: ["ts", "tsx", "js", "vue", "json"],
moduleNameMapper: {
"^@/(.*)$": "<rootDir>/src/$1",
},
transform: {
"^.+\\.vue$": "vue-jest",
"^.+\\.tsx?$": ["ts-jest", { tsconfig: "<rootDir>/tsconfig.test.json" }], // 指定测试用 tsconfig
},
};完整配置示例(Vue 2 + Jest + Vue Test Utils)
javascript
// jest.config.js
module.exports = {
// 基础配置
testMatch: ["**/__tests__/**/*.spec.js", "**/?(*.)+(spec|test).js"],
testEnvironment: "jsdom",
testTimeout: 10000,
rootDir: process.cwd(),
roots: ["<rootDir>/src", "<rootDir>/tests"],
// 模块解析
moduleFileExtensions: ["js", "vue", "json"],
moduleNameMapper: {
"^@/(.*)$": "<rootDir>/src/$1",
"^.+\\.(css|scss|png|jpg|jpeg|gif|svg)$": "jest-transform-stub",
},
transform: {
"^.+\\.js$": "babel-jest",
"^.+\\.vue$": "vue-jest@3", // Vue 2 适配 vue-jest@3
},
transformIgnorePatterns: ["/node_modules/(?!vue|element-ui)/"],
// 测试初始化
setupFiles: ["<rootDir>/tests/setup.global.js"], // 同步初始化全局变量
setupFilesAfterEnv: ["<rootDir>/tests/setup.jest.js"], // 配置断言/测试工具
// 覆盖率配置
collectCoverageFrom: [
"src/**/*.{js,vue}",
"!src/main.js", // 排除入口文件
"!src/router/index.js", // 排除路由配置
"!**/node_modules/**",
],
coverageReporters: ["text", "html", "lcov"],
coverageDirectory: "<rootDir>/tests/coverage",
coverageThreshold: {
global: {
branches: 60,
functions: 70,
lines: 80,
statements: 80,
},
},
// Mock 配置
clearMocks: true, // 每个用例后清除 mock 记录
restoreMocks: true, // 恢复 spyOn 监视的方法
globals: {
"vue-jest": {
compilerOptions: {
preserveWhitespace: false, // 移除 Vue 模板中的空白字符(与项目配置一致)
},
},
},
};配置加载优先级
Jest 会按以下顺序查找配置文件,找到后停止:
- 命令行参数(如
jest --testTimeout 10000) package.json中的jest字段jest.config.js/jest.config.mjs/jest.config.cjsjest.json/jest.yml/jest.yaml
常用命令(配合配置使用)
| 命令 | 作用 |
|---|---|
jest | 按配置执行所有测试用例 |
jest --coverage | 执行测试并生成覆盖率报告 |
jest --watch | 监听文件变化,自动重新运行相关测试(开发时高效) |
jest --onlyChanged | 仅运行修改过的文件的测试用例 |
jest --config ./jest.config.custom.js | 使用自定义路径的配置文件 |
关键注意事项
- 版本兼容性:
vue-jest、ts-jest等插件版本需与 Jest、Vue/TypeScript 版本匹配(如 Vue 2 不支持vue-jest@5+)。 - 异步测试:测试异步逻辑(如接口请求)时,需确保
testTimeout足够长,且用async/await处理异步操作。 - Mock 与真实接口:如需调用真实接口,避免
automock: true,手动控制jest.mock仅模拟非核心依赖。 - 覆盖率优化:
collectCoverageFrom需精准配置,避免统计第三方代码、入口文件等无需覆盖的内容。
要不要我帮你生成一份 项目专属配置模板,根据你的技术栈(Vue 2/3、TS/JS、是否使用 Element UI 等)定制化配置?
项目专属配置(Vue 2 + Jest + Vue Test Utils)
js
// jest.config.js
module.exports = {
testEnvironment: "jsdom",
preset: "@vue/cli-plugin-unit-jest",
transform: {
"^.+\\.vue$": "vue-jest",
"^.+\\.js$": "babel-jest",
// 处理SCSS等样式文件
// 使用自定义转换器处理 SCSS
"^.+\\.scss$":
"<rootDir>/src/components/JestTest/public/jest-transform-scss.js",
},
moduleNameMapper: {
"^@/(.*)$": "<rootDir>/src/$1",
// 关键:将原 auth.js 映射到测试用的 mock 文件
"^@/utils/auth.js$": "<rootDir>/tests/mocks/auth.js",
"^@/utils/auth$": "<rootDir>/tests/mocks/auth.js",
},
moduleFileExtensions: ["vue", "js", "json", "node", "scss"],
testMatch: ["**/__tests__/**/*.spec.js", "**/__tests__/**/*.test.js"],
transformIgnorePatterns: ["/node_modules/"],
setupFiles: [
// "./tests/setup/axiosTokenInterceptor.js", // 第一步:注入拦截器
// "./tests/setup/axiosBaseUrlPatch.js", // 最优先加载,覆盖 Axios 行为
//
"./tests/setup/env.js",
// "./tests/utils/setupFiles.js",
// "./tests/setup/mockWindow.js",
// "./tests/setup/axiosPatch.js", // 第一步:补丁 Axios 函数
// "./tests/setup/axiosFix.js", // 第二步:模拟基础对象(可选)
// /*"./test/setup/env.js", */ "./tests/setup/browserMocks.js",
], // 配置环境变量
// verbose: true, // 显示详细日志
// globals: {
// "process.env": {
// VUE_APP_BASE_API:
// "https://yingliancirclechain.com/financial-service-platform", // 直接指定测试环境的 baseURL
// },
// },
};