6.7 KiB
6.7 KiB
test_client.py ドキュメント
概要
test_client.py は stdin/stdout 経由でバックエンド (mainloop.py) と通信し、各種 API エンドポイントを自動 / 半自動でテストするためのクライアントユーティリティ。初期化完了待機、ログ (status=348) 展開表示、サイレントモード、結果エクスポート(JSON/CSV)、Watchdog ハートビート送信 (/run/feed_watchdog) などの補助機能を備える。
主な責務
- バックエンドプロセス起動と初期化完了待機 (
/run/initialization_complete) - エンドポイント単発送信/応答待機 (Base64 エンコード/デコード)
- status=348 ログエントリの全文展開表示
- タイムアウト / 例外発生時の復旧メッセージ出力
- Watchdog ハートビート送信スレッド管理
- 自動テスター (
AutomatedEndpointTester) による包括的エンドポイント試験 - テスト結果の JSON / CSV エクスポート (インタラクティブ指定)
クラス構成
Color
ANSIカラー定数を定義し、可読性の高い出力を実現。
TestClient
バックエンドとの 1 プロセス・1 チャンネル通信を管理。
| 属性 | 役割 |
|---|---|
process |
起動した Python バックエンド subprocess |
_watchdog_stop_event |
Watchdog スレッド停止制御用 Event |
_watchdog_thread |
/run/feed_watchdog 送信スレッド |
初期化フロー
subprocess.Popen([sys.executable, 'mainloop.py'], ...)でバックエンド起動_wait_for_initialization()を呼び出し/run/initialization_complete受信まで待機- VRCT_INIT_TIMEOUT 環境変数があれば soft timeout として利用 (超過時 WARN のみ)
- 30 秒間隔で進捗ログ (最後に受信した endpoint)
- status=348 レコードは全文 JSON 展開
- 初期化完了後
_start_watchdog()がバックグラウンドで /run/feed_watchdog を 30 秒間隔送信
重要メソッド
-
send_request(endpoint, data=None, timeout=30.0, silent=False)- リクエスト JSON を構築し送信
dataは JSON シリアライズ → Base64 →dataフィールド- 指定 endpoint のレスポンス行まで逐次読み取り (他 endpoint のログ行は通過)
- status=348 の場合ログとして全文表示(silent=False のとき)
- タイムアウト時 504 レスポンスを合成
-
_wait_for_initialization(timeout=None)- 無期限または soft timeout 待機
- プロセス死亡検知で RuntimeError
-
_start_watchdog()/cleanup()- Watchdog スレッド開始と安全停止 (Event セット後 join)
AutomatedEndpointTester
backend_test.py のロジック移植版(stdin/stdout プロトコル向け)。
| 属性 | 説明 |
|---|---|
silent |
True ならクライアント側詳細出力を抑制 |
export_path |
JSON エクスポート先 (None なら未出力) |
export_csv |
CSV 追加出力有無 |
results |
収集したテストレコード一覧 |
エンドポイント分類 (ハードコード暫定)
- 有効/無効化:
/set/enable/*,/set/disable/* - 設定更新:
/set/data/* - 実行系:
/run/* - 削除系:
/delete/data/*
主メソッド
test_validity_single(endpoint)有効/無効化系単一試験test_set_data_single(endpoint)設定更新系単一試験(事前に動的取得が必要な値は/get/data/...を呼び最新値をキャッシュ)test_run_single(endpoint)実行系単一試験test_delete_single(endpoint)削除系単一試験run_all()全カテゴリ順次実行run_random(count=1000)全エンドポイントプールからランダム選択run_specific_random(category, count)指定カテゴリ内ランダムsummary()結果集計出力および必要な場合 JSON/CSV エクスポート
結果レコード構造
{
"endpoint": "/set/data/transparency",
"status": 200,
"result": 85,
"expected": "status==200"
}
CSV 例:
endpoint,status,expected,success
/set/data/transparency,200,status==200,True
status=348 ログ取り扱い
- 初期化待機中: 展開してインデント付き表示
- リクエスト応答処理中: silent=False ならログエントリ全文を優先表示
- 通常 API 応答 (status != 348) との区別を明確化しデバッグ容易化
Watchdog ハートビート
- 30 秒間隔で
/run/feed_watchdogを送信 (fire-and-forget) - 送信失敗時は警告を表示しループ終了
- クライアント終了時に停止イベントをセットしスレッド join でリーク防止
エクスポート機能
JSON エクスポート
export_pathが指定されていればresultsを UTF-8 / ensure_ascii=False で整形出力- フィールド: endpoint, status, result, expected, success
CSV エクスポート
- JSON パスから拡張子置換(
.csv)で派生 (内部_derive_csv_path相当ロジック) - 成功判定:
statusとexpected文字列評価結果に依存 (単純比較)
例外 / エラー処理方針
| ケース | 対応 |
|---|---|
| バックエンド終了検知 | 初期化待機中: RuntimeError を投げる / 通常通信: 500 レスポンス合成 |
| JSONDecodeError | ログ行扱いでスキップ (初期化中は進捗ログとして表示) |
| BrokenPipe / OSError | 通信切断とみなして 500 レスポンス返却 |
| タイムアウト | 504 レスポンス返却 (endpoint 同梱) |
制限事項
- エンドポイント一覧は動的取得ではなくハードコード (将来的改善余地)
- レスポンスの並行受信は未対応(1 リクエスト同期待ち)
- status=200 以外の詳細な意味的検証は限定的 (expected = 単純条件)
- Watchdog レスポンスは読み取らないため送信失敗検知は例外経路のみ
今後の改善候補
- CLI 引数サポート (
--mode random --count 500 --silent --export result.json) - 動的エンドポイント列挙 API 追加後の自動反映
- リトライポリシー (指数バックオフ) 導入
- 応答時間測定とパフォーマンスレポート出力
- 並列テスト実行 (複数 subprocess / async IO)
参考
backend_test.py: 元ロジックutils.py: status=348 ログ出力仕様mainloop.md: 通信プロトコル詳細
まとめ
test_client.py は VRCT バックエンドに対する包括的なテストおよび運用補助を 1 ファイルで実現するツール。初期化待機の堅牢化(無期限 + soft timeout)、Watchdog ハートビート、ログ展開、静音化オプション、結果エクスポートにより長時間動作・回帰試験・CI への組み込みを容易にする基盤を提供する。