Life and freedom Ge Lin ——— Draw by Razzh

前端测试框架选型调研

Oct 23 · 6 min · updated on 2025 Jul 10

最近项目有单元测试和 E2E 单元测试的需求,市面上测试框架很多,所以开启了框架的选型之路。

#Npm 每月下载量

image

可以看到 Jest 的下载量超过了 Mocha 很多。

Jest 的下载量较大,一部分原因是因为 create-react-app 脚手架默认内置了 Jest, 而大部分 React 项目都是用它生成的。

2025年另外的选择:Vitest 也是非常好的选择,这两年也是我的首选测试框架,它很好的继承了 Jest 的 API,开箱即用,上手和测试速度都很快,值得用一用!

#Github stars & issues

image

从 GitHub starts & issues 以及 npm 下载量角度来看,Jest 的关注度更高。从版本迭代来看,Jest 已经更新了29个大版本,更新更为频繁。

#使用方式

框架断言异步处理Mock代码覆盖率
Mocha不支持(需要安装 Chai)友好不支持不支持
Jest默认支持友好默认支持支持

Mocha 需要更多的配置才能上手,相对来说 Jest 是开箱即用的,Mocha 比起 Jest 有更多社区生态(得益于社区的贡献者)。 如果要想“快速”开始,那么 Jest 会是一个好选择,如果更看重社区可用的工具,那么可以选择 Mocha

#语法

#Jest

describe('Array', () => {
  it('should return -1 when the value is not present', () => {
    expect([1,2,3].indexOf(4)).toEqual(-1)
  })
})

#Mocha

describe('Array', function () {
  it('should return -1 when the value is not present', () => {
    assert.equal([1, 2, 3].indexOf(4), -1)
  })
})

相同的测试条件,你喜欢哪个?
笔者更喜欢 Jest 的语法(个人喜好),它的语法更加形象,Mocha 的语法感觉有点命令式编程的味道。

#E2E 选型

E2E 端到端测试:当一个稳定的业务组件(不需要经常改动),某天改动其他的业务组件后,影响到了之前稳定的业务组件,那么这个 Bug 很难被发现,因为测试人员不会来回对已经测了很多遍的页面进行测试,这时候就需要使用 E2E 测试来保证代码的稳定性。

这里选用 Cypress 和 Nightwatch 进行比较。两者都已经集成在 VueCli

#文档对比

#Cypress

image

#Nightwatch

image

Cypress 文档中实际上有很多关于操作的视频,能让你更快上手,并且提供了更多例子。总得来说比 Nightwatch 更易上手。

这两个产品中我更喜欢 Cypress

#为什么选择 Cypress

  • 可视化的自动化交互页面
  • 支持时间回溯,更易于 Debug
  • 可视化选取元素,更易上手
  • 文档简单易读,并提供了一系列 Example
  • 同时支持 ChormeEdgeFirefox 三款浏览器

#调研路上的竞品 Playwright

在调研的路上发现 Playwright 的热度也非常高,它支持5种主流浏览器: ChormeEdgeFirefoxOperaSafari。并且最近在大佬 antfu 的直播新工具!前端运行时报错检查core 功能也主要是用 Playwright 来做的。

总之,给人的感觉非常的 magic!

#结尾

笔者最终在项目中使用了 JestCypress,它们都集成在 Vue Cli 中,如果你是 Vue Cli 创建的项目,那么你可以通过 vue add 来安装它们,配置这些事就交给 Cli 来做吧!

#25年的更新

目前我认为 VitestPlaywright 已经都很成熟了,可以作为项目的首选测试框架。

浙ICP备2024129591号-1
春秋(Live) - 张敬轩
--:-- / --:--
  1. 1春秋(Live)张敬轩
  2. 2不吐不快(live)张敬轩
  3. 3男孩最痛(live)张敬轩
  4. 4粤语残片(live)陈奕迅
  5. 5几分之几(live)卢广仲
  6. 6地球很危险古巨基
  7. 7樱花树下(live)张敬轩

春秋 (Live) - 张敬轩 (Hins Cheung)

词:林夕

曲:Edmond Tsang

那夜谁将酒喝掉

因此我讲得多了

然后你摇着我手拒绝我

动人像友情深了

我没权终止见面

只因你友善依然

仍用接近甜蜜那种字眼通电

没人应该 怨地怨天

得到这结局

难道怪罪神没有更伪善的祝福

我没有为你伤春悲秋不配有憾事

你没有共我踏过万里

不够剧情延续故事

头发未染霜 着凉亦错在我幼稚

应快活像个天使

有没有运气再扮弱者 玩失意

有没有道理为你落发

必须得到世人同意

心灰得极可耻 心伤得无新意

那一线眼泪 欠大志

爱若能堪称伟大 再难挨照样开怀

如令你发现为你而活到失败

令人不安 我品性坏

我没有为你伤春悲秋不配有憾事

你没有共我踏过万里

不够剧情延续故事

头发未染霜 着凉亦错在我幼稚

应快活像个天使

有没有运气再扮弱者玩失意

有没有道理为你落发

必须得到世人同意

心灰得极可耻 心伤得无新意

那一线眼泪 欠大志 太没意思

若自觉这叫痛苦未免过份容易

我没有被你改写一生怎配有心事

我没有被你害过恨过

写成情史 变废纸

春秋只转载要事

如果爱你欠意义

这眼泪 无从安置

我没有运气放大自私的失意

更没有道理在这日

你得到真爱制造恨意

想心酸 还可以 想心底 留根刺

至少要见面上万次