如何在Node.js原生测试运行器中实现类似Jest/Vitest的it.each/describe.each?
在Node.js原生测试运行器中实现类似it.each/describe.each的批量测试
Node.js 原生测试运行器(node:test 模块)并没有内置 it.each 或 describe.each 方法,但可以通过手动循环测试用例数组的方式实现完全等效的批量测试逻辑,以下是具体实现方式:
一、实现类似 it.each 的批量测试用例
直接遍历测试用例数组,为每个用例调用 test() 方法即可,核心是把测试参数、预期结果和测试描述统一放在数组中管理。
代码示例
import { test } from 'node:test'; import assert from 'node:assert'; // 待测试的业务函数 function calculateSum(a, b) { return a + b; } // 批量测试用例:[输入1, 输入2, 预期结果, 测试描述] const sumTestCases = [ [1, 2, 3, '正整数相加结果正确'], [0, 0, 0, '零值相加结果正确'], [-3, 5, 2, '正负整数相加结果正确'], ]; // 遍历生成测试 for (const [num1, num2, expected, desc] of sumTestCases) { test(desc, () => { assert.strictEqual(calculateSum(num1, num2), expected); }); }
这种方式和 Jest/Vitest 的 it.each 逻辑完全一致,所有测试用例可以集中管理,便于维护和扩展。
二、实现类似 describe.each 的批量测试套件
如果需要批量创建测试套件(对应 Jest 的 describe),可以使用 node:test 中的 suite() 方法,循环生成不同的套件,每个套件内部再编写对应测试用例。
代码示例
import { test, suite } from 'node:test'; import assert from 'node:assert'; // 批量套件配置:[套件名称, 运算函数, 该套件下的测试用例] const operationSuites = [ ['加法运算', (a, b) => a + b, [[2, 3, 5], [10, -4, 6]]], ['减法运算', (a, b) => a - b, [[8, 3, 5], [0, 7, -7]]], ]; // 遍历生成测试套件 for (const [suiteName, operation, cases] of operationSuites) { suite(suiteName, () => { // 为每个套件生成测试用例 cases.forEach(([num1, num2, expected], idx) => { test(`用例${idx+1}: ${num1} ${suiteName} ${num2} = ${expected}`, () => { assert.strictEqual(operation(num1, num2), expected); }); }); }); }
运行后会生成两个独立的测试套件,每个套件下包含对应的测试用例,和 describe.each 的效果完全相同。
三、可选封装:简化调用方式
如果频繁使用批量测试,可以封装一个简易的工具函数,让调用更接近 Jest 的语法风格:
import { test } from 'node:test'; import assert from 'node:assert'; // 封装eachTest工具 function eachTest(testCases) { return { run: (titleTemplate, testFn) => { testCases.forEach((args, index) => { // 生成测试标题:支持模板字符串或函数 const testTitle = typeof titleTemplate === 'function' ? titleTemplate(...args, index) : titleTemplate.replace(/%s/g, (_, i) => args[i]); test(testTitle, () => testFn(...args)); }); } }; } // 使用示例 function multiply(a, b) { return a * b; } eachTest([ [2, 3, 6], [4, 0, 0], [-2, -3, 6] ]).run('%s × %s 应该等于 %s', (a, b, expected) => { assert.strictEqual(multiply(a, b), expected); });
这个封装可以让批量测试的写法更简洁,根据自己的项目需求调整即可。
内容的提问来源于stack exchange,提问作者Raz Luvaton
相关产品推荐
相关产品推荐

