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

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

Laravel開発、ISBN一括で登録にて追加した機能をテストする

ISBNテキスト一括登録を追加しましたので、この時に実装した内容についてテストを作成しました。

複数ISBNとおなじアクションを使用しているので、重複部分についてはテストしていません。

今回の目的

追加実装したISBN一括登録に関してのテストを実施し、問題なく動作することを確認する

なぜやるか

追加項目が正常に動作していることを確認するため

やりたいこと

既存コントローラに追加した項目に対しての動作テストを実施する

やったこと

  • 一括登録フォームから送信して登録ができ、結果表示されること
  • ハイフン自動除去対応できていること
  • 空文字改行除去対応できていること
  • ISBN登録0件でバリデーションエラーとなること
  • 上限超過登録は受け付けしていないこと
  • 数値以外の受付をしていないこと

実施内容

一括ISBN登録ができることを確認する 

まとめて登録して情報が取得できていることを確認する

一括登録フォームからpost送信登録し、全ての結果が表示されることを確認します。

# ~/tests/Feature/BookdataTest.php

// 一括isbn登録と表示確認
public function test_someIsbnCommaCreate_ok(){
 //// ユーザー生成
 $user = factory(User::class)->create(); // ユーザーを作成
 $this->actingAs($user); // ログイン済み
 $this->assertTrue(Auth::check()); // Auth認証済であることを確認
 // isbnページアクセス
 $response = $this->get('/book/isbn_some_input'); // isbnへアクセス
 $response->assertStatus(200); // 200ステータスであること
 $response->assertViewIs('book.isbn_some_input'); // book.isbnビューであること
 // 登録
 $datas = [
  9784756918765,9784844366454,9784798052588,9784863542174,9784822282516,
  9784054066892,9784046023919,9784046023919,9784797397390,9784023332591,
 ]; // 登録用データ
 $isbns = implode(",", $datas); // フォーム入力用一括登録テキスト(カンマ区切り)
 $inputform = ['isbns' => $isbns]; // フォーム送信用データ生成
 $response = $this->from('book/isbn_some')->post('book/isbn_some', $inputform);
 // フォームよりpost送信
 $response->assertSessionHasNoErrors(); // エラーメッセージがないこと
 $response->assertStatus(200); // 200ステータスであること

 $response->assertSeeText('ISBNコード登録結果'); // 登録結果ページが出力されていること
 foreach($datas as $data){
  $response->assertSeeText($data); // 入力番号が反映されていること
 }
 $savebooks = Bookdata::all();
 foreach($savebooks as $savebook){
  $response->assertSeeText($savebook->title); // 取得した本のタイトルがが反映されていること
 }
}

$datasは結果としてタイトルが取得できていることを確認するために、実際にデータ取得できるISBNを選別して登録してあります。

登録するデータを変数内に登録しておき、implodeによってカンマ連結による文字列を生成しています。これにより$isbns="9784756918765,978〜"と変数にテキストひとかたまりとして変換しています。

postに登録するデータはテキストであるための処理です。一方で$datasに数値をカンマ区切りで登録しているのは、後で値が全て登録されていることのチェックに使用しています。

そして、最後はAPIによって登録したデータを呼び出し、それぞれの本のタイトルが結果として反映できていることを確認しています。

 

ハイフン自動除去対応できていること

入力値にハイフンがはいっている場合、自動的に削除する処理をしているので、この処理がきっちりと動作することをテストします。

# ~/tests/Feature/BookdataTest.php

// 一括isbn登録、ハイフン解除確認
public function test_someIsbnCommaHyphenCreate_ok(){
 //// ユーザー生成
 $user = factory(User::class)->create(); // ユーザーを作成
 $this->actingAs($user); // ログイン済み
 $this->assertTrue(Auth::check()); // Auth認証済であることを確認
 // 登録
 $testisbn = '978-4756918765'; // テスト用ISBNコード
 $inputform = ['isbns' => $testisbn]; // フォーム送信用データ生成
 $response = $this->from('book/isbn_some')->post('book/isbn_some', $inputform);
 // フォームよりpost送信
 $response->assertSessionHasNoErrors(); // エラーメッセージがないこと
 $response->assertStatus(200); // 200ステータスであること

 $response->assertSeeText('ISBNコード登録結果'); // 登録結果ページが出力されていること
 $data = str_replace('-', '', $testisbn); // 表示確認コード生成、ハイフンを取り除く
 $response->assertSeeText($data); // 入力番号が反映されていること
 $savebook = Bookdata::first();
 $response->assertSeeText($savebook->title); // 取得した本のタイトルがが反映されていること
}

半角ハイフン入りのデータを準備し、post送信しています。

アクション上で自動的にハイフンが削除され、その後は正常動作していることを確認します。

 

カンマ、改行削除に対応できていること 

カンマや改行によるデータの分割が正常に行えていることを確認します。

# ~/tests/Feature/BookdataTest.php

// 一括isbn登録、空文字削除対応確認
public function test_someIsbnCommaSpaceCreate_ok(){
 //// ユーザー生成
 $user = factory(User::class)->create(); // ユーザーを作成
 $this->actingAs($user); // ログイン済み
 $this->assertTrue(Auth::check()); // Auth認証済であることを確認
 // 登録
 $testisbn = "9784756918765\n9784844366454"; // テスト用ISBNコード
 $inputform = ['isbns' => $testisbn]; // フォーム送信用データ生成
 $response = $this->from('book/isbn_some')->post('book/isbn_some', $inputform);
 // フォームよりpost送信
 $response->assertSessionHasNoErrors(); // エラーメッセージがないこと
 $response->assertStatus(200); // 200ステータスであること

 $response->assertSeeText('ISBNコード登録結果'); // 登録結果ページが出力されていること
 $datas = preg_split("/[\s,]+/", $testisbn); // 確認用データを抽出
 foreach ($datas as $data){
  $response->assertSeeText($data); // 入力番号が反映されていること
 }
 $savebooks = Bookdata::all();
 foreach($savebooks as $savebook){
  $response->assertSeeText($savebook->title); // 取得した本のタイトルがが反映されていること
 }
}

改行を含むデータを準備しておき、post送信して2件のデータが出力できていることを確認しています。

確認用にテスト用データの改行を削除し、2件のISBNが処理結果画面で出力できていることを確認しています。

 

一括登録時のエラー出力を確認する 

ISBN登録0件でバリデーションエラーとなること

登録データが1件もない場合は処理結果画面は表示させずにバリデーションエラーとしてリダイレクトすることを確認します。

# ~/tests/Feature/BookdataTest.php

// 一括isbn登録エラー、タイトル0件
public function test_someIsbnCommaCreate_ng_notEntry(){
 //// ユーザー生成
 $user = factory(User::class)->create(); // ユーザーを作成
 $this->actingAs($user); // ログイン済み
 $this->assertTrue(Auth::check()); // Auth認証済であることを確認

 $bookpath ='book/isbn_some';
 $inputform = ['isbns' => null]; // フォーム送信用データ生成
 $response = $this->from($bookpath)->post($bookpath, $inputform);
 // フォームよりpost送信
 $response->assertSessionHasErrors(); // エラーメッセージがあること
 $response->assertStatus(302); // リダイレクト
 $response->assertRedirect($bookpath); // トップページ表示
 $this->assertEquals('ISBNコードが入力されていません',
 session('errors')->first('isbnrecords')); // エラメッセージを確認
}

データがないのでバリデーションエラーが出力され、リダイレクト後にエラーメッセージが表示できていれば確認完了です。

 

上限超過登録は受け付けしていないことを確認する

登録上限を設定しましたので、登録上限を超えたデータは登録されていないこと確認します。

# ~/tests/Feature/BookdataTest.php

// 一括isbn登録エラー、上限登録超過
public function test_someIsbnCommaCreate_ng_limitNumber(){
 //// ユーザー生成
 $user = factory(User::class)->create(); // ユーザーを作成
 $this->actingAs($user); // ログイン済み
 $this->assertTrue(Auth::check()); // Auth認証済であることを確認
 // 登録用配列生成(上限+1生成)
 $count = 20; // 上限数
 for ($i = 0; $i < $count+1; $i++){ // 上限数+1個生成
  $datas[] = 1234567890123 + $i; // 13桁コード作成(重複なし)
 }
 $bookpath ='book/isbn_some';
 $isbns = implode(",", $datas); // フォーム入力用一括登録テキスト(カンマ区切り)
 $inputform = ['isbns' => $isbns]; // フォーム送信用データ生成
 $response = $this->from($bookpath)->post($bookpath, $inputform);
 // フォームよりpost送信
 $response->assertSessionHasNoErrors(); // エラーメッセージがないこと
 $response->assertStatus(200); // 200ステータスであること

 $response->assertSeeText('ISBNコード登録結果'); // 登録結果ページが出力されていること
 // 編集ISBN番号結果確認
 for ($i = 0; $i < $count+1; $i++){
  if ($i < $count){ // 上限数まで結果表示されること
   $response->assertSeeText($datas[$i]); // 入力番号が反映されていること
  } else { // 上限超過データは扱われていないこと
   $response->assertDontSeeText($datas[$i]); // 入力番号が反映されていないこと
  }
 }
}

登録上限(今回の場合は20件)を設定しておき、$datasとして上限+1件のデータを生成してpost送信しています。

そして、登録結果画面に20件までのデータは処理されているので画面に表示されていることを確認します。21件目は処理対象外となっているので、結果画面に出力されていなければ想定している動作をしているといえます。

  

数値以外の受付をしていないこと

# ~/tests/Feature/BookdataTest.php

// 一括isbnエラー、数値以外入力
public function test_someIsbnCommaCreate_ng_notNumber(){
 //// ユーザー生成
 $user = factory(User::class)->create(); // ユーザーを作成
 $this->actingAs($user); // ログイン済み
 $this->assertTrue(Auth::check()); // Auth認証済であることを確認
 // 登録
 $datas = [
  '978ー4756918765', // 全角文字あり
  '97847@56918765', // 記号あり
  '9784756918765', // 全角数字
  '9784756i18765', // 半角英字あり
 ];
 foreach ($datas as $data){
  $inputform = ['isbns' => $data]; // フォーム送信用データ生成
  $bookpath ='book/isbn_some';
  $response = $this->from($bookpath)->post($bookpath, $inputform);
  // フォームよりpost送信
  $response->assertSessionHasNoErrors(); // エラーメッセージがないこと
  $response->assertStatus(200); // 200ステータスであること
 
  $response->assertSeeText('ISBNコード登録結果'); // 登録結果ページが出力されていること
  $response->assertSeeText($data); // 入力番号が反映されていること
  $response->assertSeeText('数値ではありません'); // エラー名が表示されていること
 }
}

数値以外の情報を含むデータをいくつか用意してそれぞれテストしています。

半角ハイフンはハイフンを取り除いて正常動作していることは確認済みです。

配列内にテストデータを準備しておき、post送信することで数値でない旨のメッセージが出力されていることを確認しています。

まとめて登録すると、どの番号に対してのメッセージかまでは判別できないので、1件ずつpost送信しています。結果としてはすべて同じになるので、送信処理から結果までをforeachで繰り返すことでテストを行っています。

 

以上で一括登録に対してのテストは完了です。

一括登録に関連する処理は完了したので、次はまとめて削除するパターンも作成してみたいです。