Rust テストパターン
TDD方法論に従って信頼性が高く保守しやすいテストを書くための包括的なRustテストパターン。
使用場面
- 新しいRustの関数、メソッド、またはトレイトを書く場合
- 既存のコードにテストカバレッジを追加する場合
- パフォーマンスクリティカルなコードのベンチマークを作成する場合
- 入力検証にプロパティベーステストを実装する場合
- RustプロジェクトでTDDワークフローに従う場合
動作原理
- ターゲットコードを特定する — テストする関数、トレイト、またはモジュールを見つける
- テストを書く —
#[cfg(test)]モジュール内で#[test]を使用、rstest でパラメータ化テスト、または proptest でプロパティベーステスト - 依存関係をモックする — mockall を使用してテスト対象のユニットを分離する
- テストを実行する (RED) — テストが期待通りに失敗することを確認する
- 実装する (GREEN) — テストを通過するための最小限のコードを書く
- リファクタリングする — テストを通過したまま、コードを改善する
- カバレッジを確認する — cargo-llvm-cov を使用し、80%以上を目標にする
RustのTDDワークフロー
RED-GREEN-REFACTOR サイクル
RED → まず失敗するテストを書く
GREEN → テストを通過する最小限のコードを書く
REFACTOR → テストを通過したままコードをリファクタリングする
REPEAT → 次の要件に進む
Rustでの段階的TDD
// RED: Write test first, use todo!() as placeholder
pub fn add(a: i32, b: i32) -> i32 { todo!() }
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_add() { assert_eq!(add(2, 3), 5); }
}
// cargo test → panics at 'not yet implemented'
// GREEN: Replace todo!() with minimal implementation
pub fn add(a: i32, b: i32) -> i32 { a + b }
// cargo test → PASS, then REFACTOR while…