GitHubでこのページを編集

Home / 5 / ucmitz / test / ユニットテスト実装ガイド

ユニットテスト実装ガイド

ここではユニットテストを実装するにあたっての基本的な考え方を記載しています。
実装手法の参考にしてください。

1. このメソッドの意図は何かを考える

例えば、ブログ記事を追加するというメソッドがあった場合、データに不備があると困るだろうと考えます。
そうするとテストしなければならない内容はシンプルに次の2つとなります。

  • 正常に追加されるテスト
  • 正常に追加されないテスト

2. メソッドの結果が何かを考える

基本的にメソッドの結果は次の3つとなる事が多いです。その内容を検証する事になります。

  • 状態が変わる
  • 成功の結果
  • 失敗の結果

失敗のテストもできるか考えてみましょう。

3. メソッドの責務を考える

メソッドが何かを追加するメソッドだとしても、追加する際の詳細な処理は、そのメソッドの中で呼び出している別のメソッドが持っている場合があります。

例えば、コントローラー経由でブログ記事を追加するテストの場合、コントローラーでは、データの詳細な問題は特に知らず、「テーブルやサービスから返された、エラー内容を表示する」というのが責務になります。

そうすると、コントローラーのテストでは、バリデーションの詳細な内容のテストは不要で、ステータス、メッセージ、リダイレクトの有無などがテストすべき内容となります。

4. コメントを書く

また、できるだけ、テストの中で何のテストをやっているのかというコメントを記載してください。
そうするとレビュアーにもテストの意図が伝わり、レビューが捗ります。

5. 必要なコードだけを書くようにする

できるだけ無駄なコード、テストを省き、メソッドの仕様に必要なテストだけを書くようにしてください。

6. FixtureFactory でテストデータの再利用を行う

FixtureFactoryでデータを生成する際、テストに必要なフィールドはできるだけ指定しないようにしてください。
※ FixtureFactoryでは、フィールドに値を指定しない場合、自動でランダムな値が入る仕様です。

また、FixtureFactory側に再利用しやすいメソッドを追加してできるだけ再利用してください。

// FixtureFactory メソッド例
public function byPosted($posted)
{
    return self::make([
        'status' => true,
        'posted' => $posted,
    ]);
}