Skip to content

测试基建

INFO

若你有改进测试体系的想法, 欢迎在我们的 Discord 联系。

在 Oxc,正确性与可靠性被放在极高优先级。

我们投入大量时间加固测试链路,以防止问题传递到下游工具。

Parser

一致性套件

Test262Babel 以及 TypeScript 的 Parser 测试覆盖了 JS / TS / JSX。

Test262 中纳入所有 stage 4 与正则相关用例。

所有一致性结果记录在快照中以跟踪漂移:

语法错误的输出同样落在快照文件中,便于 diff。

Fuzzing

为了确保 Parser 对随机字节不 panic,我们同时使用三套 fuzz:

  1. cargo-fuzz向 Parser 投喂随机字节
  2. shift-fuzzer-js (bakkot):产出合法语法树层面的随机源码。
  3. Automated-Fuzzerqarmin 持续投递崩溃报告#issues?q=author:qarmin)。

内存安全

Oxc AST 以及多个中间结构使用基于 bumpalo 的 arena;AST 节点不实现 Drop。 Allocator 编译期校验:若在 arena 中分配 Drop 类型会直接编译失败, 从机制上阻断「Arena + 自建堆对象」组合的泄漏路径。

unsafe 片段

我们会在性能攸关的路径使用 unsafe,但尽量封装在数据结构内部并保持对外 安全 API。 每次 PR 都会对这些 crate 运行 Miri

Linter

快照诊断

所有 Lint 产物写入 快照目录,用于回放回归:

javascript
 ⚠ typescript-eslint(adjacent-overload-signatures): All "foo" signatures should be adjacent.
  ╭─[adjacent_overload_signatures.tsx:3:18]
2function foo(s: string);
3function foo(n: number);
  ·                  ───
4type bar = number;
5function foo(sn: string | number) {}
  ·                  ───
6 │       }
  ╰────

Ecosystem CI

oxc-ecosystem-ci 在大型仓库上对 oxlint 冒烟,抓取误报/性能回退/Panic, 覆盖例如:

  • rolldown/rolldown、napi-rs/napi-rs、AFFiNE、Preact、VS Code、BBC Simorgh、Kibana、DefinitelyTyped 等

Idempotency

所有工具均需通过幂等性端到端校验。

范式:

javascript
let sourceText = "foo";
let printed = tool(sourceText);
let printed2 = tool(printed);
assert(printed == printed2);

例如 Minifier/Formatter 等对同一段输出再次套用工具应不产生差异。

我们会在 Test262/Babel/TypeScript corpus 上对 parser、transformer、minifier 等执行同样的幂等检查。

集成测试优先

我们更偏向集成测试而不是单独覆盖每个函数的内部细节。

codecov 仪表板 会持续展示行覆盖率徽章:

Code Coverage

端到端

仓库 monitor-oxc 会针对 npm-high-impact Top 3000 做真实链路测试。

package.json 中包含 3000 个形如 "latest" 的依赖条目:

json
"devDependencies": {
  "@aashutoshrathi/word-wrap": "latest",
  "@actions/http-client": "latest",
  "@adobe/css-tools": "latest",
  "@alloc/quick-lru": "latest",
 ...
  "zip-stream": "latest",
  "zod": "latest",
  "zone.js": "latest",
  "zustand": "latest"
}

再配合 src/dynamic.test.mjs 逐项 import 断言语句成功:

javascript
import test from "node:test";
import assert from "node:assert";
test("@aashutoshrathi/word-wrap", () => import("@aashutoshrathi/word-wrap").then(assert.ok));
test("@actions/http-client", () => import("@actions/http-client").then(assert.ok));
test("@adobe/css-tools", () => import("@adobe/css-tools").then(assert.ok));
test("@alloc/quick-lru", () => import("@alloc/quick-lru").then(assert.ok));
...
test("zod", () => import("zod").then(assert.ok));
test("zone.js", () => import("zone.js").then(assert.ok));
test("zustand", () => import("zustand").then(assert.ok));
test("zwitch", () => import("zwitch").then(assert.ok));

该测试会在 codegen、transformer、minifier 等工具 重写整个 node_modules 之后再执行。

依赖每日滚动更新到最新 semver,至今已揪出多起一致性套件难以触碰的疑难杂症。


若你有进一步提升测试覆盖率或效率的想法, 欢迎同样在 Discord 与我们交流!