初次体验 JS/TS 单元测试框架:Mocha、Jest、AVA、Tape、node-tap
起因
最近要写一个小的算法的 npm 包。
一开始没有单元测试。但是写着写着有个模块比较复杂,不单元测试我心虚得浑身冒汗,睡觉翻过来覆过去脑海里全是它,调用的时候害怕得双手颤抖,每次组合测试我都紧张得捂住眼睛不敢看结果,等着全运行完才敢露出一条缝,给我的生活和工作带来了极大的困扰。
终于我还是撑不住了,打开浏览器输入 Mocha 回车。没想到的是搜索结果不仅有 Mocha ,还有《十个你应该放弃 Mocha 的原因》。原来除了 mocha ,世界上还有 Jest 、 AVA 等“单元测试框架”。
需求
本文主要从以下几个需求评价:
-
性能
考虑到在家里躺着也能写程序,我最近在采用 termux + vim + coc.nvim 的 LSP 低配一条龙来在手机上写代码。但是手机作为设备太简陋,所以这里我对性能的要求较高。
-
与 TS 的适配程度
现在 TS 很流行,我也在用 TS 开发。作为狂热的进步分子,我还在使用 ts-node 来使我的工作区不包含任何的 .js 文件。
-
模块化 API
很多测试框架选择使用全局 API 来实现测试。这很不好。会污染我的项目。尤其是当你使用monorepo,选择把测试框架安装到
全局node_modules中的时候,你就会惊喜地发现不论从天涯还是海角,是个代码就能访问到性感的全局 API ——非常的暴露。 -
断言功能
由于项目原因,我对数组和未知结构的多层对象之间的比较的需求很大。未来还会有模拟函数的需求。
评价
Mocha
➕作为现在最流行的测试框架,社区很活跃
➕作为现在最流行的测试框架,有很多配套的设施。
➕作为现在最流行的测试框架,相关资料很多。
➖但个人的感觉是配置比较复杂,实际上我甚至没有配置到能够正常测试那一步就放弃了。
➖它的全局变量让人望而却步。
➖自身不包含断言库可以说是只专精于框架本身,但也导致断言库和框架之间的配合出现困难。
Jest
➕现在很摩登的选择!它的社区也比较活跃。
➕断言库功能比较强大,有模拟函数、快照等特色功能。
➕通过三斜杠注释引用的全局 API,不安装 @types 定义,不会泄露得到处都是。
➕对 TS 支持很好,有 ts-jest
这个包可以用。
➕自带代码覆盖率工具。
➖性能太烂,体量太大。我的小手机最简单的测试也得30s以上。
➖文档不算特别详细,我最后把类型定义文件当文档看。
AVA
➕社区很活跃,中文文档详细又贴心。
➕宏这个特色功能很有用,适合用来批量测试。
➕模块化 API 非常好,完全没有全局变量。
➕对 TS 支持好,可以直接 TS 走你。
➖性能烂。虽然宣传性能好,不过最后我的小手机timeout=2m都跑不出一个测试。
➖自带断言有点简陋。尤其是没有 deepEqual
和 deepStructEqual
的区分,我只能用外部断言库。
➖配 ts-node 环境比较复杂,需要额外安装 @ava/typescript
,还得修改 package.json ,但文档描述的不太详细。
Tape
➕模块化 API 做到了极致,甚至直接运行 JS 文件就能开启测试,不需要命令行工具。
➕对 TS 支持非常好,只需要安装 @types/tape
。不需要命令行工具,所以可以直接 ts-node 。
➕性能很好,我的小手机基本上 20s 过测试,实际上大概有 15s 时间是耗在 ts-node 上。
➕附带的断言库还是可以的。
➖社区不太活跃,我跟着英文文档走的。
➖默认输出非常非常简陋,让人看了就想去找美化包的程度。
node-tap
➕模块化非常好,也可以直接运行 JS 文件来开启测试。
➕有 @types/tap
类型定义文件,支持 TS 。
➕性能很好。在我的小手机上比 Tape 快个四、五秒。
➕附赠一个 nyc/istanbul 覆盖率工具
➕断言库可以的。
➖虽然能运行 JS 文件测试,但是不能记录覆盖率,不能配置参数,界面也更加简陋,最终还是要使用命令行。
➖社区很不活跃,很多问题没有解决,文档也不多。
➖对 ts-node 支持不好。我从 node-tap 到 ts-node 看了七八个 issue 也没搞懂怎么把 ts-node 和命令行结合起来用。
总结
根据以上评价,我认为 Jest 和 Tape 是可以选择的测试工具。
考虑到与 nyc/istanbul 搭配可以为 Tape 提供获取代码测试覆盖率的功能,而且还有很多美化插件可供 Tape 使用,这里我就出于性能考虑,最终使用 nyc + Tape + colortape 的搭配。虽然非常简陋,但性能方面是不错的,作为单元测试工具足够了。
博客园原文链接:https://www.cnblogs.com/QiFande/p/best-unit-test-framework.html,转载请注明。
如果你对本篇文章感兴趣,不如来看看肉丁土豆表的其他文章,说不定也有你喜欢的。