Node.js 有哪些可以运用的测试框架?

简介: Node.js 有哪些可以运用的测试框架?

🙋🏻‍♀️ 编者按:本文作者是蚂蚁集团 Node.js 工程师天猪,首先会介绍下各个部分常用的类库,在文末将讨论下,单元测试是否有必要,欢迎一起探讨。

  常用的类库和工具

测试执行器

mocha 和 jest 用的比较多。官方新出了个 node test 还在打磨中。

$ mocha
  test/egg-view-ejs.test.js
    render
      ✓ should render with locals
      ✓ should render with cache
      ✓ should render with layout
      ✓ should render error
    renderString
      ✓ should renderString with data
      ✓ should renderString error
  6 passing (398ms)

覆盖率统计

像 mocha 这类的还要搭配一个代码覆盖率工具。


之前是 istanbuljs,后面作者重写了个 nyc [1] ,它们主要承担 2 个职责:一是把代码进行转译从而插入打桩代码,二是支持各种 Reporter 来生成覆盖率报告。


再后来 V8 内置了覆盖率统计,即无需再转译代码了,原生支持覆盖率数据采集。


然后又是这个作者写了个 c8 [2] 专注于生成覆盖率报告。

Assert 类库

校验变量结果,必不可少的要用到 assert。

历史上出现过:expect.js 、should.js、chai 以及 power-assert,jest 也内置了自己的 expect。

不过现在 Node.js 官方的 assert/strict 其实也还不错。

其中 power-assert 是我们 Egg 一直在用的,我很多年前也安利过:《可能是最好的 JS Assert 库 - 皇帝的新衣》[3]

const assert = require('power-assert');
describe('test/showcase.test.js', () => {
  const arr = [ 1, 2, 3 ];
  it('power-assert', () => {
    assert(arr[1] === 10);
  });
});
// output:
4) test/showcase.test.js power-assert:
      AssertionError:   # test/showcase.test.js:6
  assert(arr[1] === 10)
         |  |   |
         |  2   false
         [1,2,3]
  [number] 10
  => 10
  [number] arr[1]
  => 2

PS:如果要校验文件内容的话,我也写过一个 assert-file [4]

Mock & Stub 类库

因为是单元测试,所以经常会需要模拟环境或下游的响应。

sinonjs 还不错,支持 mock 和 stub 等。jest 同样也内置了自己的 mock 库。

如果是 HTTP 测试的话,nock 很强大,可以帮你 Mock 服务端响应。

nock('http://www.example.com')
  .post('/login', 'username=pgte&password=123456')
  .reply(200, { id: '123ABC' })

不过 Node.js 官方出的 undici 请求库也内置了 Mock 能力。

还有个术语叫 snapshot,即在运行的时候把数据 dump 下来,直接作为下次测试的 mock 数据,能一定程度上提升编写测试的效率。

HTTP 测试类库

测试 HTTP Server 场景,必不可少的就是 supertest 这个库。

describe('GET /users', function() {
  it('responds with json', async function() {
    return request(app)
      .get('/users')
      .set('Accept', 'application/json')
      .expect('Content-Type', /json/)
      .expect(200)
      .then(response => {
        assert(response.body.email, 'foo@bar.com');
      });
  });
});

命令行测试类库

Node.js 的一大使用场景是命令行 CLI,如 Webpack、Babel 这些,它们本身也是需要有单测的。

这块推荐我们写的:

  • GitHub - node-modules/clet: Command Line E2E Testing
  • GitHub - node-modules/coffee: Test command line on Node.js
import { runner, KEYS } from 'clet';
it('should works with boilerplate', async () => {
  await runner()
    .cwd(tmpDir, { init: true })
    .spawn('npm init')
    .stdin(/name:/, 'example') // wait for stdout, then respond
    .stdin(/version:/, new Array(9).fill(KEYS.ENTER))
    .stdout(/"name": "example"/) // validate stdout
    .notStderr(/npm ERR/)
    .file('package.json', { name: 'example', version: '1.0.0' }) // validate file
});

网页自动化测试工具

轻量的爬页面,可以直接用 HTTP 请求库即可,推荐 undici。

模拟浏览器真实执行的话,早期是 Selenium 和 phantomjs。

然后 Google 官方出了 puppeteer,由于有 Chromium 的积累,基于 devtools-protocol 协议,很快就广受欢迎,干掉了前两者。同类的竞品还有 playwright 和 cypress。

移动端 APP 的话,可以试下 macacajs。

持续集成服务

我们写开源的时候,经常需要自动化的持续集成服务来帮我们测试。

这个领域的玩家有:Travis 、Appveyor、GitHub Actions 等。

现在基本上都是用 GitHub Actions 了,集成程度太爽了。




  探讨:单元测试是否有必要?

毋庸置疑,单元测试是非常重要的,它是一名合格的程序员的必要能力和职业素养。

当然,我们也不是原教旨的 100% 覆盖率狂徒,很多情况下需要追求 ROI 的平衡点。

1. 写单元测试很浪费时间?

首先,我先纠正一个常见的错误观点:写单元测试很浪费时间?

实际上,写单元测试反而会节省你的时间,之所以有那个错误的观点,往往之于对比的条件不客观。我们需要考虑二次修改代码后,在同等质量要求的情况下,回归的成本。

真实的时间对比,除了考虑『编写单测的时间』外,容易忽略的是『每次修改代码后回归测试的时间』:

  • 写单测的情况下,回归测试的时间就是敲一下键盘;
  • 而不写单测的情况下,你需要把代码更新到应用中,然后手动模拟各种情况来测试,譬如要打开浏览器,点击很多不同的地方。

这两个耗时如何,一目了然。

无非是 前期投入+维护成本+对回归质量的重视程度,权衡之后的决策,每个公司都有自己的尺度。

当然,我提的很多场景都是 框架类库(包括前端和 Node.js)、服务端应用、命令行工具等方面,确实在一些变化较大的前端偏 UI 展示的应用或者快上快下的活动页面,对应的单测维护成本确实很高,这时候可以基于 ROI 去适当放弃某些非核心分支的单测,这是合理的。

但我们要清楚这是不得已的取舍,而不能去宣称单元测试没什么用。

在前端领域还有一种半自动化回归的测试,就是基于 diff 的方式去自动化对比,然后提醒 Owner 去注意变化影响。这就跟上面那些工具类库一样,都是来帮助减少编写单测的成本的。

2. 单元测试不应该程序员写?

这也是一个错误的观点,单元测试是应该程序员自己来写的,因为是你自己的代码,要为此而负责,这是一种职业素养。任何一个稍微有点规范的团队,提交代码都是需要有 CI 测试的,否则无法 有质量的 Code Review 协作。

测试同学负责的是集成测试、回归测试、端到端测试等更大层面的工作。

分工不同,请不要甩锅。

so...

单元测试很有必要性,编写单测是程序员的基本职业素养,能写尽量写,在个别场景可以根据 ROI 进行取舍。


🔗 相关链接

[1] https://github.com/istanbuljs/nyc

[2] https://github.com/bcoe/c8

[3] https://zhuanlan.zhihu.com/p/25956323

[4] https://www.npmjs.com/package/assert-file


相关文章
|
10月前
|
Web App开发 人工智能 JavaScript
主流自动化测试框架的技术解析与实战指南
本内容深入解析主流测试框架Playwright、Selenium与Cypress的核心架构与适用场景,对比其在SPA测试、CI/CD、跨浏览器兼容性等方面的表现。同时探讨Playwright在AI增强测试、录制回放、企业部署等领域的实战优势,以及Selenium在老旧系统和IE兼容性中的坚守场景。结合六大典型场景,提供技术选型决策指南,并展望AI赋能下的未来测试体系。
|
8月前
|
SQL 安全 Linux
Metasploit Pro 4.22.8-20251014 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.8-20251014 (Linux, Windows) - 专业渗透测试框架
429 1
Metasploit Pro 4.22.8-20251014 (Linux, Windows) - 专业渗透测试框架
|
8月前
|
Linux 网络安全 iOS开发
Metasploit Framework 6.4.95 (macOS, Linux, Windows) - 开源渗透测试框架
Metasploit Framework 6.4.95 (macOS, Linux, Windows) - 开源渗透测试框架
899 1
Metasploit Framework 6.4.95 (macOS, Linux, Windows) - 开源渗透测试框架
|
9月前
|
安全 Linux 网络安全
Metasploit Pro 4.22.8-2025091701 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.8-2025091701 (Linux, Windows) - 专业渗透测试框架
507 2
Metasploit Pro 4.22.8-2025091701 (Linux, Windows) - 专业渗透测试框架
|
9月前
|
Linux 网络安全 iOS开发
Metasploit Framework 6.4.90 (macOS, Linux, Windows) - 开源渗透测试框架
Metasploit Framework 6.4.90 (macOS, Linux, Windows) - 开源渗透测试框架
575 1
Metasploit Framework 6.4.90 (macOS, Linux, Windows) - 开源渗透测试框架
|
9月前
|
安全 Linux 网络安全
Metasploit Framework 6.4.88 (macOS, Linux, Windows) - 开源渗透测试框架
Metasploit Framework 6.4.88 (macOS, Linux, Windows) - 开源渗透测试框架
683 0
|
9月前
|
缓存 安全 Linux
Metasploit Pro 4.22.8-2025082101 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.8-2025082101 (Linux, Windows) - 专业渗透测试框架
318 0
|
11月前
|
Web App开发 开发框架 .NET
Playwright 自动化测试系列(6)| 第三阶段:测试框架集成​指南:参数化测试 + 多浏览器并行执行
Pytest 与 Playwright 集成可提升自动化测试效率,支持参数化测试、多浏览器并行执行及统一报告生成。通过数据驱动、Fixture 管理和并行优化,显著增强测试覆盖率与执行速度,适用于复杂 Web 应用测试场景。
|
10月前
|
SQL 安全 Linux
Metasploit Pro 4.22.8-2025073001 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.8-2025073001 (Linux, Windows) - 专业渗透测试框架
263 0
|
11月前
|
测试技术 API C++
Playwright 自动化测试系列(7)| 第三阶段:测试框架集成​​Page Object 模式
本课程详解Playwright测试框架中的Page Object模式,通过电商登录-下单实战演示PO架构设计与高级技巧,结合Pytest实现多用户测试。重点解析PO模式提升代码复用性、降低维护成本的核心价值,并提供常见问题解决方案,助力构建高可维护性的自动化测试体系。