Fippiyのプログラム学習内容アウトプットBlog

日々の学習内容をアウトプットして振り返りを実施する。

Laravel開発、ページネーション機能をつける【5】ページネーションテストを作成する

ページネーションの実装が完了したので、最後にページネーションに対してのテストを実施していきます。

今回の目的

ページネーション対応したページにて正常表示できていることをテストする

なぜやるか

ページ変更して正常表示できていることを担保するため

やりたいこと

  • indexリスト表示で2ページ目にタイトルが表示できていることを確認する
  • 検索結果表示で2ページ目にタイトルが表示できていることを確認する

やったこと

  • テスト作成手順を検討する
  • 書籍情報・所有書籍情報に対してテストを行う
  • テストレコード数とページネーション表示値からページ数を算出する
  • ページ毎に表示・非表示を確認する
  • 使用しないページにアクセスした場合をテストする

実施内容

テスト方法を検討する

ページ毎に表示されている項目をどう確認するか

一覧表示ページにてページネーションによって複数ページが作成された時に、各ページで表示されるべき本のタイトルが表示されていることをテストする訳ですが…どうてすとするかをまず考えました。

2ページ目を表示させて確認する必要がある

1ページ内に表示できる上限は、今回は20項目と設定していました。ですので、21件のデータを用意すれば2ページ目が表示されます。この状態で1ページ目に最初の20件が表示されていること、2ページ目で21件目が表示されていることを確認で完了しそうです。

もう少しプログラムらしく作成する

上限が20件と決まっていればそれでいいのですが、上限は変更になる可能性もあるので、可変するページ上限数でも対応できるようにしたいところです。

また、1ページ目に表示されるべきタイトルがあることを確認する…だけではなく、1メージ目に表示されるべきではない2ページ目以降のタイトルが表示されていない!ことも確認するほうが、より精度が高いといえるでしょう。

そこで、複数のページをチェックできなおかつ、各ページ内で表示されるべき物があること、表示されない物が表示されていないことをテストすることにしました。

 

テストを作成する

ページ毎にテストできるコードを作成する

上記の条件を満たすコードを作成しました。

まず内容の前に作成した全コードを先に表示します。

 

 # ~/tests/Feature/BookdataTest.php

// ページネーション表示テスト
public function test_bookControll_ok_paginationView(){
 //// ユーザー生成
 $user = factory(User::class)->create(); // ユーザーを作成
 $this->actingAs($user); // ログイン済み
 $this->assertTrue(Auth::check()); // Auth認証済であることを確認
 // 件数設定
 $datarecords = 21; // テストレコード数
 $paginate = 20; // 1ページ表示数
 $totalpage = ceil($datarecords/$paginate); // 表示ページ総数
 // faker 自動生成
 $books = factory(Bookdata::class, $datarecords)->create();
 // index表示パス
 $viewpath = 'book?page=';
 for ($i = 1; $i <= $totalpage; $i++){ // ページ数分繰り返し
  $response = $this->get($viewpath.$i); // 各ページへアクセス
  $response->assertStatus(200); // 200ステータスであること
  // 表示ページに対してデータが確認できること
  // レコード件数/総数で対象ページを算出
  $j = 0;
  foreach($books as $book){
   $j++;
   if ($i == ceil($j/$paginate)) { // 表示ページデータの場合
    $response->assertSeeText($book->title); // 対象ページに表示されていること
   } else { // 表示ページデータでない場合
    $response->assertDontSeeText($book->title); // 対象ページに表示されていないこと
   }
  }
 }
}

まず初めにユーザーを準備しログイン状態としておきます。

 

次にページネーション関連設定を準備しました

 # ~/tests/Feature/BookdataTest.php

// 件数設定
$datarecords = 21; // テストレコード数
$paginate = 20; // 1ページ表示数
$totalpage = ceil($datarecords/$paginate); // 表示ページ総数
// faker 自動生成
$books = factory(Bookdata::class, $datarecords)->create();
 

$datarecordsとしてテスト用に作成する本のデータレコードを設定します。

$paginateは1ページに表示する上限です。今回は20で設定していたので、20としています。

$totalpageでは、実際に表示されるページ数を算出しました。レコード数/ページ数を切り上げで計算することで算出しています。こうすることで、値さえ設定すれば全件に対してテストが実施できます。

後は、factoryを利用して設定済みのレコード数分だけ本の情報をDBへ作成します。

 

# ~/tests/Feature/BookdataTest.php

 // index表示パス
 $viewpath = 'book?page=';
 for ($i = 1; $i <= $totalpage; $i++){ // ページ数分繰り返し
  $response = $this->get($viewpath.$i); // 各ページへアクセス
  $response->assertStatus(200); // 200ステータスであること
  // 表示ページに対してデータが確認できること
  // レコード件数/総数で対象ページを算出
  $j = 0;
  foreach($books as $book){
   $j++;
   if ($i == ceil($j/$paginate)) { // 表示ページデータの場合
    $response->assertSeeText($book->title); // 対象ページに表示されていること
   } else { // 表示ページデータでない場合
    $response->assertDontSeeText($book->title); // 対象ページに表示されていないこと
   }
  }
 }
}

設定完了後は、DB登録されたデータが表示・非表示であることを確認します。

一覧表示ページのパスは~/book、さらにページ分けすると~/book?page=1などになりますので、ページ用パスをまず作成しておき、ページ単位でforによって処理を開始し、$viewpath.$i1としてページ単位でアクセスします。

アクセス後は、表示ページに対して表示されるべきデータがあれば、データがあること。逆に、表示されないデータは表示されていないことを判定しています。

 

 

存在しないページにアクセスした場合をテスト

~?page=xとURLを指定することでページ毎にデータが表示されていました。

ここでは、データ数に対して使用しないページにアクセスした場合のテストを行いました。

 # ~/tests/Feature/BookdataTest.php

// ページネーション表示、ページ超過
public function test_bookControll_ng_paginationViewOverPage(){
 //// ユーザー生成
 $user = factory(User::class)->create(); // ユーザーを作成
 $this->actingAs($user); // ログイン済み
 $this->assertTrue(Auth::check()); // Auth認証済であることを確認
 // 件数設定
 $datarecords = 21; // テストレコード数
 // faker 自動生成
 $books = factory(Bookdata::class, $datarecords)->create();
 // index表示パス
 $viewpath = 'book?page=';
 // 表示ページ
 $page = 3;
 $response = $this->get($viewpath.$page); // 各ページへアクセス
 $response->assertStatus(200); // 200ステータスであること
 // 表示ページにデータが出力されていないこと
 foreach($books as $book){
  $response->assertDontSeeText($book->title); // 対象ページに表示されていないこと
 }
}

ページネーションあたりの表示件数を20件とした場合、データが21件の場合は3ページ目に表示するデータはありません。

そこで、3ページ目に対してアクセスした場合に全データが表示されていないことを確認しました。

 

所有書籍情報に対してのテスト

所有書籍ページの一覧表示に対してもページネーション対応できていることを確認します。

# ~/tests/Feature/PropertyTest.php

// ページネーション表示テスト
public function test_bookControll_ok_paginationView(){
 //// ユーザー生成
 $user = factory(User::class)->create(); // ユーザーを作成
 $this->actingAs($user); // ログイン済み
 $this->assertTrue(Auth::check()); // Auth認証済であることを確認
 // 件数設定
 $datarecords = 21; // テストレコード数
 $paginate = 20; // 1ページ表示数
 $totalpage = ceil($datarecords/$paginate); // 表示ページ総数
 // faker 自動生成
 $properties = factory(Property::class, $datarecords)->create([
  'user_id' => $user->id,
 ]);
 // index表示パス
 $viewpath = 'property?page=';
 for ($i = 1; $i <= $totalpage; $i++){ // ページ数分繰り返し
  $response = $this->get($viewpath.$i); // 各ページへアクセス
  $response->assertStatus(200); // 200ステータスであること
  // 表示ページに対してデータが確認できること
  // レコード件数/総数で対象ページを算出
  $j = 0;
  foreach($properties as $property){
   $j++;
   if ($i == ceil($j/$paginate)) { // 表示ページデータの場合
    $response->assertSeeText($property->bookdata->title);
    // 対象ページに表示されていること
   } else { // 表示ページデータでない場合
    $response->assertDontSeeText($property->bookdata->title);
    // 対象ページに表示されていないこと
   }
  }
 }
}

こちらも書籍情報ページネーションテストとほぼ同じです。ログインユーザーの所有書籍としてデータ登録するために、user_idを固定にしています。

表示確認には書籍のタイトルを使用するため、リレーションによって書籍情報を取得できるようにしました。

 

所有書籍ページネーションにて存在しないページもテストする

こちらも同様にデータ数に対して使用しないページにアクセスした場合のテストを行いました。

# ~/tests/Feature/PropertyTest.php

// ページネーション表示、ページ超過
public function test_bookControll_ok_paginationViewOverPage(){
 //// ユーザー生成
 $user = factory(User::class)->create(); // ユーザーを作成
 $this->actingAs($user); // ログイン済み
 $this->assertTrue(Auth::check()); // Auth認証済であることを確認
 // 件数設定
 $datarecords = 21; // テストレコード数
 // faker 自動生成
 $properties = factory(Property::class, $datarecords)->create([
  'user_id' => $user->id,
 ]);
 // index表示パス
 $viewpath = 'property?page=';
 // 表示ページ
 $page = 3;
 $response = $this->get($viewpath.$page); // 各ページへアクセス
 $response->assertStatus(200); // 200ステータスであること
 // 表示ページにデータが出力されていないこと
 foreach($properties as $property){
  $response->assertDontSeeText($property->bookdata->title);
  // 対象ページに表示されていないこと
 }
}

書籍情報での表示できないページや、所有書籍ページネーションテストのコードを利用して記述しています。

 

以上でページネーション対応に対する表示が行えているかをテストしました。