Skip to content

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:testJest
安装内置npm install
Mock基础 mock自动 mock + spy
快照不支持内置
并行默认并行默认串行(可配置)
适用简单项目/轻量测试大型项目/复杂场景