测试基础设施
INFO
本文旨在邀请大家提出改进我们测试基础设施的建议,欢迎在 Discord 上与我们联系。
在 Oxc 中,正确性和可靠性被高度重视。
我们投入大量时间强化测试基础设施,以防止问题传播到下游工具中。
解析器
一致性测试
使用来自 Test262、Babel 以及 TypeScript 的解析器测试来验证 JavaScript、TypeScript 及 JSX 语法。
对于 Test262,包含所有第 4 阶段和正则表达式测试。
所有一致性测试结果均存储在快照文件中,用于追踪变更:
所有语法错误都会写入这些快照文件,以便对比变更。
模糊测试(Fuzzing)
为确保解析器在遇到随机数据时不会崩溃,使用了三个模糊测试工具:
- cargo fuzz,用于向解析器发送随机字节 源码。
- shift-fuzzer-js,由 bakkot 开发,用于生成随机但合法的 AST。
- Automated-Fuzzer,由 qarmin 编写,会 主动报告 崩溃问题。
内存安全性
Oxc 使用基于 bumpalo 的区域分配器作为其 AST 及其他数据结构的内存分配器。
所有 AST 节点类型均不实现 Drop。
这一限制通过 Oxc 的分配器在编译时强制执行:如果任何代码尝试在区域中分配实现了 Drop 的类型,将导致编译错误。
这从静态上确保了拥有堆分配数据的类型无法存储在区域中,从而避免内存泄漏。
不安全代码
为了性能优化,Oxc 使用了 unsafe 代码。我们力求将 unsafe 限制在自包含的数据结构内,并对外提供安全的 API。
每次提交请求(PR)时,都会对包含这些结构的 crate 运行 Miri 检查。
代码检查器(Linter)
快照诊断
所有代码检查器的诊断信息都会写入 快照文件,用于检测回归问题。
例如:
⚠ typescript-eslint(adjacent-overload-signatures): 所有 "foo" 签名应相邻。
╭─[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 │ }
╰────生态系统持续集成(CI)
oxc-ecosystem-ci 会针对大型仓库运行 oxlint,以检查误报、回归问题及崩溃情况。
被测试的仓库包括:
- rolldown/rolldown
- napi-rs/napi-rs
- toeverything/affine
- preactjs/preact
- microsoft/vscode
- bbc/simorgh
- elastic/kibana
- DefinitelyTyped/DefinitelyTyped
幂等性测试
幂等性测试用于所有工具的集成测试和端到端测试。
一个幂等性测试遵循以下流程:
let sourceText = "foo";
let printed = tool(sourceText);
let printed2 = tool(printed);
assert(printed == printed2);例如,对一段代码进行幂等压缩应得到相同结果。
所有工具(解析器、转换器、压缩器等)都在 Test262、Babel 及 TypeScript 测试文件上进行了幂等性测试。
集成测试
优先使用集成测试而非单元测试。
codecov 当前报告的 行覆盖率。
端到端测试
仓库 monitor-oxc 对 npm-high-impact 提供的前 3000 个 npm 包执行端到端测试。
其 package.json 包含 3000 个依赖项:
"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 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));该测试文件在每个工具(代码生成器、转换器、压缩器等)重写 node_modules 中所有文件后运行。
这些包每日更新至最新版本。
该配置已发现多个常规一致性测试套件遗漏的隐蔽问题。
如果您有任何关于如何改进我们测试基础设施的想法,
欢迎在 Discord 上与我们联系。
