单元测试是一种在代码层面对软件进行测试的技术,目的是检测代码中的问题和错误。

它通常是自动化的,并且针对一个单独的函数、方法或模块进行测试。

单元测试可以帮助开发人员更快地发现问题,提高代码质量。

本节会介绍一下 Node.js 中如何做单元测试,包含 Node 内置的测试模块和第三方测试框架介绍。

1 Node 内置模块

1.1 Assert

assert 模块是 Node.js 的一个内置模块,提供了一组函数用于进行断言。

下面是使用示例。

```js const assert = require('assert')

assert.ok(1 === 1, '1等于1') // 不会抛出错误 assert.ok(1 === 2, '1不等于2') // 会抛出 AssertionError 错误,错误信息为 '1不等于2'

assert.equal(1, 1, '1等于1') // 不会抛出错误 assert.equal(1, 2, '1不等于2') // 会抛出 AssertionError 错误,错误信息为 '1不等于2'

assert.deepEqual({ a: 1, b: 2 }, { a: 1, b: 2 }, '两个对象相等') // 不会抛出错误 assert.deepEqual({ a: 1, b: 2 }, { a: 1, b: 3 }, '两个对象不相等') // 会抛出 AssertionError 错误,错误信息为 '两个对象不相等' ```

如果有不符合条件的会直接抛出错误,阻塞后面代码运行,方式还相对原始,不方便规模性的测试使用。

当然上面只演示了一小部分 API,更多 API 移步文档查看。

1.2 Test runner

Node 内置 test 模块,可以配合 assert 使用,能够覆盖常见测试场景。

这里必须引入 node:test 否则不生效

文件命名建议使用 [name].test.js 或者 [name].test.mjs

```js import test from 'node:test' import assert from 'assert'

test('1等于1', () => { // This test passes because it does not throw an exception. assert.strictEqual(1, 1) })

test('两个对象相等', () => { assert.deepStrictEqual({ a: 1, b: 2 }, { a: 1, b: 2 }) })

test('1不等于2', () => { assert.ok(1 === 2) }) ```

运行使用 --test 参数,后面可以跟上多个文件或者目录。

```sh node --test test-runner/

node --test file.js file2.js dir3/

```

更多用法建议阅读官方文档

2 第三方测试框架

这部分简单介绍一下社区中流行的测试框架。

2.1 Vitest

Vitest 是当下最流行的测试框架之一。

Vite 提供支持的极速单元测试框架

这里使用官方的 Basic:Demo 演示一下

① 安装依赖

```sh

这里使用了pnpm这个包管理工具

pnpm add @vitest/ui vite vitest ```

② 添加 npm scrips

json { "scripts": { "test": "vitest", "test:ui": "vitest --ui", "test:run": "vitest run" } }

③ 添加测试文件 basic.test.js

```js import { assert, expect, test } from 'vitest';

test('Math.sqrt()', () => { expect(Math.sqrt(4)).toBe(2); expect(Math.sqrt(144)).toBe(12); expect(Math.sqrt(2)).toBe(Math.SQRT2); });

test('JSON', () => { const input = { foo: 'hello', bar: 'world', };

const output = JSON.stringify(input);

expect(output).eq('{"foo":"hello","bar":"world"}'); assert.deepEqual(JSON.parse(output), input, 'matches original'); }); ```

④ 运行测试

终端中运行,

sh npm run test

带 UI 页面。

sh npm run test:ui

2.2 其它测试框架

除了 vitest 之外,还有其它老牌的,如 JestMocha 等。

功能大同小异,这里不过多展开,感兴趣的同学可查阅相关文档了解。

推荐阅读 Vitest 与其它测试框架对比

小结

本节先简单介绍了一下单元测试的概念,接着重点介绍如何在 Node.js 中编写单元测试,大体分为如下两类:

通过编写单元测试可以帮助开发人员更快地发现问题,及时的发现风险的变更代码,提高代码整体的质量。