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

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

Laravel開発、bookdataテーブルをテストする【1】正常動作を確認する

アプリのテストを行うことで、動作の確認を実施しています。

今回はbookdataテーブルが関係するテストを実装していきます。

※画像アップロードは実装に苦戦したので、後ほど実装として今回は除外。できるところから実装してみました。

今回の目的

bookdataテーブルに関するテストを実装し、正常動作することを確認する

動作失敗パターンは別途作成とする。

なぜやるか

プログラムによる正常動作テストを行い、問題がないか確認するため

やりたいこと

本情報の新規登録・編集・検索・削除の一連の動作が実施できることを確認する

やったこと

テストするべき項目を検討する

テストの準備をする

テスト用bookdataファクトリーを作成する

テストコードを書く

実施内容

bookdataテーブルを利用した動作をテストする

テストの実施項目を検討する

エラーなく処理が完了することをテストしてきます。

テスト項目をあげてみました。

  1. bookページにアクセスする
  2. 本情報を登録する(手動登録)
  3. 本情報を登録する(ISBN登録)
  4. 登録本の一覧表示
  5. 登録本の詳細表示
  6. 編集
  7. 編集後表示確認
  8. 検索
  9. 検索結果確認
  10. 削除
  11. 削除後消去確認

これらをテストできるようにしていきます。

 

テスト環境の準備

bookdataテスト用の準備を実施してきます。

 

まず、テスト記述用ファイルの生成。

$ php artisan make:test BookdataTest

 

bookdata生成用のファクトリーファイルも準備しておきます。

$ php artisan make:factory BookdataFactory

 

factoryデータを作成する。

bookdata生成をできるようにファクトリーを作成しておきます。

# ~/database/factories/BookdataFactory.php

<?php

use App\Bookdata;
use Faker\Generator as Faker;

$factory->define(Bookdata::class, function (Faker $faker) {
return [
'detail' => $faker->name,
'isbn' => $faker->unique()->isbn13,
'title' => $faker->name,
'volume' => $faker->name,
'series' => $faker->name,
'publisher' => $faker->name,
'pubdate' => $faker->date,
'author' => $faker->name
];
});

予めファイルを作っておくことで、データを自動生成できるようにしておきます。 

Fakerで扱える形式については、こちらを参考にさせて頂きました、ありがとうございます。

github.com

といっても、とりあえず仮のデータとしてnameで作成していますが…。

isbnは専用の設定があったので、使えそうです。

 

テストコードを書く

それでは実際にコードを書いていきます。

indexにアクセスする

まずはindexビューにアクセスできることから確認です。

# ~/tests/Feature/BookdataTest.php

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use App\User;
use App\Bookdata;
use Illuminate\Support\Facades\Auth;

class BookdataTest extends TestCase
{
use DatabaseMigrations;
/**
* A basic feature test example.
*
* @return void
*/

// トップページアクセス確認
public function test_indexAccess_ok()
{
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認

$response = $this->get('/book'); // bookへアクセス
$response->assertStatus(200); // 200ステータスであること
}

ログイン必須となるため、ログイン処理をしてからアクセスすることを確認です。

 

本情報を登録し確認する

初めは登録されている本がないので、登録から実施します。

# ビュー

f:id:Fippiy:20190428150320p:plain

book登録フォーム

個別入力による新規登録フォームです、ここからタイトルと詳細を記入して登録ボタンを押すという流れをテストします。

test_book_Controll_okという名前で、一連の流れでチェックを続ける形で記載しました。

# ~/tests/Feature/BookdataTest.php

public function test_bookControll_ok()
{
//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認

//// createページアクセス
$response = $this->get('/book/create'); // createへアクセス
$response->assertStatus(200); // 200ステータスであること
$response->assertViewIs('book.create'); // book.createビューであること

//// 登録
$bookdata = [
'title' => 'テストブック',
'detail' => '詳細はこちら',
];
$response = $this->from('book/create')->post('book', $bookdata); // 本情報保存
$response->assertSessionHasNoErrors(); // エラーメッセージがないこと
$response->assertStatus(302); // リダイレクト
$response->assertRedirect('/book'); // トップページ表示
↓続く

テストの冒頭部分です。登録ページへアクセスしてフォームよりタイトルと詳細を記入してpost送信し、登録後にリダイレクトしていることを確認しています。

↓続き
// 登録されていることの確認(indexページ)
$response = $this->get('book'); // bookへアクセス
$response->assertStatus(200); // 200ステータスであること
$response->assertViewIs('book.index'); // book.indexビューであること
$response->assertSeeText($bookdata['title']); // 登録タイトルが表示されていること
↓続く

登録確認としてトップページに登録本の一覧が表示されているので、対象のタイトルが表示されていることを確認しています。

assertSeeTextによって表示ビュー上に指定したテキストがあることを確認しています。

詳細情報を確認する

一覧表示にはタイトルしか表示されないので、showビューにて詳細を記入した内容も確認します。

↓続き
// 詳細ページで表示されること
$savebook = Bookdata::all()->first(); // 保存情報確認
$response = $this->get('book/'.$savebook['id']); // 指定bookへアクセス
$response->assertStatus(200); // 200ステータスであること
$response->assertViewIs('book.show'); // book.showビューであること
foreach ($savebook as $value)
{
$response->assertSeeText($value);
}; // savebookデータが表示されていること
↓続く

DBに保存されているレコードを取得しておき、showビューにアクセスしてレコードデータが表示されているかを確認しています。

 

登録情報を編集する

続いて、先程登録した本の情報を編集します。

↓続き
//// 編集
// 写真なしパターン
$edit_post = 'book/'.$savebook['id']; // 編集パス
$response = $this->get($edit_post.'/edit'); // 編集ページへアクセス
$response->assertStatus(200); // 200ステータスであること
$response->assertViewIs('book.edit'); // book.editビューであること
↓続く

まずは、editビューにアクセスできることを確認します。

 

↓続き
// 編集内容
$editbookdata = [
'title' => 'テストブック編集',
'detail' => 'テストとして変更した詳細',
'_method' => 'PUT',
];
$response = $this->from($edit_post.'/edit')->post($edit_post, $editbookdata);
 // 編集実施
$response->assertSessionHasNoErrors(); // エラーメッセージがないこと
$response->assertStatus(302); // リダイレクト
$response->assertRedirect('/book'); // トップページ表示
↓続く

editビューのフォームから変更データを入力しています。

create同様、post送信するデータを用意しています。

フォーム上でhidden,methodとしてput送信しているため、配列にも組み込んでいます。

↓続き
// 編集されていることの確認(indexページ)
$response = $this->get('book'); // bookへアクセス
$response->assertStatus(200); // 200ステータスであること
$response->assertViewIs('book.index'); // book.indexビューであること
$response->assertSeeText($editbookdata['title']); // 編集タイトルが表示されていること
↓続く

編集した後の確認です、こちらは新規登録時と同じ内容になります。

 

登録情報を削除する

このまま流れとして削除までテストします。

↓続き
//// 削除
// 写真なしパターン
$response = $this->from('book/'.$savebook['id'])->post('book/'.$savebook['id'], [
'_method' => 'DELETE',
]); // 削除実施
$response->assertSessionHasNoErrors(); // エラーメッセージがないこと
$response->assertStatus(302); // リダイレクト
$response->assertRedirect('/book'); // トップページ表示

// 削除されていることの確認(indexページ)
$response = $this->get('book'); // bookへアクセス
$response->assertStatus(200); // 200ステータスであること
$response->assertViewIs('book.index'); // book.indexビューであること
$response->assertDontSeeText($editbookdata['title']); // 削除タイトルが表示されていないこと

削除については詳細画面に設置している削除ボタンを押すと即座に削除される仕様となっています。

削除ボタンクリック後の動作としてテストを実装しました。

編集と同様にメソッド指定をして実行し、最後にタイトル名がないことを持ってテスト完了としています。

まず、ここまでで基本的な追加・編集・削除についてテストしました。

 

ISBN登録をテストする

残っているテスト項目を実施していきます。

ISBNによる登録機能を設置していますので、まずこれをテスト。

// isbn登録と表示確認
public function test_isbnCreate_ok()
{
//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認

// isbnページアクセス
$response = $this->get('/book/isbn'); // isbnへアクセス
$response->assertStatus(200); // 200ステータスであること
$response->assertViewIs('book.isbn'); // book.isbnビューであること

// 登録
$isbn = ['isbn' => 9784798052588]; // 新規登録コード
$response = $this->from('book/isbn')->post('book/isbn', $isbn); // isbn情報保存
$response->assertSessionHasNoErrors(); // エラーメッセージがないこと
$response->assertStatus(200); // 200ステータスであること
$response->assertSeeText('データを新規作成しました'); // メッセージが出力されていること
 
// 登録されていることの確認(indexページ)
$savebook = Bookdata::all()->first(); // 保存されたデータを取得
$response = $this->get('book'); // bookへアクセス
$response->assertStatus(200); // 200ステータスであること
$response->assertViewIs('book.index'); // book.indexビューであること
$response->assertSeeText($savebook['title']); // bookdataタイトルが表示されていること

// 詳細ページで表示されること
$response = $this->get('book/'.$savebook['id']); // 指定bookへアクセス
$response->assertStatus(200); // 200ステータスであること
$response->assertViewIs('book.show'); // book.showビューであること
foreach ($savebook as $value)
{
$response->assertSeeText($value);
}; // savebookデータが表示されていること
}

ベースとなるテストは先程までのテストと同じです。登録にあたってはISBN専用ページよりpost送信し、isbn番号をいれておくことにより、データ保存し、対象のタイトルが表示されることを確認しました。

 

検索をテストする

最後に、検索機能についてテストしました。

// 検索
public function test_findTitle_ok()
{
//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認

// faker book自動生成
$bookdata = factory(Bookdata::class)->create();

//// 検索
// 検索の実施(findページ)
$find_post = 'book/find'; // 検索パス
$savebook = Bookdata::all()->first(); // 保存されたデータを取得
$response = $this->get($find_post); // 編集ページへアクセス
$response->assertStatus(200); // 200ステータスであること
$response->assertViewIs('book.find'); // book.editビューであること
$response = $this->from($find_post)->post($find_post, ['title' => $bookdata->title]);
 // 検索実施
$response->assertSessionHasNoErrors(); // エラーメッセージがないこと
$response->assertStatus(200); // 200ステータスであること
$response->assertSeeText($bookdata->title); // bookdataタイトルが表示されていること
}

登録等のテストは終わっていますので、ここでfactoryによるbookdata生成を利用し、検索できることをチェックしました。

検索フォームにタイトル名を入力して検索結果画面上にタイトルが表示されていることを確認しています。

 

以上で一端正常動作についてはテスト完了です。

次はエラー時のテストを実装していきます。