跳到正文

测试基础设施

信息

这篇文章作为邀请,用于分享改善我们的测试基础设施的想法,欢迎在 Discord 上联系我们。

在 Oxc 中,正确性和可靠性被极其重视。

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

解析器

符合性

来自 Test262BabelTypeScript 的解析器测试用于测试 JavaScript、TypeScript 和 JSX 语法。

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

所有符合性结果都存储在用于跟踪更改的快照文件中。

所有语法错误都写入这些快照文件,用于比较更改。

Fuzzing

为了确保解析器在遇到随机数据时不会发生恐慌,使用三个 fuzzer

  1. cargo fuzz 用于将随机字节发送给解析器。
  2. shift-fuzzer-jsbakkot 创建,用于生成随机但有效的 AST。
  3. Automated-Fuzzerqarmin 创建,主动报告 崩溃。

内存安全

oxc 解析器使用 bumpalo 作为其 AST 的内存分配器。没有任何 AST 节点具有 drop 实现。Miri 已用于 确保 AST 节点上没有存储堆分配的数据,这会在分配器删除时导致内存泄漏。

程序检查器

快照诊断

所有程序检查器诊断都会写入 快照文件,以测试回归。

例如

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 │       }
   ╰────

生态系统 CI

oxlint-ecosystem-ci 在大型储存库中运行 oxlint 以检查假阳性、回归和惊恐。经过测试的储存库包括

幂等性

在所有工具的集成测试和端到端测试中,采用了幂等性测试。

幂等性测试遵循以下程序

javascript
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 个依赖项

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 联系我们。

在 MIT 许可下发布。