Laravelのテストクラスの作成
laravelのテストクラスの作成は、artisanコマンドで実施します。下記はfeatureテストクラスを作成します。
sail php artisan make:test UserTest
Laravelのテストケースの作成方法
検証したいことを、まずは書き出す
1.ログインユーザがbook.indexにアクセスできるか?
2.ログインしてないユーザがbook.indexにアクセスできないかか?
3.book.detailにアクセスできるか?
4.存在しない値でbook.detailにアクセス出来ないことを確認する
5.book.editにアクセスできるか?
6.存在しない値でbook.editにアクセス出来ないことを確認する
7.book.editで正常系のテストを実施する
8.book.editで異常系のテストを実施する
9.book.newで正常系のテストを実施する
10.book.newで異常系のテストを実施する
11.removeで正常系のテストを実施する
12.removeで異常系のテストを実施する
13.検索機能が正常にテスト出来ること
Laravelのテスト名について
LaravelのUnitTestのテスト名は下記のいずれかになります。
- 「test_」から始める
- コメントに「@test」をつける(この場合は「test_」から始める必要はなし)
また、テスト名は、事前に自身でルールを決めておいたほうがいいです。そうしないと、あとあとテストケースを探すのに苦労します。
例えば
test_<url>_<証明する内容>
Laravelのテストの実行
laravel sailを利用している場合は、下記コマンドで一発で実行できます。
sail test
Laravelで特定のクラスをテストする方法
sail test tests/Feature/BookTest.php
Laravelで特定のメソッドをテストする方法
sail test --filter test_book_index_ng tests/Feature/BookTest.php
Laravelでユーザをログインさせてテストする方法
actingAsにUserモデルを入れるとログインした形でget、post、patch、put、deleteが出来ます。
その際には、factoryでユーザを作成する必要があります。
use App\Models\User;
$user = User::factory()->create();
use App\Models\Book;
$response = $this->actingAs($user)->get('/book');
$response = $this->actingAs($user)->get("/book/detail/$book->id");
$response = $this->actingAs($user)->get("/book/edit/$book->id");
$response = $this->actingAs($user)->post('/book/create', $params);
$response = $this->actingAs($user)->patch('/book/update', $params);
$response = $this->actingAs($user)->put('/book/create', $params);
$response = $this->actingAs($user)->delete('/book/remove', $params);
Laravelテストでエラーになったコードのバグ修正の方法
$book = Book::findOrFail($id);
Laravelで更新処理のテストをする方法
httpステータス、セッション、DBの値をテストしてます。
public function test_book_update_ok(){ $user = User::factory()->create(); $book = Book::factory()->create(); $params = [ 'id' => $book->id, 'name' => 'test', 'status' => 1, 'author'=> 'test', 'publication'=> 'test', 'read_at'=> '2022-10-01', 'note'=> 'test', ]; $response = $this->actingAs($user)->patch('/book/update', $params); $response->assertStatus(302); // httpステータスが302を返すこと $response->assertSessionHas('status', '本を更新しました。'); // セッションにstatusが含まれていて、値が「本を更新しました。」となっていること $this->assertDatabaseHas('books', $params); // dbの値が更新されたこと }
Laravelで更新処理のバリデーションをテストする方法
更新処理は、update
追加処理は、create
削除処理は、remove
に変えてテストします。
create時は、bookのfactoryのcreateは不要です。
public function test_book_update_status_ng_all()
{
$user = User::factory()->create();
$book = Book::factory()->create();
$params = [
'id' => $book->id,
'name' => $this->faker->realText(256), // 不正な値
'status' => 9, // 不正な値
'author'=> $this->faker->realText(256), // 不正な値
'publication'=> $this->faker->realText(256), // 不正な値
'read_at'=> '2022-10-01xxxx', // 不正な値
'note'=> $this->faker->realText(1001), // 不正な値
];
$response = $this->actingAs($user)->patch('/book/update', $params);
$response->assertStatus(302);
$this->assertDatabaseMissing('books', $params); // dbの値が更新されてないこと
$response->assertInvalid(['name' => '名前は、255文字以下にしてください。']);
$response->assertInvalid(['status' => '選択されたステータスは、有効ではありません。']);
$response->assertInvalid(['author' => '著者は、255文字以下にしてください。']);
$response->assertInvalid(['publication' => '出版は、255文字以下にしてください。']);
$response->assertInvalid(['read_at' => '読破日は、正しい日付ではありません。']);
$response->assertInvalid(['note' => 'メモは、1000文字以下にしてください。']);
}
remvoeのテストコードです。
// book.removeで更新処理が正常に行えること
public function test_book_remove_ok()
{
$user = User::factory()->create();
$book = Book::factory()->create();
$response = $this->actingAs($user)->delete("/book/remove/$book->id");
$response->assertStatus(302); // httpステータスが302を返すこと
$response->assertSessionHas('status', '本を削除しました。'); // セッションにstatusが含まれていて、値が「本を削除しました。」となっていること
$book = Book::find($book->id);
$this->assertEmpty($book); // NOTE: $thisはUnitTestの関数
}
// 不正な値でbook.removeで更新処理がエラーになること
public function test_book_remove_ng()
{
$user = User::factory()->create();
Book::factory()->create();
$response = $this->actingAs($user)->delete("/book/remove/99999");
$response->assertStatus(404);
}
Laravelでテストを実行する際に、DBのデータを消す方法
Laravelでテストを実施する際は、必ずDBのデータを毎回クリアするのをおすすめします。そうしないとテストが失敗する事があります。
use RefreshDatabase;
※期間限定クーポンコード適用中です。