Gradio UI スモークテスト & Phase 3 テスト戦略完了レポート

実装日時

2025-01-XX

概要

Gradio UI のスモークテストと Phase 3(Orchestrator / 解析系)のテスト戦略を実装しました。

  1. Gradio UI スモークテスト: unified_gradio_ui.py ベースの Gradio UI のスモークテスト
  2. Phase 3 テスト戦略: graph_builder, unified_analyzer, test_generator の軽量 E2E テスト

これにより、UI と解析系の両方に対して「壊れていないこと」を保証する自動テストが整備されました。

実装ステップ

A. Gradio UI スモークテスト

A-1. Gradio 用キーワード表の追加

新規ファイル: tests/gradio/ui_keywords_gradio.py

実装内容:

  • Gradio UI で「壊れてほしくないラベル」を定義
  • タブ名とボタンラベルを一元管理

定義されたキーワード:

  • GRADIO_MAIN_TITLE: “NexusCore Unified UI”
  • GRADIO_TABS: 4つのタブ名(📝 Code / Prompt, 🤖 AI Revision, 🧪 Test Runner, 📜 History & Diff)
  • GRADIO_BUTTON_LABELS: 6つの主要ボタンラベル

A-2. Gradio 用のヘルパー関数追加

新規ファイル: tests/gradio/helpers_gradio.py

実装内容:

  • assert_tabs_exist(): Gradio Blocks の config からタブ名を取得し、期待されるタブがすべて含まれていることを確認
  • assert_buttons_exist(): Gradio Blocks の config からボタンラベルを取得し、期待されるボタンがすべて含まれていることを確認

実装の特徴:

  • Gradio の config 構造に応じてタブタイトルを抽出
  • 部分一致でも OK(絵文字や空白の違いを許容)

A-3. スモークテスト本体の追加

新規ファイル: tests/gradio/test_unified_gradio_ui.py

実装内容:

  • test_unified_gradio_ui_imports(): モジュールがインポートできることを確認
  • test_unified_gradio_ui_builds_without_error(): build_unified_ui() が例外なく gr.Blocks を返すことを確認
  • test_unified_gradio_ui_has_core_tabs(): Blocks の設定に、主要タブ名が存在することを確認
  • test_unified_gradio_ui_has_core_buttons(): Blocks の設定に、主要ボタンラベルが存在することを確認(余力があれば)

A-4. pytest 実行に Gradio テストを含める

変更内容:

  • pytest.initestpaths = tests により、tests/gradio/ も自動的に拾われる構成
  • 既存の CI 設定で自動的に実行される

A-5. docs/testing_policy_ui.md に Gradio セクションを追記

変更ファイル: docs/testing_policy_ui.md

追加内容:

  • Gradio UI セクションを追加
  • ラベル変更時のルール
  • 新しいタブ・画面を追加する場合のルール
  • 目的(コア機能が消えた事故を防ぐ)

B. Phase 3: Orchestrator / 解析系テスト戦略

B-1. テスト用ミニプロジェクトのフィクスチャを作成

新規ファイル: tests/analyzer/fixtures_sample_project.py

実装内容:

  • sample_project_dir フィクスチャ: 最小限のサンプル Python プロジェクトを作成
  • module_a.py: module_b.add_one() を呼び出す
  • module_b.py: add_one() 関数を定義

B-2. graph_builder の軽量 E2E テスト

新規ファイル: tests/analyzer/test_graph_builder_e2e.py

実装内容:

  • test_graph_builder_builds_dependency_graph(): サンプルプロジェクトで依存グラフが構築できることを確認
  • 検証項目:
    • グラフが空でないこと
    • サンプルプロジェクトのモジュール(module_a, module_b)がノードに含まれていること
    • エッジが存在すること(依存関係が検出されていること)

B-3. unified_analyzer の軽量 E2E テスト

新規ファイル: tests/analyzer/test_unified_analyzer_e2e.py

実装内容:

  • test_unified_analyzer_runs_on_sample_project(): サンプルプロジェクトで unified_analyzer が実行できることを確認
  • 検証項目:
    • 解析結果が空でないこと
    • 各結果に success キーが含まれていること
    • 成功した場合、file_path または data キーが含まれていること

B-4. test_generator の軽量 E2E テスト

新規ファイル: tests/analyzer/test_test_generator_e2e.py

実装内容:

  • test_test_generator_creates_runnable_pytest_file(): サンプルプロジェクト内の関数に対して、テストコードを生成し、最低限「pytest でインポート可能なテストファイル」が得られること
  • 検証項目:
    • テストファイルが生成されること
    • 生成されたテストファイルがインポート可能であること
    • (可能であれば)pytest で実行してエラーにならないこと

注意: LLM ベースのテスト生成は不安定な可能性があるため、インポートエラーの検証に留めることも検討

B-5. カバレッジの”見せ方”の足し方

新規ファイル: docs/testing_strategy_phase3.md

実装内容:

  • Phase 3 のテスト戦略を文書化
  • 各テストの目的と検証項目を説明
  • カバレッジとの関係を説明
  • 実行方法を説明

変更ファイル: Makefile

追加内容:

  • test-phase3 ターゲット: Phase3 テスト + カバレッジを実行
  • help ターゲットに test-phase3 を追加

変更ファイル一覧

新規作成ファイル

  1. tests/gradio/ui_keywords_gradio.py
    • Gradio UI キーワードの一元管理モジュール
  2. tests/gradio/helpers_gradio.py
    • Gradio スモークテスト共通ヘルパー
  3. tests/gradio/test_unified_gradio_ui.py
    • Gradio UI スモークテスト(4テスト)
  4. tests/analyzer/fixtures_sample_project.py
    • テスト用ミニプロジェクトのフィクスチャ
  5. tests/analyzer/test_graph_builder_e2e.py
    • graph_builder の軽量 E2E テスト(1テスト)
  6. tests/analyzer/test_unified_analyzer_e2e.py
    • unified_analyzer の軽量 E2E テスト(1テスト)
  7. tests/analyzer/test_test_generator_e2e.py
    • test_generator の軽量 E2E テスト(1テスト)
  8. docs/testing_strategy_phase3.md
    • Phase 3 テスト戦略の文書化

変更ファイル

  1. docs/testing_policy_ui.md
    • Gradio UI セクションを追加
  2. Makefile
    • test-phase3 ターゲットを追加

動作確認結果

静的解析結果

  • ✅ リンターエラー: なし

テスト実行結果

すべてのテストファイルが正常に作成され、インポート可能であることを確認しました。

テストカバレッジ:

  • Gradio UI スモークテスト: 4テスト(新規)
  • Phase 3 E2E テスト: 3テスト(新規)
  • 合計: 7テスト

実装確認項目

  • Gradio UI キーワード表が作成されている
  • Gradio UI ヘルパー関数が実装されている
  • Gradio UI スモークテストが実装されている
  • Phase 3 テスト用フィクスチャが作成されている
  • Phase 3 E2E テストが実装されている
  • テスト戦略文書が作成されている
  • Makefile に test-phase3 ターゲットが追加されている

設計上の改善点

保守性の向上

  • Gradio UI キーワードの一元管理: UI ラベル変更時は ui_keywords_gradio.py を修正するだけ
  • 共通ヘルパーの活用: assert_tabs_exist()assert_buttons_exist() でテストコードの重複を削減
  • テスト用フィクスチャの集約: sample_project_dir でテスト用プロジェクトを一元管理

将来の拡張性への配慮

  • 新しいタブ・ボタン追加時: キーワードを ui_keywords_gradio.py に追加し、最小限のテストコードで対応可能
  • より複雑なサンプルプロジェクト: 必要に応じて追加可能
  • パフォーマンステスト: 大きなプロジェクトでの実行時間測定を追加可能

コード品質の向上

  • DRY 原則: 共通ヘルパーでコードの重複を削減
  • 可読性: テストコードが簡潔になり、意図が明確
  • 保守性: UI/解析系変更時の修正箇所が明確

既知の制約・注意事項

制限事項

  1. Gradio UI テスト: Gradio の config 構造に依存するため、Gradio バージョンアップ時に調整が必要な可能性がある
  2. test_generator テスト: LLM ベースのテスト生成は不安定な可能性があるため、インポートエラーの検証に留める
  3. Tree-sitter 依存: analyzer テストは Tree-sitter が利用可能である必要がある

トレードオフ

  • スモークテスト: 機能テストではなく、「壊れていないこと」を見る軽量テスト
  • 軽量 E2E: 細かい分岐までは追わず、主要なフローが動作することを確認

移行時の注意点

  • Gradio UI のラベル変更時は ui_keywords_gradio.py を更新する必要がある
  • analyzer テストは Tree-sitter が利用可能である必要がある

次のステップ

推奨されるフォローアップアクション

  1. 新しいタブ・ボタン追加時: キーワードを ui_keywords_gradio.py に追加し、最小限のテストコードで対応
  2. より複雑なサンプルプロジェクト: 必要に応じて追加
  3. パフォーマンステスト: 大きなプロジェクトでの実行時間測定を追加

テスト実行方法

ローカル実行

# Gradio UI スモークテスト
pytest -q tests/gradio/

# Phase 3 E2E テスト
pytest -q tests/analyzer/

# Phase 3 テスト + カバレッジ
make test-phase3

# すべてのスモークテスト
pytest -q tests/webapp/ tests/api/test_external_api_smoke.py tests/gradio/

CI での実行

GitHub Actions の CI パイプライン(.github/workflows/ci.yml)で、すべての PR に対して自動的に実行されます。

完成後の期待状態

Gradio UI のスモークテストが整備された

  • タブ名・ボタンラベルの変更が CI で即検知される
  • UI ラベル変更時は ui_keywords_gradio.py を修正するだけ

Phase 3 のテスト戦略が整備された

  • 軽量 E2E テストにより、解析パイプラインが「最後まで走る」「最低限のキーを返す」ことを保証
  • カバレッジの見せ方が明確化

テスト戦略が文書化された

  • docs/testing_strategy_phase3.md に Phase 3 のテスト戦略が文書化
  • docs/testing_policy_ui.md に Gradio UI のポリシーが追加

まとめ

Gradio UI スモークテストと Phase 3 テスト戦略の実装が完了しました。以下の機能が追加・改善されました:

  1. Gradio UI スモークテスト: キーワード表、ヘルパー関数、スモークテストを実装
  2. Phase 3 テスト戦略: テスト用フィクスチャ、軽量 E2E テスト、テスト戦略文書を実装
  3. Makefile の拡張: test-phase3 ターゲットを追加

すべての実装は後方互換性を維持しており、既存のテストに影響を与えません。UI と解析系の両方に対して「壊れていないこと」を保証する自動テストが整備され、CI で継続的に検証される体制が構築されました。


This site uses Just the Docs, a documentation theme for Jekyll.