Skip to content

refactor(perf): Unity Perf Harness テスト容易化 (interface 抽出 + 純関数ヘルパー)#101

Merged
OJII3 merged 17 commits into
mainfrom
perf/unity-perf-harness-testability
Jun 29, 2026
Merged

refactor(perf): Unity Perf Harness テスト容易化 (interface 抽出 + 純関数ヘルパー)#101
OJII3 merged 17 commits into
mainfrom
perf/unity-perf-harness-testability

Conversation

@OJII3

@OJII3 OJII3 commented Jun 29, 2026

Copy link
Copy Markdown
Owner

概要

Ros2Unity/Assets/Perf/ 配下を、純関数ヘルパー + 差し替え可能 interface 中心の設計に再構成。
EditMode から直接テストできる構造にし、perf run event 出力 (measure_done) の構造を assert できるようにする。

変更内容

新規ファイル (12 Perf/ + 5 Tests/EditMode/)

  • IPerfMetricsSink / IPerfProfilerSampler / IPerfClock / IPerfStopwatch (4 interface)
  • PerfJson (Escape / WriteString / WriteNumber / WriteBoolean / WriteValue 純関数)
  • MeasureDoneBuilder.BuildPublish / .BuildSubscribe (純関数)
  • PerfTransportDiagnostics / PerfSubscriptionDiagnostics (値オブジェクト)
  • PerfDiagnosticsBuilder.BuildReceive (純関数)
  • StopwatchPerfClock / StopwatchWrapper (IPerfClock 実装)
  • PerfHarnessFakes (テスト用 fake 4 種)
  • PerfJsonTests / MeasureDoneBuilderTests / PerfDiagnosticsBuilderTests / PerfRunFlowTests (4 テストファイル)

変更ファイル

  • PerfPlayerEntry.cs: Run* signature を 5 引数 (participant + 3 interface) に変更。measure_done / diagnostics 構築を builder に置換
  • PerfMetricsWriter.cs: 内部実装を PerfJson 経由に。IPerfMetricsSink 実装
  • PerfProfilerRecorders.cs: IPerfProfilerSampler 実装

テスト結果

テストプロジェクト 結果
Unity EditMode (ROSettaDDS.UnityVerification.Tests) 119/120 pass (1 Explicit スキップ)
.NET (rosettadds-perf-runner.Tests) 70/70 pass
.NET (rosettadds.Tests) 553/553 pass

Unity EditMode は -batchmode -runTests で実行 (16.25 秒)。
check_unity_meta.sh クリーン。

受け入れ基準

  • NDJSON event vocabulary 完全互換 (start / ready / matched / measure_start / measure_done / waiting_for_release / released / done / error / receive_diagnostics)
  • measure_done フィールド名完全互換 (elapsed_ms / sent / received / serialized_bytes_per_message / serialized_bytes / messages_per_second / *_available/_last / *_total/_samples / *_transport_diagnostics_available/*_udp_* / subscription_* / rtps_*)
  • 公開 API への破壊的変更なし (本変更は internal のみ)
  • check_unity_meta.sh クリーン

既知の仕様逸脱

  1. PerfJson.Write*first パラメータ既定値が falsetrue (Task 3 でテストと整合させるため)。
    影響: PerfMetricsWriter.Event 内で全呼び出しに first: true/false を明示 (Task 9)
  2. MeasureDoneBuilder.BuildPublish/SubscribeprofilerFields 引数型を IReadOnlyDictionaryIDictionary (Task 14 で interface 実装のコンパイルエラー修正)
  3. PerfMetricsWriter.Event / .WriteSentinelinternalpublic (interface 実装上必須)
  4. PerfProfilerRecorders.Snapshot の戻り型を DictionaryIDictionary (interface 実装上必須)

参照

  • spec: docs/superpowers/specs/2026-06-29-unity-perf-harness-testability-design.md
  • plan: docs/superpowers/plans/2026-06-29-unity-perf-harness-testability.md

OJII3 added 17 commits June 29, 2026 15:26
- Ros2Unity/Assets/Perf/PerfPlayerEntry.cs (282 行) の mixed concerns
  (CLI 解析 / participant 構築 / Stopwatch / Profiler / measure_done
  構築 / diagnostics 抽出 / polling) を IPerfMetricsSink /
  IPerfProfilerSampler / IPerfClock の 3 interface + MeasureDoneBuilder /
  PerfDiagnosticsBuilder / PerfJson の純関数ヘルパーに切り出す
- NDJSON event vocabulary と measure_done フィールド名は完全互換
- 既存 PerfProfilerMode (Lean/Full) / sentinel file 動作 / 外部 CLI は不変
- 新規 EditMode テスト 5 ファイル (約 20 ケース) を追加
- AddReceiveDiagnostics のフィールド数を 11 → 10 に修正
- AddTransportDiagnostics のフィールド数を「12 個 (transport あたり 6)」に明確化
- テストケース数を内訳表 (合計 33 ケース) として 7.1 節を追加
- 受け入れ基準の表記を内訳表への参照に置換
- 15 タスク (TDD + foundation + refactor + verify)
- 新規 12 Perf/ ファイル + 5 Tests/EditMode/ ファイル
- 既存 PerfMetricsWriter / PerfProfilerRecorders / PerfPlayerEntry.Run* を
  interface 抽象経由に refactor、NDJSON 完全互換を維持
- 33 ケース追加 (PerfJson 16 / MeasureDoneBuilder 8 / PerfDiagnosticsBuilder 4 /
  StopwatchPerfClock 2 / PerfRunFlow 3 fast + 1 Explicit)
合わせて以下を修正:
- PerfMetricsWriter/PerfProfilerRecorders: interface 実装メソッドを public に
- MeasureDoneBuilder: 引数型を IDictionary に変更 (IReadOnlyDictionary から)
@OJII3 OJII3 merged commit 8770d1b into main Jun 29, 2026
1 check passed
@OJII3 OJII3 deleted the perf/unity-perf-harness-testability branch June 29, 2026 10:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant