Skip to content

测试基础设施

INFO

本文旨在邀请大家提出改进我们测试基础设施的建议,欢迎在 Discord 上与我们联系。

在 Oxc 中,正确性和可靠性被高度重视。

我们投入大量时间强化测试基础设施,以防止问题传播到下游工具中。

解析器

一致性测试

使用来自 Test262Babel 以及 TypeScript 的解析器测试来验证 JavaScript、TypeScript 及 JSX 语法。

对于 Test262,包含所有第 4 阶段和正则表达式测试。

所有一致性测试结果均存储在快照文件中,用于追踪变更:

所有语法错误都会写入这些快照文件,以便对比变更。

模糊测试(Fuzzing)

为确保解析器在遇到随机数据时不会崩溃,使用了三个模糊测试工具:

  1. cargo fuzz,用于向解析器发送随机字节 源码
  2. shift-fuzzer-js,由 bakkot 开发,用于生成随机但合法的 AST。
  3. Automated-Fuzzer,由 qarmin 编写,会 主动报告 崩溃问题。

内存安全性

Oxc 使用基于 bumpalo 的区域分配器作为其 AST 及其他数据结构的内存分配器。
所有 AST 节点类型均不实现 Drop
这一限制通过 Oxc 的分配器在编译时强制执行:如果任何代码尝试在区域中分配实现了 Drop 的类型,将导致编译错误。
这从静态上确保了拥有堆分配数据的类型无法存储在区域中,从而避免内存泄漏。

不安全代码

为了性能优化,Oxc 使用了 unsafe 代码。我们力求将 unsafe 限制在自包含的数据结构内,并对外提供安全的 API。
每次提交请求(PR)时,都会对包含这些结构的 crate 运行 Miri 检查

代码检查器(Linter)

快照诊断

所有代码检查器的诊断信息都会写入 快照文件,用于检测回归问题。

例如:

javascript
 ⚠ typescript-eslint(adjacent-overload-signatures): 所有 "foo" 签名应相邻。
  ╭─[adjacent_overload_signatures.tsx:3:18]
2function foo(s: string);
3function foo(n: number);
  ·                  ───
4type bar = number;
5function foo(sn: string | number) {}
  ·                  ───
6 │       }
  ╰────

生态系统持续集成(CI)

oxc-ecosystem-ci 会针对大型仓库运行 oxlint,以检查误报、回归问题及崩溃情况。
被测试的仓库包括:

幂等性测试

幂等性测试用于所有工具的集成测试和端到端测试。

一个幂等性测试遵循以下流程:

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

例如,对一段代码进行幂等压缩应得到相同结果。

所有工具(解析器、转换器、压缩器等)都在 Test262、Babel 及 TypeScript 测试文件上进行了幂等性测试。

集成测试

优先使用集成测试而非单元测试。

codecov 当前报告的 代码覆盖率 行覆盖率。

端到端测试

仓库 monitor-oxcnpm-high-impact 提供的前 3000 个 npm 包执行端到端测试。

package.json 包含 3000 个依赖项:

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

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));

该测试文件在每个工具(代码生成器、转换器、压缩器等)重写 node_modules 中所有文件后运行。

这些包每日更新至最新版本。

该配置已发现多个常规一致性测试套件遗漏的隐蔽问题。


如果您有任何关于如何改进我们测试基础设施的想法,
欢迎在 Discord 上与我们联系。