NodeJs-Test runner

class Test runner

Node.js 中的 Test Runner 模块自 v18.0.0 引入,目的是为开发者提供一个内置的、简单的测试工具,减少对第三方测试框架(如 MochaJest)的依赖。这个模块让你可以使用类似 describeit 这样的函数编写测试,执行测试用例,并检查测试结果。

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 支持异步测试,允许你在测试函数中使用 asyncawait,并且也可以返回 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 是一个不错的选择。

评论区
评论列表
menu