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

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

Laravel開発、ISBNレコードを複数登録する【4】複数登録に対してのテストを実施する

複数ISBN登録は作成できましたが、一部修正を行うことにしました。

ISBN未入力については結果を表示しないことと、処理状況が分かりやすいコードに修正を行っていきます。

最終目的

ISBNコードを10件まで1フォームから入力して登録できるようにする

今回の目的

  • ISBN複数登録に対してテストコードを用意し、正常動作を確認する

なぜやるか

  • 複数登録処理が問題なく動作していることを確認するため

やりたいこと

  • 正しく入力された処理が正しいと判断されること
  • 想定される問題点に対して正常どうさしていること

やったこと

  • 13桁コードを複数入力して正常動作すること
  • 全件未入力時にバリデーションエラーとなること
  • 桁数アンマッチで想定される結果出力されること
  • フォーム重複登録で想定される結果出力されること
  • DB登録済みで想定される結果出力されること
  • API検索結果がなかった場合の結果出力が正常にされること

実施内容

複数ISBN登録ができることを確認する 

まずは登録が行えることを確認します。

# ~/tests/Feature/BookdataTest.php

// 複数isbn登録と表示確認
public function test_someIsbnCreate_ok(){
 //// ユーザー生成
 $user = factory(User::class)->create(); // ユーザーを作成
 $this->actingAs($user); // ログイン済み
 $this->assertTrue(Auth::check()); // Auth認証済であることを確認
 // isbnページアクセス
 $response = $this->get('/book/isbn_some'); // isbnへアクセス
 $response->assertStatus(200); // 200ステータスであること
 $response->assertViewIs('book.isbn_some'); // book.isbnビューであること
 // 登録
 $isbn0 = 9784798052588;
 $isbn1 = 9784756918765;
 $isbns = [
  'isbn0' => $isbn0,
  'isbn1' => $isbn1,
 ]; // 新規登録コード
 $response = $this->from('book/isbn_some')->post('book/isbn_some', $isbns);
 // isbn情報保存
 $response->assertSessionHasNoErrors(); // エラーメッセージがないこと
 $response->assertStatus(200); // 200ステータスであること

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

まずログインを実施しておき、複数ISBN登録ページにアクセスできることを確認します。

登録コードを複数用意してまとめてpost送信を行い、登録結果ページで各ISBN及びISBNから取得したタイトル名が表示できていることを確認しています。

 

登録に失敗するパターンをテストする

正常に登録する処理はできましたので、途中問題があり登録できないパターンについてテストを行っていきます。

ISBNが1件も入力されていない時

# ~/tests/Feature/BookdataTest.php

// 複数isbn登録エラー、登録なし
public function test_someIsbnCreate_ng_notEntry(){
 //// ユーザー生成
 $user = factory(User::class)->create(); // ユーザーを作成
 $this->actingAs($user); // ログイン済み
 $this->assertTrue(Auth::check()); // Auth認証済であることを確認
 // 登録
 $bookpath = 'book/isbn_some';
 $response = $this->from($bookpath)->post($bookpath, []); // isbn情報保存
 $response->assertSessionHasErrors(['isbnrecords']); // エラーメッセージがあること
 $response->assertStatus(302); // リダイレクト
 $response->assertRedirect($bookpath); // トップページ表示
 $this->assertEquals('ISBNコードが入力されていません',
 session('errors')->first('isbnrecords')); // エラメッセージを確認
}

登録がない場合はバリデーションによるエラーとしていました。

post送信を行うとエラーメッセージを受け取るので、メッセージがあること・リダイレクトされること・メッセージが出力されていることを確認しています。

 

ISBNの桁数が合わない時

# ~/tests/Feature/BookdataTest.php

// 複数isbn登録エラー、コード12桁
public function test_someIsbnCreate_ng_isbn12(){
 //// ユーザー生成
 $user = factory(User::class)->create(); // ユーザーを作成
 $this->actingAs($user); // ログイン済み
 $this->assertTrue(Auth::check()); // Auth認証済であることを確認
 // 登録
 $isbn0 = 123456789012;
 $isbns = [
  'isbn0' => $isbn0,
 ]; // 新規登録コード
 $bookpath = 'book/isbn_some';
 $response = $this->from($bookpath)->post($bookpath, $isbns); // isbn情報保存
 $response->assertSessionHasNoErrors(); // エラーメッセージがないこと
 $response->assertStatus(200); // 200ステータスであること

 $response->assertSeeText('ISBNコード登録結果'); // 登録結果ページが出力されていること
 $response->assertSeeText($isbn0); // 入力番号が反映されていること
 $response->assertSeeText('桁数が13桁ではありません。');
 // 取得できていない旨のメッセージが表示されること
}

全件未入力以外に関しては処理結果を専用ページにて出力としていましたので、バリデーションによるエラーではなく、結果画面にメッセージを出力するとしていました。

ですので、バリデーションとしては特にエラーはありません。

桁数不一致により登録結果画面で13桁でないという旨のメッセージが出力されていることを確認しています。

今回はISBNを12桁でテストしたパターンですが、14桁も同様にテストしています。

 

フォーム入力ISBN重複時

# ~/tests/Feature/BookdataTest.php

// 複数isbn登録エラー、フォーム重複
public function test_someIsbnCreate_ng_formEntryDouble(){
 //// ユーザー生成
 $user = factory(User::class)->create(); // ユーザーを作成
 $this->actingAs($user); // ログイン済み
 $this->assertTrue(Auth::check()); // Auth認証済であることを確認
 // 登録
 $isbn0 = 9784798052588;
 $isbn1 = 9784798052588;
 $isbns = [
  'isbn0' => $isbn0,
  'isbn1' => $isbn1,
 ]; // 新規登録コード
 $bookpath = 'book/isbn_some';
 $response = $this->from($bookpath)->post($bookpath, $isbns); // isbn情報保存
 $response->assertSessionHasNoErrors(); // エラーメッセージがないこと
 $response->assertStatus(200); // 200ステータスであること

 $response->assertSeeText('ISBNコード登録結果'); // 登録結果ページが出力されていること
 $response->assertSeeText($isbn0); // 入力番号が反映されていること
 $response->assertSeeText("1件目のデータと同じです。"); // 重複メッセージが表示されること
}

フォームには複数ISBNを登録できるようにしましたが、同じISBNが入力された場合の処理をテストしました。

2件目のデータ出力時に1件目のデータと同じですと出力されていることを確認しています。

 

DB登録済みISBN登録時

# ~/tests/Feature/BookdataTest.php

// 複数isbn登録エラー、DB重複
public function test_someIsbnCreate_ng_InDbEntry(){
 //// ユーザー生成
 $user = factory(User::class)->create(); // ユーザーを作成
 $this->actingAs($user); // ログイン済み
 $this->assertTrue(Auth::check()); // Auth認証済であることを確認
 // faker book自動生成
 $bookdata = factory(Bookdata::class)->create([
  'title' => 'a',
  'isbn' => '9784798052588'
 ]); // DBにISBNを登録しておく

 // 登録
 $isbn0 = 9784798052588;
 $isbns = [
  'isbn0' => $isbn0,
 ]; // 新規登録コード
 $bookpath = 'book/isbn_some';
 $response = $this->from($bookpath)->post($bookpath, $isbns); // isbn情報保存
 $response->assertSessionHasNoErrors(); // エラーメッセージがないこと
 $response->assertStatus(200); // 200ステータスであること

 $response->assertSeeText('ISBNコード登録結果'); // 登録結果ページが出力されていること
 $response->assertSeeText($isbn0); // 入力番号が反映されていること
 $response->assertSeeText("既に登録されています。"); // 重複メッセージが表示されること
}

次はDBに既に登録されている情報を追加した時のテストです。

DBにISBN番号指定で登録を行っておき、同じ番号をpost送信しています。

DB上に先にデータを作成しているので、すでに登録済みとなり、重複登録している旨のメッセージが表示されていることを確認しています。

 

API検索結果がなかった場合

# ~/tests/Feature/BookdataTest.php

// 複数isbn登録エラー、API検索結果なし
public function test_someIsbnCreate_ng_findNotData(){
 //// ユーザー生成
 $user = factory(User::class)->create(); // ユーザーを作成
 $this->actingAs($user); // ログイン済み
 $this->assertTrue(Auth::check()); // Auth認証済であることを確認

 // 登録
 $isbn0 = 1234567890123;
 $isbns = [
  'isbn0' => $isbn0,
 ]; // 新規登録コード
 $bookpath = 'book/isbn_some';
 $response = $this->from($bookpath)->post($bookpath, $isbns); // isbn情報保存
 $response->assertSessionHasNoErrors(); // エラーメッセージがないこと
 $response->assertStatus(200); // 200ステータスであること

 $response->assertSeeText('ISBNコード登録結果'); // 登録結果ページが出力されていること
 $response->assertSeeText($isbn0); // 入力番号が反映されていること
 $response->assertSeeText('該当するISBNコードは見つかりませんでした。');
 // 取得できていない旨のメッセージが表示されること
}

最後はAPIによる検索まで実施するも、データがなかった場合です。

結果としてデータがない情報を準備しておき、post送信して登録結果がなかった場合のメッセージが出力されていることを確認しています。

 

実際の処理に問題がみつかる

このテストが通れば一通り完了…といきたかったのですが、最後のAPI検索して書籍情報がなかったというテストは失敗しました。

テストに問題があるわけではなく、実際の処理方法に問題があることが分かりましたので、テストはこのままにしておき、次で処理を修正することにしました。