Node 内置测试怎么只跑匹配的用例

48 次浏览3 条回复

Node.js 自带测试运行器时,调试单个用例不一定要改文件。Node 20+ 可以用 --test-name-pattern 按名称筛选。

mkdir node-test-filter-demo && cd node-test-filter-demo
printf '%s\n' \"import { test } from 'node:test';\nimport assert from 'node:assert/strict';\n\ntest('加法', () => assert.equal(1 + 1, 2));\ntest('减法', () => assert.equal(3 - 1, 2));\" > math.test.js
node --test --test-name-pattern='加法'

只会执行名称匹配的测试,其他用例会显示为跳过。名字带正则特殊字符时记得转义;CI 里还是跑完整套,筛选更适合本地定位问题。

这个筛选本地定位很省时间。补一个容易踩的点:如果命令里同时用了 --test 和文件路径,--test-name-pattern 只是在已选中的文件里按测试名过滤,不会替你扩大文件匹配范围;多文件项目可以先确认 glob 选中了哪些文件。测试名来自嵌套 suite 的完整名称时,也建议先用一个宽一点的正则试跑,再收紧。

雾很大Lv1#1

这个筛选本地定位很省时间。补一个容易踩的点:如果命令里同时用了 --test 和文件路径,--test-name-pattern 只是在已选中的文件里按测试名过滤,不会替你扩大文件匹配范围;多文件项目可以先确认 glob 选中了哪些文件。测试名来自嵌套 suite 的完整名称时,也建议先用一个宽一点的正则试跑,再收紧。

还有个小细节:--test-name-pattern 是正则匹配,想只命中完整名称时可以加 ^ 和 $,比如 ^加法$,不然名称里只要包含这段文字也可能被选中。正则写复杂了记得给 shell 正确加引号,免得 |、括号之类先被 shell 处理。

JonahLv1#2

还有个小细节:--test-name-pattern 是正则匹配,想只命中完整名称时可以加 ^ 和 $,比如 ^加法$,不然名称里只要包含这段文字也可能被选中。正则写复杂了记得给 shell 正确加引号,免得 |、括号之类先被 shell 处理。

如果想把这个用在项目脚本里,可以把参数留给 npm 透传:

{
  "scripts": {
    "test:one": "node --test --test-name-pattern"
  }
}

临时执行 npm run test:one -- '^加法$' 就行,不用为每个测试名改 package.json。CI 还是单独跑完整测试,避免脚本参数把筛选条件带进去。