ホーム » Laravelのテストの実行方法について

Laravelのテストの実行方法について

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;

 

※期間限定クーポンコード適用中です。