X.D 笔记X.D 笔记

Node 原生测试模块及tsest

Node 原生测试模块及tsest

Node 原生测试模块 node:test

NodeJS 从 16 开始自带测试模块,包括了node:testnode: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 源码 , 弥补部分不足,主要特性:

  1. 零配置,速度快
  2. 完全使用原生测试语法
  3. 从名字可看出,主要为 TypeScript 项目设计,支持ts/js
  4. 支持自定义过滤
  5. 提供与原生API同样的批量测试API
  6. 支持 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)。

如果没有什么高端要求,使用原生的测试模块测试,速度快,无依赖,还可以做到零配置。

工具写的比较简陋,后续会完善一些常用工具。

如果不满足要求,可以自行获取 代码修改,代码量少,易修改。