单元测试是一种在代码层面对软件进行测试的技术,目的是检测代码中的问题和错误。
它通常是自动化的,并且针对一个单独的函数、方法或模块进行测试。
单元测试可以帮助开发人员更快地发现问题,提高代码质量。
本节会介绍一下 Node.js 中如何做单元测试,包含 Node 内置的测试模块和第三方测试框架介绍。
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 移步文档查看。
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/
```
更多用法建议阅读官方文档。
这部分简单介绍一下社区中流行的测试框架。
Vitest 是当下最流行的测试框架之一。
由 Vite 提供支持的极速单元测试框架
① 安装依赖
```sh
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
除了 vitest 之外,还有其它老牌的,如 Jest,Mocha 等。
功能大同小异,这里不过多展开,感兴趣的同学可查阅相关文档了解。
推荐阅读 Vitest 与其它测试框架对比。
本节先简单介绍了一下单元测试的概念,接着重点介绍如何在 Node.js 中编写单元测试,大体分为如下两类:
assert
、test
;Vitest
、Jest
、Mocha
等。通过编写单元测试可以帮助开发人员更快地发现问题,及时的发现风险的变更代码,提高代码整体的质量。