Verify One Condition per Test(1つのテストにつき1つの条件を検証する)
1. 原則
テストケースでは1つのテストにつき1つの条件のみ検証しなければならない
- 1つのテストケースで、複数の条件の検証を行ってはならない
- テスト対象のメソッドが複数の結果を返す場合でも、それぞれを独立したテストとして記述する
- テスト対象のクラスのインスタンス化やデータのセットアップは共有できるが、検証ロジックは分離する
2. 根拠
目的の明確化
- テスト失敗時の原因特定を容易にする
- 複数のアサーションを含むテストが失敗した場合、どの条件が満たされなかったのか判断が難しい
- 単一条件のテストは、そのテストが検証している振る舞いを明確にする
3. 指針
テストの分割
- テスト対象のメソッドの振る舞いを細かく分析する
- 例えば、
createUser
メソッドがユーザーオブジェクトを生成し、データベースに保存し、通知メールを送信する場合
- これら3つの振る舞いをそれぞれ独立したテストケースに分割する
- 例:
test_user_is_created_with_correct_data
test_user_is_saved_in_database
test_notification_email_is_sent
4. 注意事項
過度な分割の回避
- 単一条件の原則は、テストの読みやすさと保守性を向上させるための指針である
- 必ずしも1つのアサーションしか書けないという厳密なルールではない
- 複数のアサーションが論理的に密接に関連している場合は、1つのテストにまとめることも検討する
- 例: オブジェクトの複数のプロパティが一度に更新されるようなケース