跳至內容

測試基礎架構

資訊

本文旨在邀請大家分享改進我們測試基礎架構的想法,歡迎在 Discord 上聯繫我們。

在 Oxc 中,正確性和可靠性至關重要。

我們花費大量時間加強測試基礎架構,以防止問題傳播到下游工具。

解析器

一致性

來自 Test262BabelTypeScript 的解析器測試用於測試 JavaScript、TypeScript 和 JSX 語法。

對於 Test262,包含所有 stage 4 和正規表達式測試。

所有一致性結果都儲存在快照檔案中以追蹤變更。

所有語法錯誤都寫入這些快照檔案中以進行差異比較。

模糊測試

為了確保解析器在遇到隨機資料時不會崩潰,使用了三個模糊測試器

  1. cargo fuzz 用於傳送隨機位元組至解析器。
  2. shift-fuzzer-jsbakkot 開發,用於產生隨機但有效的 AST。
  3. Automated-Fuzzerqarmin 開發,該工具會主動回報崩潰。

記憶體安全

oxc 解析器使用 bumpalo 作為其 AST 的記憶體配置器。沒有任何 AST 節點具有 drop 實作。Miri 用於確保沒有任何堆積配置的資料儲存在 AST 節點上,這會在配置器被丟棄時導致記憶體洩漏。

程式碼檢查器 (Linter)

快照診斷

所有程式碼檢查器診斷都會寫入 快照檔案,以針對回歸進行測試。

例如

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 授權發布。