当サイトでご紹介しているユーザー認証のテストはLaravel5.4のもので、Laravel10となった今ではアサート関数やfactory関連の記述も変化しているため新しいものに書き換えることにしました。Laravelの新規インストールから、認証周りのテスト作成をご紹介します。また、認証機能にはBreezeを使用しました。

Breezeとは?

Breezeについては、Laravelのドキュメントにて以下のように紹介されています。

Laravel Breezeは、ログイン、ユーザー登録、パスワードリセット、メール確認、パスワード確認など、すべての認証機能を最小かつシンプルにLaravelへ実装したものです。

Laravel uiの後継という立ち位置で、Laravel7から採用されています。フロントの実装もついてくるのでインストールするだけですぐに認証機能を利用することができます。

プロジェクト新規作成・Breezeインストール

まずはLaravelをインストールします。本記事作成時のバージョンは10.2.9でした。インストール先のディレクトリ名は適宜書き換えてくださいね。

$ composer create-project laravel/laravel test-project

$ cd test-project

次に、.envを編集します。今回DBはsqliteを使用しますので、DB_CONNECTIONを編集し、以降はコメントアウトします。

DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=

次はマイグレーションを実行します。sqliteのデフォルトでは、/database/database.sqlite というファイルが作成されます。

$ php artisan migrate

ここまで進めたら、いよいよBreezeをインストールします。オプションについていくつか質問されますが、テスト用フレームワークはPHPUnitを選択してください。

$ composer require laravel/breeze --dev

$ php artisan breeze:install

┌ Which Breeze stack would you like to install? ───────────────┐
│ Blade with Alpine                                            │
└──────────────────────────────────────────────────────────────┘

┌ Would you like dark mode support? ───────────────────────────┐
│ No                                                           │
└──────────────────────────────────────────────────────────────┘

┌ Which testing framework do you prefer? ──────────────────────┐
│ PHPUnit                                                      │
└──────────────────────────────────────────────────────────────┘

これでインストール関連は完了です。テストを書くだけなら不要ですが、せっかくなのでブラウザの表示も確認してみましょう。

$ php artisan serve

http://127.0.0.1:8000/register へアクセスすると、以下のようなユーザー登録画面が表示されます。

テストの準備

phpunit.xmlを編集します。今回はテストでもsqliteを使用するので、以下のようにDB_CONNECTIONDB_DATABASEのコメントアウトを外すだけです。

<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
         bootstrap="vendor/autoload.php"
         colors="true"
>
    <testsuites>
        <testsuite name="Unit">
            <directory>tests/Unit</directory>
        </testsuite>
        <testsuite name="Feature">
            <directory>tests/Feature</directory>
        </testsuite>
    </testsuites>
    <source>
        <include>
            <directory>app</directory>
        </include>
    </source>
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="BCRYPT_ROUNDS" value="4"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="DB_CONNECTION" value="sqlite"/> //ここのコメントアウトを外す
        <env name="DB_DATABASE" value=":memory:"/> //ここのコメントアウトを外す
        <env name="MAIL_MAILER" value="array"/>
        <env name="QUEUE_CONNECTION" value="sync"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="TELESCOPE_ENABLED" value="false"/>
    </php>
</phpunit>

これで準備は完了です。あとはテストを書いてゆくだけなのですが、なんとBreezeはインストール直後の状態でユーザー登録やログイン認証・パスワード変更のテストが一通り揃っています。

以下はtestsディレクトリのスクリーンショットです。

これだけでテストは十分揃っているようですが、今回は少し付け足したいケースもあったのでこれらのテストを参考にしながら認証テストを作成することにします。

画面表示のテスト

テストを書くにあたりルーティングを確認します。php artisan route:listでリストを出力すると、以下のようになっていました。

このルーティングの中から、まずはログイン画面(login)の表示と、ログイン後のダッシュボード(dashboard)の表示をテストしてみます。AuthenticationTest.phpには初期状態で4つのテストが用意さてれていますが、まずは簡単なテストから、ということでシンプルに以下のように編集しました。1つ目はデフォルトで用意されているテストで、2つ目は新しく追加したものです。


namespace Tests\Feature\Auth;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class AuthenticationTest extends TestCase
{
    use RefreshDatabase;

    public function test_login_screen_can_be_rendered(): void
    {
        $response = $this->get('/login');

        $response->assertStatus(200);
    }

    public function test_unauthenticated_user_cannot_view_dashboard(): void
    {
        $response = $this->get('dashboard');

        $response->assertRedirect('/login');
    }

}

1つ目のテストは、ログイン画面の表示を確認しています。問題なく表示されればステータスのコードは200となり、テストが通るはずです。

2つ目は、認証が必要な画面にアクセスしています。まだログインしていない状態なので、ログイン画面にリダイレクトされる挙動を期待しています。

テストを実行してみると、成功しました。

$ vendor/bin/phpunit --filter AuthenticationTest --testdox
PHPUnit 10.5.1 by Sebastian Bergmann and contributors.

..                                                                  2 / 2 (100%)

Time: 00:01.134, Memory: 38.50 MB

OK (2 tests, 3 assertions)

アサートは2つなのに3 assertionsとなっているのは、2つ目のテストのassertRedirectが2つのアサートを内包しているためです。
1つは、リダイレクトされたこと。もう1つは、リダイレクトの先が/loginであることです。

次回は、ログイン関連のテストをご紹介いたします。

メルマガ購読の申し込みはこちらから。

By hmatsu