測試基礎架構
資訊
本文旨在邀請大家分享改進我們測試基礎架構的想法,歡迎在 Discord 上聯繫我們。
在 Oxc 中,正確性和可靠性至關重要。
我們花費大量時間加強測試基礎架構,以防止問題傳播到下游工具。
解析器
一致性
來自 Test262、Babel 和 TypeScript 的解析器測試用於測試 JavaScript、TypeScript 和 JSX 語法。
對於 Test262,包含所有 stage 4 和正規表達式測試。
所有一致性結果都儲存在快照檔案中以追蹤變更。
- test262.snap,報告
43765/43765 (100.00%)
。 - babel.snap,報告
2093/2101 (99.62%)
。 - typescript.snap,報告
6470/6479 (99.86%)
。
所有語法錯誤都寫入這些快照檔案中以進行差異比較。
模糊測試
為了確保解析器在遇到隨機資料時不會崩潰,使用了三個模糊測試器
- cargo fuzz 用於傳送隨機位元組至解析器。
- shift-fuzzer-js 由 bakkot 開發,用於產生隨機但有效的 AST。
- Automated-Fuzzer 由 qarmin 開發,該工具會主動回報崩潰。
記憶體安全
oxc 解析器使用 bumpalo
作為其 AST 的記憶體配置器。沒有任何 AST 節點具有 drop
實作。Miri 用於確保沒有任何堆積配置的資料儲存在 AST 節點上,這會在配置器被丟棄時導致記憶體洩漏。
程式碼檢查器 (Linter)
快照診斷
所有程式碼檢查器診斷都會寫入 快照檔案,以針對回歸進行測試。
例如
⚠ 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 上聯繫我們。