テスト構成

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.tslogging.ts のための window を最小スタブ)。
  • 実行: npm run test:unit(または npm test)。watch は npm run test:watch
  • CI: .github/workflows/ci.ymltypecheck / lint / format:check / test:unit / build を push・PR ごとに実行(GPU なし)。

第 2 層: Playwright 実機自動チェック(ローカル, CPU 経路)

  • 対象: 実ブラウザ(chromium)でモデル推論を実行し、expected.bin と数値比較。
  • 仕組み: test/model_test/runner/standard.html を Playwright で開き、backend チェックを すべて外して CPU のみ実行 → ランナーが付与する #summaryALL OK / 0 failed)を判定。
  • 前提: npm run fixtures(フィクスチャ生成)と npm run builddist/webdnn.js)。
  • 実行: npm run test:e2e(設定は playwright.config.tsnpx http-server を :8080 で自動起動)。スペックは 2 本:
    • test/e2e/model.spec.ts — CPU バックエンド(どの環境でも実行)。
    • test/e2e/webgpu.spec.tsWebGPU バックエンド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.tsWebGL バックエンド。WebGL2 が使える環境では自動実行し 数値比較。使えなければ skip。
    • test/e2e/wasm.spec.tsWASM バックエンド。emscripten 製の実 worker.ts が在る時 (npm run shader:wasm 実行後)に自動実行。スタブの場合は skip(CPU フォールバックでの 偽 PASS を避けるため)。emscripten 導入手順は emscripten-setup.md
  • 初回のみ npx playwright install chromium が必要。

第 3 層: 全ブラウザ目視確認(人手)

  • 手順:
    1. npm run build
    2. npm run fixtures
    3. npm run server
    4. 各対象ブラウザ(Chrome / Edge / Safari / Firefox)で http://localhost:8080/test/model_test/runner/standard.html を開く。
    5. backend チェックボックス(wasm / webgl / webgpu)を選んで「Test」を実行。
    6. 末尾の SUMMARY: ... ALL OK を目視確認。
  • 失敗時はページのログ(コンソール/結果リスト)を Claude に共有して原因調査する。
  • 最適化モデル経路は optimized.htmlwebdnn-core.js + 動的 op-*.js)で確認する。

フィクスチャ

  • 生成器: test/fixtures/generate_fixtures.py(torch 非依存。onnx.helper で構築 → onnxruntime で期待値算出 → 既存 serialize_tensorsWDN2 形式の 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.pymain()dump_case(...) を追記する。

CI の範囲と限界

  • CI(GitHub Actions, ubuntu): 第 1 層 + ビルドのみ。GPU・実ブラウザ・emscripten は使わない。
  • 第 2 層は実 GPU を持つ開発機での実行を想定(CI では走らせない)。
  • 第 3 層と実 GPU 上の WebGPU/WebGL 最終確認は人手。