Node.js 原生测试(node:test)
Node.js 18+ 内置测试模块,无需安装 Jest/Mocha。
基本语法
js
import test from 'node:test'
import assert from 'node:assert/strict'
test('加法测试', () => {
assert.equal(1 + 1, 2)
})
test('异步测试', async () => {
const result = await fetchData()
assert.ok(result)
})分组(describe / it 风格)
js
import { describe, it } from 'node:test'
describe('用户模块', () => {
it('用户创建', () => {
const user = createUser('xiaoming')
assert.equal(user.name, 'xiaoming')
})
it('邮箱验证', () => {
assert.throws(() => validateEmail('invalid'), /格式错误/)
})
})断言方法
js
import assert from 'node:assert/strict'
assert.equal(a, b) // ==
assert.strictEqual(a, b) // === (推荐)
assert.deepEqual(obj1, obj2) // 深度比较
assert.ok(value) // 真值
assert.throws(() => fn()) // 期望抛出异常
assert.rejects(promise) // 期望 Promise reject
assert.match(str, /reg/) // 正则匹配钩子函数
js
import { describe, it, before, after, beforeEach } from 'node:test'
describe('DB 相关测试', () => {
before(async () => await db.connect()) // 所有测试前
after(async () => await db.close()) // 所有测试后
beforeEach(async () => await db.reset()) // 每个测试前
it('查询用户', async () => {
const users = await db.query('SELECT * FROM users')
assert.ok(Array.isArray(users))
})
})Mock(模拟)
js
import { mock } from 'node:test'
// mock 函数
const fn = mock.fn(() => 'mocked')
fn()
assert.equal(fn.mock.callCount(), 1)
assert.equal(fn.mock.calls[0].result, 'mocked')
// mock 模块
mock.method(console, 'log', () => {})
console.log('不会输出') // 被拦截
mock.reset() // 恢复覆盖率
bash
node --test --experimental-test-coverage test/*.test.js运行
bash
node --test # 运行所有 *_test.js / test*.js
node --test test/user.test.js # 指定文件
node --test --watch # 监听模式与 Jest 对比
| node:test | Jest | |
|---|---|---|
| 安装 | 内置 | npm install |
| Mock | 基础 mock | 自动 mock + spy |
| 快照 | 不支持 | 内置 |
| 并行 | 默认并行 | 默认串行(可配置) |
| 适用 | 简单项目/轻量测试 | 大型项目/复杂场景 |