- NodeJs的介绍及使用
- Node.js核心模块概览
- NodeJs-Assertion Testing
- NodeJs-Asynchronous Context Tracking
- NodeJs-async_hooks
- NodeJs-Buffer
- Node.js- C++ Addons
- Node.js-C++ Addons Node-API
- NodeJs-C++ Embedder API
- Node.js-Child Process
- NodeJs-Cluster
- Node.js-命令行选项
- Node.js-Console
- Node.js-Corepack
- Node.js-Crypto
- NodeJs-Debugger
- NodeJs-Diagnostics Channel
- NodeJs-DNS
- NodeJs-Domain
- NodeJs-Errors
- NodeJs-Events
- NodeJs-File system(一)
- NodeJs-File system(二)
- NodeJs-File system(三)
- NodeJs-Globals
- NodeJs-HTTP
- NodeJs-HTTP/2
- NodeJs-HTTPS
- NodeJs-Inspector
- NodeJs-Internationalization
- NodeJs-Modules CommonJS modules、ECMAScript modules、node:module、Packages、TypeScript
- NodeJs-Net
- NodeJs-OS
- NodeJs-path
- NodeJs-Performance Hooks
- NodeJs-Permissions
- NodeJs-process
- NodeJs-punycode
- Node.js-querystring
- NodeJs-Readline
- NodeJs-REPL
- NodeJs-Report
- NodeJs-Single Executable Applications
- NodeJs-SQLite
- NodeJs-Stream
- NodeJs-String Decoder
- NodeJs-Test runner
- NodeJs-Timers
- NodeJs-TLS/SSL
- NodeJs-Trace events
- NodeJs-TTY
- NodeJs-UDP/datagram
- NodeJs-URL
- NodeJs-Utilities
- NodeJs-V8
- NodeJs-VM
- NodeJs-WASI
- NodeJs-Web Crypto API
- NodeJs Web Streams API
- NodeJs Worker threads
- NodeJs-Zlib
- NodeJs-Single Executable Applications
NodeJs-Test runner
class Test runnerNode.js
中的 Test Runner
模块自 v18.0.0
引入,目的是为开发者提供一个内置的、简单的测试工具,减少对第三方测试框架(如 Mocha
、Jest
)的依赖。这个模块让你可以使用类似 describe
、it
这样的函数编写测试,执行测试用例,并检查测试结果。
1. 模块引用
在 Node.js 中使用 test
模块非常简单。可以通过内置的 test
模块导入使用:
import { test, describe, it } from 'node:test';
或者使用 CommonJS:
const { test, describe, it } = require('node:test');
2. Test Runner
模块核心概念
2.1 测试块 test()
test()
函数用于定义测试用例。你可以为每个测试定义标题,并提供异步或同步的测试逻辑。测试可以是独立的,也可以是嵌套的。
test('basic test', () => {
// Test logic here
});
参数:
name
:{string} 测试的描述性名称。fn
:{Function} 测试逻辑的回调函数,可以是同步的或异步的。
示例:
import { test } from 'node:test';
import assert from 'node:assert';
test('synchronous test', () => {
assert.strictEqual(1 + 1, 2);
});
test('asynchronous test', async () => {
const result = await Promise.resolve(2);
assert.strictEqual(result, 2);
});
2.2 测试套件 describe()
describe()
函数用于将多个相关的测试分组。它有助于组织和管理复杂的测试用例。
describe('Math operations', () => {
test('Addition', () => {
// Test for addition
});
test('Subtraction', () => {
// Test for subtraction
});
});
参数:
name
:{string} 测试组的描述性名称。fn
:{Function} 包含多个测试的回调函数。
示例:
import { describe, it } from 'node:test';
import assert from 'node:assert';
describe('Array operations', () => {
it('should add an item to the array', () => {
const arr = [];
arr.push(1);
assert.strictEqual(arr.length, 1);
});
it('should remove an item from the array', () => {
const arr = [1];
arr.pop();
assert.strictEqual(arr.length, 0);
});
});
2.3 钩子函数 before()
, after()
, beforeEach()
, afterEach()
Test Runner
提供了钩子函数,用于在测试前或测试后执行一些预备或清理工作:
before(fn)
:在所有测试开始前执行。after(fn)
:在所有测试结束后执行。beforeEach(fn)
:在每个测试之前执行。afterEach(fn)
:在每个测试之后执行。
示例:
import { describe, it, before, after, beforeEach, afterEach } from 'node:test';
import assert from 'node:assert';
let count = 0;
describe('Counter', () => {
before(() => {
console.log('Before all tests');
});
after(() => {
console.log('After all tests');
});
beforeEach(() => {
count = 0;
console.log('Before each test');
});
afterEach(() => {
console.log('After each test');
});
it('should start with zero', () => {
assert.strictEqual(count, 0);
});
it('should increment count', () => {
count++;
assert.strictEqual(count, 1);
});
});
3. 异步测试
Node.js Test Runner
支持异步测试,允许你在测试函数中使用 async
和 await
,并且也可以返回 Promise
来表示异步操作。
test('async test', async () => {
const result = await someAsyncFunction();
assert.strictEqual(result, expected);
});
你还可以使用 test.skip()
跳过特定的测试,或使用 test.only()
仅运行特定的测试。
test.skip('this test will be skipped', () => {
// Skipped test logic
});
test.only('this is the only test that will run', () => {
// Only this test will run
});
4. 测试超时
可以为每个测试设置超时时间。如果测试执行时间超过了这个时间,测试会被标记为失败。
test('test with timeout', { timeout: 1000 }, () => {
// Test logic that must finish within 1000ms
});
5. 子测试
子测试允许你在一个测试中嵌套多个子测试,方便处理分步操作。
test('parent test', async (t) => {
await t.test('sub test 1', () => {
// Sub test 1 logic
});
await t.test('sub test 2', () => {
// Sub test 2 logic
});
});
6. 测试选项
你可以传递选项对象给 test()
函数,以控制测试行为:
timeout
:设置测试的超时时间(毫秒)。only
:仅运行此测试。skip
:跳过此测试。
test('timeout test', { timeout: 500 }, async () => {
// Test logic here
});
7. 断言
虽然 Test Runner
自身不带断言库,但你可以使用 Node.js 内置的 assert
模块进行断言。assert
提供了多种方法来验证值是否符合预期。
import { test } from 'node:test';
import assert from 'node:assert';
test('assert example', () => {
assert.strictEqual(1 + 1, 2); // 成功
assert.strictEqual(1 + 1, 3); // 失败
});
8. 异常处理
如果测试函数中抛出异常,测试将自动失败。你可以使用 try-catch 来捕获并处理异常,但在大多数情况下,这不是必需的。
test('throw error test', () => {
throw new Error('This will fail the test');
});
9. 测试结果报告
默认情况下,Test Runner
将测试结果打印到控制台,包括每个测试的通过、失败、跳过状态。你也可以自定义报告结果的输出形式。
10. 总结
Node.js Test Runner
模块是一个简单易用的工具,适合进行基础的单元测试。它提供了核心的测试功能,如测试块、测试套件、钩子函数、异步支持等,方便开发者进行高效的测试。通过内置的断言模块 assert
,可以直接编写测试用例并验证结果。对于更复杂的测试场景,可能仍然需要第三方测试工具,但 Test Runner
是 Node.js 自带的一个轻量级选择,尤其适合小型项目或基础测试需求。
如果你对第三方依赖有顾虑,或者只是想进行简单的测试,Test Runner
是一个不错的选择。