测试基建
INFO
若你有改进测试体系的想法, 欢迎在我们的 Discord 联系。
在 Oxc,正确性与可靠性被放在极高优先级。
我们投入大量时间加固测试链路,以防止问题传递到下游工具。
Parser
一致性套件
Test262、Babel 以及 TypeScript 的 Parser 测试覆盖了 JS / TS / JSX。
Test262 中纳入所有 stage 4 与正则相关用例。
所有一致性结果记录在快照中以跟踪漂移:
语法错误的输出同样落在快照文件中,便于 diff。
Fuzzing
为了确保 Parser 对随机字节不 panic,我们同时使用三套 fuzz:
- cargo-fuzz:向 Parser 投喂随机字节。
- shift-fuzzer-js (bakkot):产出合法语法树层面的随机源码。
- Automated-Fuzzer:qarmin 持续投递崩溃报告(#issues?q=author:qarmin)。
内存安全
Oxc AST 以及多个中间结构使用基于 bumpalo 的 arena;AST 节点不实现 Drop。 Allocator 编译期校验:若在 arena 中分配 Drop 类型会直接编译失败, 从机制上阻断「Arena + 自建堆对象」组合的泄漏路径。
unsafe 片段
我们会在性能攸关的路径使用 unsafe,但尽量封装在数据结构内部并保持对外 安全 API。 每次 PR 都会对这些 crate 运行 Miri。
Linter
快照诊断
所有 Lint 产物写入 快照目录,用于回放回归:
⚠ typescript-eslint(adjacent-overload-signatures): All "foo" signatures should be adjacent.
╭─[adjacent_overload_signatures.tsx:3:18]
2 │ function foo(s: string);
3 │ function foo(n: number);
· ───
4 │ type bar = number;
5 │ function 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
所有工具均需通过幂等性端到端校验。
范式:
let sourceText = "foo";
let printed = tool(sourceText);
let printed2 = tool(printed);
assert(printed == printed2);例如 Minifier/Formatter 等对同一段输出再次套用工具应不产生差异。
我们会在 Test262/Babel/TypeScript corpus 上对 parser、transformer、minifier 等执行同样的幂等检查。
集成测试优先
我们更偏向集成测试而不是单独覆盖每个函数的内部细节。
codecov 仪表板 会持续展示行覆盖率徽章:
端到端
仓库 monitor-oxc 会针对 npm-high-impact Top 3000 做真实链路测试。
其 package.json 中包含 3000 个形如 "latest" 的依赖条目:
"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 断言语句成功:
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 与我们交流!