一、概念
- Node.js
assert
:轻量级断言库,直接内置于 Node.js。 - Mocha + Chai:经典组合,Mocha 提供测试运行器,Chai 提供断言语法。
- Jest:开箱即用的全能测试框架,内置断言、Mock、覆盖率。
- Vitest:新一代测试框架,兼容 Jest API,运行速度快。
二、原理
assert
:基于函数调用检查值,失败就抛AssertionError
。- Chai:提供多样化的链式断言语法(BDD 风格)。
- Jest/Vitest:提供类似的
expect
API,并扩展 Mock / Snapshot / 异步测试。
三、对比
assert
:轻便,但功能少。- Mocha+Chai:可定制,生态大。
- Jest:集成度最高,报错提示最好。
- Vitest:现代化、快、兼容 Jest。
四、实践示例
假设我们有一个函数 sum
:
bash
function sum(a, b) {
return a + b;
}
module.exports = sum;
1. 使用 Node.js assert
dart
// test-assert.js
const assert = require('node:assert/strict');
const sum = require('./sum');
// 基本断言
assert.strictEqual(sum(2, 3), 5); // ✅
// 错误示例
assert.strictEqual(sum(2, 3), '5'); // ❌ AssertionError
运行:
java
node test-assert.js
2. 使用 Mocha + Chai
安装:
css
npm install mocha chai --save-dev
测试文件:
scss
// test/sum.test.js
const { expect } = require('chai');
const sum = require('../sum');
describe('sum 函数', () => {
it('两个数字相加', () => {
expect(sum(2, 3)).to.equal(5);
});
it('返回值类型是 number', () => {
expect(sum(2, 3)).to.be.a('number');
});
});
运行:
npx mocha
3. 使用 Jest
安装:
css
npm install jest --save-dev
测试文件:
scss
// sum.test.js
const sum = require('./sum');
test('两个数字相加', () => {
expect(sum(2, 3)).toBe(5);
});
test('返回值类型是 number', () => {
expect(typeof sum(2, 3)).toBe('number');
});
运行:
npx jest
4. 使用 Vitest
安装:
css
npm install vitest --save-dev
测试文件:
javascript
// sum.test.js
import { describe, it, expect } from 'vitest';
import sum from './sum.js';
describe('sum 函数', () => {
it('两个数字相加', () => {
expect(sum(2, 3)).toBe(5);
});
it('返回值类型是 number', () => {
expect(typeof sum(2, 3)).toBe('number');
});
});
运行:
npx vitest
五、拓展
-
异步测试
- Jest / Vitest 内置异步支持:
scsstest('异步加法', async () => { const asyncSum = (a, b) => Promise.resolve(a + b); await expect(asyncSum(2, 3)).resolves.toBe(5); });
- Mocha 通过
done
或async/await
支持:
scssit('异步加法', async () => { const asyncSum = (a, b) => Promise.resolve(a + b); const result = await asyncSum(2, 3); expect(result).to.equal(5); });
-
Mock 函数
- Jest / Vitest:
scsstest('调用回调函数', () => { const callback = jest.fn(); sum(1, 2); callback(); expect(callback).toHaveBeenCalled(); });
- Mocha/Chai 需要配合 Sinon。
六、潜在问题
- assert:适合小脚本,不适合复杂测试。
- Mocha:配置多,需要额外库。
- Jest:强大但稍显笨重,适合大型项目。
- Vitest:快,但生态不如 Jest 完善。
✅ 总结:
- 快速检查 →
assert
- 灵活可定制 → Mocha + Chai
- 主流全能 → Jest
- 现代高效 → Vitest