テスト構成
June 17, 2026 · View on GitHub
WebDNN のテストは 3 層で構成する。CI では GPU を使わない。
第 1 層: ユニットテスト(vitest, GPU/DOM 不要, CI 常時)
- 対象: 純粋関数(
math/util)、CPUTensorImpl、CPU 演算子(CPU コンテキスト経由)。 - 場所:
test/unit/**/*.test.ts。バレル(index.ts)ではなく個別ソースを直接 import し、 DOM/GPU 非依存に保つ(test/unit/setup.tsがlogging.tsのためのwindowを最小スタブ)。 - 実行:
npm run test:unit(またはnpm test)。watch はnpm run test:watch。 - CI:
.github/workflows/ci.ymlでtypecheck/lint/format:check/test:unit/buildを push・PR ごとに実行(GPU なし)。
第 2 層: Playwright 実機自動チェック(ローカル, CPU 経路)
- 対象: 実ブラウザ(chromium)でモデル推論を実行し、
expected.binと数値比較。 - 仕組み:
test/model_test/runner/standard.htmlを Playwright で開き、backend チェックを すべて外して CPU のみ実行 → ランナーが付与する#summary(ALL OK / 0 failed)を判定。 - 前提:
npm run fixtures(フィクスチャ生成)とnpm run build(dist/webdnn.js)。 - 実行:
npm run test:e2e(設定はplaywright.config.ts、npx http-serverを :8080 で自動起動)。スペックは 2 本:test/e2e/model.spec.ts— CPU バックエンド(どの環境でも実行)。test/e2e/webgpu.spec.ts— WebGPU バックエンド。navigator.gpuがある開発機 (例: macOS/Apple Silicon の Chromium は Metal 経由で WebGPU 実行可)では relu/add/gemm/conv を 自動で WebGPU 実行しexpected.binと数値比較。navigator.gpuが無ければ skip し第 3 層へ委ねる。playwright.config.tsで--enable-unsafe-webgpuを付与。test/e2e/webgl.spec.ts— WebGL バックエンド。WebGL2 が使える環境では自動実行し 数値比較。使えなければ skip。test/e2e/wasm.spec.ts— WASM バックエンド。emscripten 製の実worker.tsが在る時 (npm run shader:wasm実行後)に自動実行。スタブの場合は skip(CPU フォールバックでの 偽 PASS を避けるため)。emscripten 導入手順は emscripten-setup.md。
- 初回のみ
npx playwright install chromiumが必要。
第 3 層: 全ブラウザ目視確認(人手)
- 手順:
npm run buildnpm run fixturesnpm run server- 各対象ブラウザ(Chrome / Edge / Safari / Firefox)で
http://localhost:8080/test/model_test/runner/standard.htmlを開く。 - backend チェックボックス(wasm / webgl / webgpu)を選んで「Test」を実行。
- 末尾の
SUMMARY: ... ALL OKを目視確認。
- 失敗時はページのログ(コンソール/結果リスト)を Claude に共有して原因調査する。
- 最適化モデル経路は
optimized.html(webdnn-core.js+ 動的op-*.js)で確認する。
フィクスチャ
- 生成器:
test/fixtures/generate_fixtures.py(torch 非依存。onnx.helperで構築 →onnxruntimeで期待値算出 → 既存serialize_tensorsでWDN2形式のexpected.bin出力)。 - 依存は uv で pin(
test/fixtures/pyproject.toml+uv.lock、Python 3.12)。 - 出力:
test/model_test/runner/model/<case>/{model.onnx,expected.bin}とcases.json(現状: relu / add / sigmoid)。出力先は gitignore 対象で、npm run fixturesで再現する。 - ケース追加:
generate_fixtures.pyのmain()にdump_case(...)を追記する。
CI の範囲と限界
- CI(GitHub Actions, ubuntu): 第 1 層 + ビルドのみ。GPU・実ブラウザ・emscripten は使わない。
- 第 2 層は実 GPU を持つ開発機での実行を想定(CI では走らせない)。
- 第 3 層と実 GPU 上の WebGPU/WebGL 最終確認は人手。