========================================================================
テスト方針 (Testing Policy)
========================================================================
1. 概要 (Overview)
------------------------------------------------------------------------
1-0. 目的
本プロジェクトにおけるテストの方針・実行方法・構成を定義する.
テストファイルを追加・変更した場合は本ドキュメントも更新すること.
1-1. テストの位置づけ
ライントレース自律走行の性能は,線検出精度と操舵量計算の品質に
直結する.これらの数値ロジックは試行錯誤で頻繁に変更されるため,
回帰を防止するユニットテストを整備し,変更の安全性を担保する.
2. テスト方針 (Policy)
------------------------------------------------------------------------
2-1. テスト対象の優先順位
以下の優先順位でテストを整備する:
1. 操舵量計算(steering/): 制御ロジックの正しさを担保する
2. 線検出(vision/): 検出手法ごとの検出成否・偏差の妥当性を検証する
3. 近似・フィッティング(vision/fitting.py): 外れ値処理・境界条件を検証する
4. 形態学的処理(vision/morphology.py): 画像フィルタの挙動を検証する
5. ユーティリティ(json_utils.py 等): データ永続化の正しさを検証する
2-2. テストの種類
■ ユニットテスト
・対象: `src/common/` 配下の画像処理・操舵量計算・ユーティリティ
・方針: 合成画像(フィクスチャ)を入力に使用し,
外部デバイス(カメラ・モーター・ネットワーク)に依存しない
・配置: `tests/` ディレクトリに集約する
■ 実機テスト
・対象: Pi 上でのカメラ取得・モーター制御・通信
・方針: 自動化の対象外とし,手動で実施する
・手順: 本ドキュメントの範囲外とする
2-3. テスト設計の原則
・合成画像を使用する: 実画像に依存せず,テストの再現性を確保する
・境界条件を含める: 最小データ点数,空画像,未検出時の挙動を検証する
・外れ値耐性を検証する: ロバスト推定手法の外れ値処理を確認する
・浮動小数点の比較: `pytest.approx()` で許容誤差を明示する
3. テスト環境 (Environment)
------------------------------------------------------------------------
3-1. フレームワーク
・pytest を使用する
・設定ファイル: `pytest.ini`(pythonpath・testpaths を定義)
3-2. テスト実行
・全テスト実行:
$ pytest
・特定ファイルの実行:
$ pytest tests/test_steering.py
・特定テストクラスの実行:
$ pytest tests/test_steering.py::TestPdControl
・詳細出力:
$ pytest -v
3-3. 前提条件
・PC 環境(`requirements_pc.txt`)がインストール済みであること
・Pi 固有のライブラリ(Picamera2,RPi.GPIO)は不要
4. テスト構成 (Structure)
------------------------------------------------------------------------
4-1. ディレクトリ構成
tests/
├── conftest.py 共通フィクスチャ
├── test_steering.py 操舵量計算(PD・Pursuit・TsPd)
├── test_line_detector.py 線検出(5手法 + フィッティング検出)
├── test_fitting.py 直線・曲線近似(Theil-Sen・RANSAC)
├── test_morphology.py 形態学的処理
├── test_params.py パラメータ保存・復元・プリセット
└── test_json_utils.py JSON ユーティリティ
4-2. 共通フィクスチャ(conftest.py)
テスト用の合成画像を `conftest.py` で定義し,複数のテストファイルで
共有する:
・`straight_line_image`: 中央に暗い縦線があるグレースケール画像
・`blank_image`: 線のない均一なグレースケール画像
・`binary_with_hole`: 中央に穴がある二値画像(クロージングテスト用)
・`binary_line`: 中央に太い白線がある二値画像
※ 画像サイズは `config.FRAME_WIDTH` x `config.FRAME_HEIGHT` に従う.
4-3. テストファイルと対象モジュールの対応
テストファイル 対象モジュール
───────────────────── ───────────────────────────────
test_steering.py common.steering.pd_control
common.steering.pursuit_control
common.steering.ts_pd_control
test_line_detector.py common.vision.line_detector
test_fitting.py common.vision.fitting
test_morphology.py common.vision.morphology
test_params.py pc.steering.auto_params
pc.steering.param_store
test_json_utils.py common.json_utils
5. テスト追加時のルール (Rules for Adding Tests)
------------------------------------------------------------------------
5-1. ファイル命名
・`test_<対象モジュール名>.py` とする
・新規モジュールを追加した場合,対応するテストファイルも作成する
5-2. クラス・関数命名
・テストクラス: `Test<テスト対象>` (PascalCase)
・テスト関数: `test_<テスト内容>` (snake_case)
・テスト内容が一読で分かる命名にする
5-3. フィクスチャの追加
・複数テストファイルで共有するフィクスチャは `conftest.py` に定義する
・単一ファイル内でのみ使用するフィクスチャはそのファイル内に定義する
5-4. コーディング規則
・`GUIDE_04_コーディング規則.txt` に従う
・docstring は日本語,Google スタイル,句点なし