肉丁土豆园地

安静的小博客里,属于我的编程时光
初次体验 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都跑不出一个测试。

➖自带断言有点简陋。尤其是没有 deepEqualdeepStructEqual 的区分,我只能用外部断言库。

➖配 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 的搭配。虽然非常简陋,但性能方面是不错的,作为单元测试工具足够了。

posted on 2023-07-02 21:08  肉丁土豆表  阅读(618)  评论(0编辑  收藏  举报