Node 原生测试模块及tsest
Node 原生测试模块 node:test
NodeJS 从 16 开始自带测试模块,包括了node:test和node:assert相对于比较主流的 jest
, mocha
等,好处是简单、轻量级,不需要安装额外的依赖,重要是速度飞快!
原生测试模块比较简单,但测试框架应该有的 断言 assert
Report
Promise
等 都已经完备,而且支持 Watch 模式,一个简单的测试用例,写法如下:
// 说明:使用node自带模块,写法为 node:
// 即 `node:test` `node:assert`,不能写成 'test','assert'
const assert = require('node:assert');
function add(a, b) {
return a + b;
}
// 测试add函数
assert.equal(add(2, 3), 5); // 断言add(2, 3)的结果等于5
assert.equal(add(0, 0), 0); // 断言add(0, 0)的结果等于0
assert.equal(add(-1, 1), 0); // 断言add(-1, 1)的结果等于0
前端需要什么测试?
此处发表一个个人观点:个人认为 99% 的前端业务页面测试都是没必要的,前端测试都喜欢使用的 Headless
, Browser Driver
, React/Vue Environment
, JSDom
等技术,在单元测试层面上,完全没有必要。
当然业务页面没有测试的必要,并不是说前端不需要测试,很多团队可能把路走歪,浪费大量时间在测试页面上面,若是抛除以上测试,可以发现:前端的测试和后端测试基本上就是一模一样!
现在大部分前端库都不强制依赖window 变量
了,受益于 ES 规范,我们常用的 API 在node运行时
上都表现一致,前端需要测试的部分为一些通用方法,逻辑流程等,根本不需要浏览器环境。(当然有个前提是代码写的符合范式,不能写屎山)
当把不需要的dependencies
清除的时候,发现使用node:test
已经完全够用,测试可以一个依赖都没有,不需要那么复杂。
tsest 工具
当然,node:test
其实是有点过于简陋的,平时测试时,需要使用 文件名过滤
,e2e
等并不方便,提供的API也不如第三方丰富。
针对这些不方便的地方,我自己做了一个简单的启动器:tsest 源码 , 弥补部分不足,主要特性:
- 零配置,速度快
- 完全使用原生测试语法
- 从名字可看出,主要为 TypeScript 项目设计,支持ts/js
- 支持自定义过滤
- 提供与原生API同样的批量测试API
- 支持 Watch 模式
使用方式
1、安装
npm install --save-dev tsest
# 说明:如果 TypeScript 项目,则需要安装 ts-node
npm install --save-dev typescript ts-node
2、脚本配置
// package.json
scripts : {
+ "test": "node -r ts-node/register node_modules/tsest/run",
+ "watch":"node -r ts-node/register node_modules/tsest/run --watch"
}
3、写用例
import { test } from 'node:test';
// export sum = (a:number,b:number)=> a + b;
import { sum } from './mylib';
import assert from 'node:assert';
test('test case',()=>{
assert.strictEqual(sum(1,2), 3);
});
4、运行
npm test
node node_modules/tsest/run
Strat Run Mode
✔ test case (0.1203ms)
ℹ tests 1
ℹ suites 0
ℹ pass 1
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 0.0672
npm run watch
node node_modules/tsest/run --watch
Start Watch Mode
✔ test case (0.0956ms)
# 说明: Watch 模式时,文件每次变动,都会自动运行
高级技巧
使用 swc
加速 TypeScript 编译
TypeScript
项目运行时,实际使用 ts-node
运行编译,由于默认的编译器较慢,电脑配置不太好时可能感受不到测试秒启动的快感。
可以开启 SWC
来加速,效果非常明显,完全感受不出有编译这个阶段,启动方式
1、安装 SWC
npm install --save-dev @swc/core @swc/helpers regenerator-runtime
2、修改tsconfig.json
"ts-node": {
+ "swc": true
}
3、开启成功
再次执行 npm test
感受一下速度吧!
说明一下,开启后可能报错 ,由于 ts-node 有使用一个过期swc函数,至本文发布时仍未解决。
暂时处理方法固定版本 @swc/core:1.3.82 , 静待 ts-node 更新即可。
添加启动参数
tsest
支持启动参数,使用--param=xxx
定义,目前支持的启动参数如下:
参数 | 说明 | 默认 |
---|---|---|
--root | 测试代码根目录 | 检测 './src' 是否存在,不存在则为 './' |
--suffix | 测试文件后缀 | ts项目为 .test.ts ,js项目为 test.js ,根据是否注册 ts-node判定 |
--testName | 测试用例名称过滤 | - |
--fileName | 代码文件名称过滤 | - |
--timeout | 超时时间(ms) | 150000 |
例如:若将超时改为 1秒 可以修改
{
- "test": "node node_modules/tsest/run",
+ "test": "node node_modules/tsest/run --timeout=1000",
}
使用批量 API
用第三方框架写测试用例时,提供了了一些很方便的 API ,有些在node:test
中并未提供,一个常见的就是数据集,所以我扩展了一个批量测试,包括测试与断言,可简化代码
import { testEqualBatch, equalBatch, test } from 'tsest'
import { formatUSD } from './Format'
// 以下两个方法等同效果
// 使用批量测试
testEqualBatch(formatUSD, [
[932132187, '932,132,18'],
[123, '123'],
[112212234.121, '112,212,234'],
[[12345.67892, true], '12,345.68'],
[[12345.67892, 1], '12,345.7'],
[[12345.67892, 2], '12,345.68'],
[[12345.67892, 3], '12,345.679'],
[[12345.67892, 4], '12,345.6789'],
[[12345.67892, 10], '12,345.6789200000'],
[[-12345.67892, 3], '-12,345.679'],
])
// 使用 test 测试,并使用批量断言
// test/assert 为直接从 node:test/assert 模块导出
test('test formatUSD',()=>{
equalBatch(formatUSD, [
[932132187, '932,132,18'],
[123, '123'],
[112212234.121, '112,212,234'],
[[12345.67892, true], '12,345.68'],
[[12345.67892, 1], '12,345.7'],
[[12345.67892, 2], '12,345.68'],
[[12345.67892, 3], '12,345.679'],
[[12345.67892, 4], '12,345.6789'],
[[12345.67892, 10], '12,345.6789200000'],
[[-12345.67892, 3], '-12,345.679'],
])
})
写在最后
目前实际使用node测试模块过程中,存在一些小BUG,目前在可接受范围内(推荐使用最新版本node)。
如果没有什么高端要求,使用原生的测试模块测试,速度快,无依赖,还可以做到零配置。
工具写的比较简陋,后续会完善一些常用工具。
如果不满足要求,可以自行获取 代码修改,代码量少,易修改。