Jest - 配置

在本章中,我们将介绍如何配置 Jest以实现最佳测试。我们将介绍配置文件、命令行选项以及如何生成代码覆盖率报告。

Jest 配置文件

Jest 在其默认设置下运行良好,但有时需要自定义。您可以使用专用文件(如 jest.config.jsjest.config.tsjest.config.json 或其他受支持的格式)配置 Jest。 Jest 将自动检测此文件,或者您可以使用 --config 标志 指定自定义路径。

配置 Jest 的方法

Jest 配置可以通过三种主要方式完成:

  • 专用配置文件(jest.config.jsjest.config.ts 等)。
  • package.json
  • 一次性配置的命令行参数

示例配置

以下是 jest.config.js 文件的简单示例:

module.exports = {
    // 指定环境(例如, 'node' 表示服务器端)
    testEnvironment: 'node',
    
    // 启用详细测试输出
    verbose: true,
    
    // 查找测试文件的模式
    testMatch: ['**/?(*.)+(spec|test).js'],
    
    // 支持的文件类型
    moduleFileExtensions: ['js', 'json', 'jsx', 'ts', 'tsx']
};

moduleFileExtensions 数组定义 Jest 将识别的文件类型:

  • js: JavaScript 文件。
  • json: JSON 文件。
  • jsx: React JavaScript 文件。
  • ts: TypeScript 文件。
  • tsx: TypeScript React 文件。

Jest - CLI 选项

Jest 还提供了几个 命令行界面 (CLI) 选项,允许您自定义 Jest 直接从终端运行的方式。

Jest 中的常见 CLI 选项

以下是一些最常用的 Jest CLI 选项:

命令 功能
--coverage 生成代码覆盖率报告,显示代码测试量。
--watch 在监视模式下运行 Jest,当文件更改时自动重新运行测试。
--verbose 显示有关每个单独测试结果的详细信息。
--testNamePattern=<pattern> 仅运行名称与提供的模式匹配的测试。例如,jest --testNamePattern="button"。
--maxWorkers=<number> 限制 Jest 用于运行测试的工作进程数量,以优化性能。
--runInBand 按顺序运行所有测试(用于调试或测试有副作用时)。

如何在 Jest 中使用 CLI 选项?

要使用这些选项中的任何一个,您只需在通过终端运行 Jest 时传递它们即可。 例如,要生成代码覆盖率报告并显示每个测试的详细结果,您可以使用以下命令:

npm test -- --coverage --verbose

示例命令

这是一个使用多个选项运行 Jest 的示例:

jest --coverage --watch --verbose

此命令:

  • --coverage:收集代码覆盖率数据。
  • --watch:在监视模式下运行 Jest,当文件更改时自动重新运行测试。
  • --verbose:显示每个单独的详细测试结果测试。

Jest - 代码覆盖率报告

Jest 可以自动收集代码覆盖率数据,显示测试套件测试了多少代码。它会在您运行测试时生成覆盖率报告,并支持不同的格式。

启用代码覆盖率

要在 Jest 中启用代码覆盖率,您可以在配置文件中设置 collectCoverage 选项,也可以在命令行中使用 --coverage 标志。

在配置文件 (jest.config.js) 中:

module.exports = {
    collectCoverage: true,
};

使用 CLI 标志:

npx jest --coverage

在启用代码覆盖率的情况下运行 Jest 时,它将在终端中生成覆盖率报告并将其存储在指定的 coverageDirectory(例如 coverage/)中。

覆盖率报告格式

默认情况下,Jest 会以以下格式生成覆盖率报告:

  • text:在终端中显示覆盖率。
  • html:在 coverage/lcov-report 目录中生成 HTML 报告。
  • lcov:创建详细的 lcov 报告(适用于与 Coveralls 或Codecov)。
  • json:输出包含覆盖率信息的 JSON 文件。

您可以在配置中自定义覆盖率报告格式:

module.exports = {
    collectCoverage: true,
    coverageReporters: ['text', 'html', 'lcov'],
};

覆盖率输出

一旦 Jest 在启用覆盖率的情况下完成测试运行,它将在终端中输出一份摘要,其中包括:

  • 语句:测试覆盖的语句百分比。
  • 分支:代码分支(if-else、循环)覆盖的百分比。
  • 函数:函数覆盖的百分比。
  • 行:行覆盖的百分比。

示例输出可能如下所示:

Statements   : 87.6% ( 92/105 )
Branches     : 75% ( 3/4 )
Functions    : 100% ( 5/5 )
Lines        : 87.6% ( 92/105 )

设置覆盖率阈值

您可以使用 Jest 配置文件中的 coverageThreshold 选项在 Jest 中设置最小覆盖率百分比(例如,语句、分支、函数)。

示例配置:

module.exports = {
    collectCoverage: true,
    coverageThreshold: {
        global: {
            statements: 80,
            branches: 75,
            functions: 90,
            lines: 85,
        },
    },
};

如果覆盖率低于这些数字,Jest 将测试失败并输出包含详细信息的消息。