本記事は、Laravelで認証用APIのテストを書くの記事を、APIではなくWeb画面用に書き換えたものです。
また、PHP Unitを実行しやすくするために、Laravel環境を利用+認証画面のセットアップも手順に含んでいます。
テストコードを書く理由
- テストのコストを下げるため
※ ユニットテストはコードを網羅的に動かすため、一度書いてしえばリグレッションテストのコストを下げられる - テストをしやすいコードにすることで疎結合なプログラムを意識してかけるようになるため
※ つまり 「メンテナンスしやすいコード」 が書けるようになる - テストコード自体がプログラマーに向けての仕様書になるから
※ 設計書(ドキュメント)として仕様を管理するのか、テストコードとして仕様を管理するかの違い
※ ドキュメントを書かないなら、テストケースは書きたい - テストコードを考えることによって、要件への理解が深まるから
- プログラムの変更/追加に伴うデグレを検知しやすくなるから
※ こちらにアップされている資料が神がかり的に分かりやすいので、一読を推奨
事前準備
ライブラリ依存管理ツールの用意
Laravelプロジェクトを作成
composer create-project "laravel/laravel=6.*" test-sample
cd test-sample
必要なnpmライブラリのインストール+ビルド
npm install
npm run dev
テストで利用する認証系のルーティング+ビューを用意
composer require laravel/ui --dev
php artisan ui vue --auth
ref: https://readouble.com/laravel/6.x/ja/authentication.html
Laravelの機能を使い、ビルドインウェブサーバを立ち上げる
cd test-sample
php artisan serve
動作確認
-
http://127.0.0.1:8000/login にアクセスして、以下のような画面が出ていればOK
※ DBのセットアップをしていないので、画面からユーザ登録やログインはできない(設定すればできるので、興味ある人は調べてみてください)
テスト作成
Laravelインストール時に最初から用意されている「UserFactory」を利用し、上記で作成したユーザ認証機能のテストを作成する
テストケースの作成
php artisan make:test AuthenticationTest
テストケースの修正
tests/Feature/AuthenticationTest.php
<?php
namespace Tests\Feature;
use App\User;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
class AuthenticationTest extends TestCase
{
use RefreshDatabase;
protected $user;
protected $password = 'i-love-laravel';
public function setUp(): void
{
parent::setUp();
// テストユーザ作成
$this->user = factory(User::class)->create([
'password' => bcrypt($this->password)
]);
}
/**
* ログイン認証テスト
*/
public function testLogin(): void
{
// 作成したテストユーザのemailとpasswordで認証リクエスト
$response = $this->post(route('login'), [
'email' => $this->user->email,
'password' => $this->password,
]);
// リクエスト送信後、正しいくリダイレクト処理されていることを確認
$response->assertRedirect('/home');
// 指定したユーザーが認証されていることを確認
$this->assertAuthenticatedAs($this->user);
}
/**
* ログアウトテスト
*/
public function testLogout(): void
{
// actingAsヘルパで現在認証済みのユーザーを指定する
$response = $this->actingAs($this->user);
// ログアウトページへリクエストを送信
$response->post(route('logout'));
// ユーザーが認証されていないことを確認
$this->assertGuest();
}
}
テストの実行
解説
- Laravelインストール時にComposerが最初に用意してくれているPHP Unitを利用
-
phpunit.xml
の初期設定で、インメモリのSQLiteを利用する設定を利用している(そのため、DBをセットアップしていなくてもfactoryでデータの作成+テストが可能になっている) -
assertAuthenticatedAs
やassertGuest
など、Laravel側が用意してくれているアサーションを利用することで、セッション情報などをチェックせずとも手軽にテストが可能となっている