---
description: テスト作成ルール・Rust(等価分割・境界値・Given-When-Then)
alwaysApply: false
globs: **/*.rs,**/tests/**
---
# テスト作成ルール(共通)
テストコードの新規作成・追加・修正時は、言語固有ルールとあわせて本セクションを適用する。
## 1. 事前確認
- テストが必要かどうか不明な場合は、**AskUserQuestion** で確認すること。
- 着手前に以下を把握すること:
- 言語・ランタイム
- テストフレームワーク(プロジェクト既存のものを優先)
- 既存のテストディレクトリ・命名規則・フィクスチャの置き場所
## 2. 必須プロセス
1. **テスト観点の表**(等価分割・境界値)を Markdown 表で**先に**提示する。
2. 表に基づいてテストコードを実装する。
3. **失敗系を正常系と同数以上**含める。
4. 以下を必ず網羅する:
- **正常系** — 主要シナリオ・代表入力
- **異常系** — バリデーション失敗・エラー返却・例外
- **境界値** — 0、最小、最大、±1、空、NULL / `None`、空コレクション
- **不正入力** — 型・形式・範囲の不正さ
- **外部依存の失敗** — 該当する場合(モック・フェイクの前提を明示)
- **エラー内容の検証** — 例外種別・エラーメッセージ・エラーコード
5. 各テストケースに **Given / When / Then** 形式のコメントを付ける。
6. 回答末尾に **実行コマンド** と **カバレッジ取得方法** を記載する。
7. **目標: 分岐網羅 100%**(不足観点は実装前に表へ追記する)。
## 3. 変更時の必須確認
- コード修正を行ったら、**必ず**テストを実行して結果を確認する。
- 既存テストが落ちないこと。仕様変更はテストとドキュメントを同時に更新する。
- フレークのないテストにする(時刻・乱数・並列は固定シード・モックで制御)。
---
# テスト作成ルール(Rust)
上記「テスト作成ルール(共通)」に加え、Rust プロジェクトでは以下を適用する。
## 4. テストの種類と配置
| 種類 | 置き場所 | 用途 |
|---|---|---|
| ユニットテスト | 対象 `.rs` 内の `#[cfg(test)] mod tests` | 純粋関数・小さなモジュール |
| 統合テスト | クレート直下 `tests/*.rs` | 公開 API・複数モジュールの連携 |
| ドキュメントテスト | `///` コードブロック | 使用例・仕様の固定 |
- 新規統合テストは `tests/` に **1 ファイル 1 テーマ**で追加する(`tests/foo.rs`)。
- テスト専用ヘルパーは `tests/common/mod.rs` または `#[cfg(test)]` に置く。
- 既存の `proptest` 等があれば、その構成を優先する。
## 5. 実装の書き方
- アサーションは `assert!` / `assert_eq!` / `assert_matches!` を使い、失敗時に期待値が分かるメッセージを付ける。
- エラー系は `Result::Err`・`Option::None` を明示的に検証する。
- パニック期待は `#[should_panic]` または `catch_unwind` を使い、理由をコメントする。
- 非同期は `#[tokio::test]` 等、プロジェクト既存のマクロに合わせる。
- `unwrap()` は **テストコード内のみ** 許容。本番コードに `unwrap` を増やしてテストしやすくしない。
### 例
```rust
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parses_valid_hex() {
// Given: 32文字の16進文字列
// When: parse_hex_input を呼ぶ
// Then: 16バイトの Vec が返る
let got = parse_hex_input("00112233445566778899aabbccddeeff").unwrap();
assert_eq!(got.len(), 16);
}
}
```
## 6. 実行コマンドとカバレッジ
回答末尾に以下を含めること。
```bash
# クレート全体
cargo test
# 特定テストのみ
cargo test parses_valid_hex
# 統合テストのみ
cargo test --test integration_name
```
カバレッジ(`cargo-llvm-cov` 等がプロジェクトにあれば):
```bash
cargo llvm-cov --html
```
ツール未導入時は、プロジェクトで採用している手段を確認してから記載する。