yoi/docs/report/test-validity-20260612/tui.md

7.5 KiB

テスト妥当性レビュー: tui

  • 評価: 混在

確認範囲

  • 対象 crate: crates/tui
  • 確認した主な範囲:
    • crates/tui/Cargo.toml
    • crates/tui/README.md
    • crates/tui/src/lib.rs
    • 既存 unit tests を持つ主要 module:
      • app.rs
      • input.rs
      • multi_pod.rs
      • single_pod.rs
      • workspace_panel.rs
      • pod_list.rs
      • task.rs
      • command.rs
      • markdown.rs
      • ui.rs
      • spawn.rs
      • setup_model.rs
      • composer_history.rs
      • composer_keys.rs
      • role_session_registry.rs
      • picker.rs
      • keys.rs
  • crate の責務として確認した内容:
    • ratatui / crossterm ベースの TUI 表示・入力処理
    • single-pod chat UI、multi-pod / workspace panel、pod picker、spawn/setup/key management UI
    • composer/input model、Markdown/tool/task/system event rendering
    • Pod list / Ticket panel / local role-session claim などの表示用 view model glue

現在のテストがよくカバーしていること

  • Unit test の量は多く、cargo test -p tui 実行時に 299 tests が列挙される。TUI crate としては model-level の回帰テストがかなり厚い。
  • app.rs / input.rs は重要な composer invariants をよく押さえている。
    • running 中の submit queueing
    • rollback 時の入力復元
    • input history persistence
    • file / knowledge completion
    • typed Segment の保持
    • context usage 表示
    • live system item / task snapshot の反映
  • multi_pod.rs / workspace_panel.rs は dogfooding 上重要な panel semantics を広く検証している。
    • Ticket row ordering / state display
    • ready ticket queue action
    • done ticket close action
    • Review action が黙って approve しないこと
    • Companion / Orchestrator lifecycle decision
    • composer が selected pod ではなく workspace companion に向くこと
    • local role-session claim の扱い
  • pod_list.rs は live/stored pod の分類・sort・socket reachability・corrupt metadata diagnostic を押さえており、TUI が誤って restore/send 可能扱いしないための invariant として有用。
  • task.rs には snapshot_format_contract があり、Pod 側 snapshot 形式と TUI 側 deserialization の境界を守るテストとして妥当。
  • command.rs / single_pod.rs:compact / :rewind / :peer などの command が通常 user message として送られないこと、local diagnostic になることを確認していて良い。
  • markdown.rs は Markdown renderer の基本構文、list、code block、table を文字列化して確認しており、LLM 出力表示の最低限の regressions には効く。
  • composer_history.rs / role_session_registry.rs は workspace-scoped path、duplicate suppression、claim conflict など、永続化先を誤らないための安全側テストがある。

不足 / 疑問のあるテスト

  • 現在の test suite は red。cargo test -p tui は 296 passed / 3 failed。
    • multi_pod::tests::orchestrator_launch_context_uses_orchestration_root_for_runtime_workspace
      • 失敗内容: expected "/repo/yoi/.worktree/orchestration/yoi-orchestrator" but actual "/repo/yoi"
      • 現在の設計では dedicated Orchestrator が process cwd と runtime workspace を分ける可能性があり、この test 名・期待値は仕様の変化に追随していない疑いが強い。
    • spawn::tests::profile_choices_use_project_registry_default
    • spawn::tests::profile_choices_include_builtin_and_project_default_marker
      • 失敗内容: selected index expected 1, actual 6
      • builtin profiles の数・順序に依存した brittle な assertion になっている。profile selector / default marker / selected profile identity を見るべきで、index 固定は妥当性が低い。
  • UI renderer の実画面に対する coverage は限定的。
    • ui.rs, multi_pod.rs, tool.rs には多数の render helper があるが、terminal buffer snapshot 的な検証は少ない。
    • 文字列 helper の unit test はある一方、layout collapse、small terminal width/height、wide Unicode、style priority、scroll offset と描画結果の統合的な確認は薄い。
  • tool.rs の test が見当たらないのは大きな穴。
    • Read/Write/Edit/Search/Bash などの tool call rendering は日常的に目に入る UI であり、diff wrapping、capped output、error suffix、aggregate Read rendering などの regression が入りやすい。
  • 実 terminal / event loop / crossterm raw mode まわりはほぼ unit-test 対象外。
    • project instruction 上 E2E は未設計なのでやむを得ないが、run_loop, polling, resize, alternate screen cleanup, Ctrl-C/quit guard の実端末統合は unit tests だけでは保証できない。
  • async / process interaction は一部 mock・TempDir・git repo でよく検証されているが、実 Pod process / socket / session log replay との E2E はない。
    • 特に Panel から child Pod launch、attach、completion notification、reload の end-to-end 整合は crate 単体の test だけでは判断できない。
  • 一部の panel/render tests は text alignment や label の exact string に寄っており、仕様化された文言なら有用だが、見た目調整で壊れやすい。重要 invariant と cosmetic expectation を分けると保守性が上がる。

追加を提案するテスト

  • まず red tests を仕様に合わせて直す。
    • Orchestrator launch context は workspace_root, role_workspace_root, original_workspace_root, implementation_worktree_root, merge_target_workspace_root, process cwd のどれを守る test なのかを明確にして、名前と assertion を更新する。
    • Profile choice tests は index ではなく、selected choice の selector / source / is_default 相当の意味で assert する。
  • tool.rs に focused unit tests を追加する。
    • Edit diff の old/new wrapping
    • multiline result の cap
    • failed tool call の error line
    • Bash output truncation metadata
    • Read aggregate rendering
    • narrow width と wide Unicode
  • ratatui::backend::TestBackend を使った small snapshot tests を少数追加する。
    • single-pod main screen の最小 smoke
    • multi-pod panel の ticket row + companion composer
    • task side pane / mini view
    • very small terminal size で panic しないこと
  • scroll / viewport invariant の test を増やす。
    • history scroll と rewind picker scroll が干渉しないことは既にあるが、tool blocks、Markdown long output、task pane open/close、terminal resize 時の offset clamp も対象にする。
  • 実 Pod process まで含む E2E が未設計なら、まずは crate 境界で replay-based tests を足すと効果が高い。
    • saved JSONL fragments / protocol events を App に流して expected blocks/actionbar/task state を確認する。
    • 実 socket は使わず、TUI state transition の regression を固定する。

実行したコマンド

cargo test -p tui

結果:

running 299 tests
test result: FAILED. 296 passed; 3 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.21s

失敗:

multi_pod::tests::orchestrator_launch_context_uses_orchestration_root_for_runtime_workspace
spawn::tests::profile_choices_include_builtin_and_project_default_marker
spawn::tests::profile_choices_use_project_registry_default
cargo test -p tui -- --list

crate の unit test inventory を確認するために使用した。