测试基础设施
信息
这篇文章作为邀请,用于分享改善我们的测试基础设施的想法,欢迎在 Discord 上联系我们。
在 Oxc 中,正确性和可靠性被极其重视。
我们花费大量时间来加强测试基础设施,以防止问题传播到下游工具中。
解析器
符合性
来自 Test262、Babel 和 TypeScript 的解析器测试用于测试 JavaScript、TypeScript 和 JSX 语法。
对于 Test262,所有第 4 阶段和正则表达式测试都包含在内。
所有符合性结果都存储在用于跟踪更改的快照文件中。
- test262.snap,报告
43765/43765 (100.00%)
。 - babel.snap,报告
2093/2101 (99.62%)
。 - typescript.snap,报告
6470/6479 (99.86%)
。
所有语法错误都写入这些快照文件,用于比较更改。
Fuzzing
为了确保解析器在遇到随机数据时不会发生恐慌,使用三个 fuzzer
- cargo fuzz 用于将随机字节发送给解析器。
- shift-fuzzer-js 由 bakkot 创建,用于生成随机但有效的 AST。
- Automated-Fuzzer 由 qarmin 创建,主动报告 崩溃。
内存安全
oxc 解析器使用 bumpalo
作为其 AST 的内存分配器。没有任何 AST 节点具有 drop
实现。Miri
已用于 确保 AST 节点上没有存储堆分配的数据,这会在分配器删除时导致内存泄漏。
程序检查器
快照诊断
所有程序检查器诊断都会写入 快照文件,以测试回归。
例如
⚠ 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 │ }
╰────
生态系统 CI
oxlint-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 联系我们。