跳至主内容

Jest 11.0

· 5 分钟阅读
非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

今天我们宣布 Jest 正式启用主版本号机制,Jest 11.0 成为首个主版本更新。Facebook 工程师和持续集成系统已使用 Jest 多年,我们认为它早已超越 "1.0 版本" 的成熟度。这一变更与 React 团队的版本策略调整 类似。

若您正在使用 Jest 0.9 或 0.10 版本,升级过程将是无缝衔接的。过去几个月的所有改进均已整合至 Jest 11.0。

Jest 11.0 新特性

Babel 集成与配置简化

新模块化的 Jest 代码库 已内置 babel-jest,实现了无缝集成。如果您正在升级旧版 Jest 或初次采用,建议阅读入门指南

早期 Jest 提供类似 jest.dontMock 的 API 来解除随后通过 require 函数引入的模块模拟。典型测试代码结构如下:

jest.dontMock('LikeButton');
const LikeButton = require('LikeButton'); // LikeButton is unmocked

但结合 ES2015 的 import 语句时,此机制将失效。根据规范,import 会被提升至代码块顶部,因此以下写法:

jest.dontMock('LikeButton');
import LikeButton from 'LikeButton';

实际执行顺序会变为:

import LikeButton from 'LikeButton'; // This happens before the dontMock call.
jest.dontMock('LikeButton');

这将导致 LikeButton 模块被模拟,即使我们显式调用了 dontMock

当同时使用最新版 Jest 和 babel-jest 时,新 API jest.unmockjest.mockjest.disableAutomockjest.enableAutomock 的调用会被提升至 ES2015 import 语句之前。

jest.unmock('LikeButton');
import LikeButton from 'LikeButton'; // LikeButton is properly unmocked!

(自动)模拟功能增强

我们大幅优化了 Jest 的自动模拟功能,修复了多项缺陷,增强 npm3 兼容性并新增手动模拟 API。许多用户希望禁用自动模拟功能,为此我们新增了全局配置项 automock,可设置为 false

我们还新增两个 API 简化手动模拟。jest.mock 可为特定测试指定模拟工厂:

// Implement a mock for a hypothetical "sum" module.
jest.mock('sum', () => {
return (a, b) => a + b;
});

const sum = require('sum');
sum(1, 4); // 5

新增的 jest.fn 则简化了模拟函数创建:

// Create a mock function
const mockFn = jest.fn(() => 42);
mockFn(); // 42
expect(mockFn.calls.length).toBe(1);

性能优化

我们近期撰文介绍了 Jest 的性能改进。最显著的提升在于启动速度优化,目前整体性能已达到理想状态。

Jasmine 与断言改进

Jest 开源时搭载 Jasmine 1,但设计上兼容任何测试断言库。去年底通过社区贡献新增了 Jasmine 2 可选支持,该版本在性能和 API 设计上均有显著提升。Facebook 内部所有 JavaScript 测试已迁移至 Jasmine 2。Jest 11 将 Jasmine 2 设为默认测试运行器,仍可通过 testRunner 配置启用 Jasmine 1。

我们同时优化了 Jasmine 相关功能:改进了模拟函数自定义匹配器的错误提示(现同样适用于 Jasmine spies),使用 fitfdescribe, 跳过的测试现在会在运行结果中正确显示。

其他变更

jest --watch 命令已重构优化,默认模式下仅运行与变更文件相关的测试。如需在每次变更时运行全部测试,请使用 jest --watch=all。详细日志输出获得改进,新增了更直观的警告与错误提示。新增 testEnvironment 配置项可自定义测试环境(例如开发 Node 服务时可选用 node 环境替代默认的 jsdom)。网站及文档已全面重构。

所有变更细节请参阅更新日志

社区贡献与未来规划

过去六个月,众多新贡献者为 Jest 带来了重大改进。衷心感谢所有开源贡献者与 Facebook 同事共同推动 Jest 发展。新晋贡献者包括:Alexander Juarez, Christian Lentfort, Cristian Carlesso, Dan Abramov, Dmitrii Abramov, Evan Jacobs, James Friend, James Ide, Jeff Carpenter, Joe Lencioni, Michael Diolosa, Nik Graf, Pavel Prokopenko, Pavel Volokitin, Sebastian Mayr 和 ShihChi Huang。

在各位的支持下,我们将持续完善 Jest。当前工作重点包括:优化 React (Native) 测试体验、增强代码覆盖率支持,以及开源内部测试运行器(支持单命令运行多 Jest 项目)。