--- name: testing description: このプロジェクトのテストに関する方針を提供する。テストの設計・作成・追加・修正・レビュー時に使用する。 --- # テスト方針 ## 検証対象と実装詳細への依存 - テスト対象のプライベートな関数・メソッド(非公開関数)を直接呼び出してテストすることを禁止する。複雑なアルゴリズムや境界条件の確認であっても例外を設けない。 - 公開された関数・メソッド・API・CLI を入口として、戻り値、公開されたエラー、保存結果など、利用者から観測できる振る舞いを検証する。公開インターフェース経由で非公開関数が間接的に実行されることは問題ない。 - テストのためだけに関数の可視性を広げたり、非公開関数を呼ぶ専用の公開ラッパーを追加したりしない。リフレクション、テスト専用エクスポート、同一モジュールからのアクセスなどによる迂回も禁止する。 - 公開関数を呼ぶテストでも、内部の非公開関数の呼び出し順・回数や非公開状態を検証しない。外部 API へのリクエスト内容や回数は、それ自体が期待する振る舞い(保存済みメディアを再取得しない等)を表す場合に検証してよい。 - 外部 API などの依存先は境界で置き換えてよいが、テスト対象の非公開関数をモックやスパイにして内部手順を固定しない。 - テストの配置と検証対象を分けて考える。Rust の実装ファイル内の `#[cfg(test)] mod tests` なども利用できるが、対象実装へのアクセスは公開インターフェースに限定する。 - 公開インターフェース経由で確認しづらい場合は、入力や外部依存の制御、テストの粒度を見直す。非公開関数の直接テストへ切り替えない。設計変更が必要なら、その作業の範囲と既存の指示に従う。 - 既存の違反テストを変更する場合は、対応する公開インターフェースの振る舞いを検証する形に改める。依頼範囲外のテストを一括変更・削除しない。 作成・修正後は、テスト対象への入口が公開インターフェースであること、および公開された振る舞いを保つ内部リファクタリングでテストが壊れないことを確認する。この制約はテスト対象の実装に対するものであり、テスト用の非公開ヘルパー関数の利用は禁止しない。