1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravel × フロントエンドテスト

Last updated at Posted at 2025-12-01

本記事はアジアクエスト - アジアクエスト Advent Calendar 2025 の記事です。

Laravel Duskを利用したブラウザテスト

Laravelにおいて、バックエンドのテストはPHPUnitを利用して「ユニットテスト」「機能テスト」を行うことができます。
しかし、ユーザーが実際に触れるフロントエンドの挙動、特にJavaScriptが絡む動的な操作や見た目の崩れを検証するには、ブラウザを操作するテストが必要です。

そんなテストを行えるパッケージが、Laravelの公式パッケージであるLaravel Duskです。
Laravel Duskは、ブラウザ操作を自動化し、ユーザー目線でのテスト(エンドツーエンドテスト)を実現します。

1. Laravel Duskとは何か?

Laravel Duskは、Googleのヘッドレスブラウザ(画面を持たないChrome/Chromium)であるChromeDriverを利用し、実際のブラウザ上でアプリケーションを操作します。

以下がLaravel Duskの特徴をまとめたものになります。

  • 簡易な環境構築
    • Laravelプロジェクトに組み込むだけで動作し、テスト実行時に自動でChromeDriverを起動するため、複雑な環境設定が不要
  • エンドツーエンド (E2E) テスト
    • ユーザーの操作(ログイン、フォーム送信、クリック、画面遷移など)を最初から最後までシミュレーションし、アプリケーション全体が期待通りに連携して動作するかのチェック
  • JavaScriptの実行
    • PHPUnitの機能テストでは検証できない、Vue.jsやReactなどのJavaScriptフレームワークによる動的なDOM操作や非同期通信の動作チェック

2. 環境構築とテストファイルの作成

導入手順

Laravel DuskはLaravel標準のパッケージではないため、Composerを使ってインストールする必要があります。

また、Laravel Duskは開発時のみ必要なため、--devオプションを付けてインストールします。

composer require laravel/dusk --dev
php artisan dusk:install

テストファイルの作成

テストファイルはtests/Browserディレクトリに配置されます。
テストファイルは以下のコマンドで自動作成が可能です。

php artisan dusk:make RegistrationTest

3. Duskテストの記述の基本

Duskのテストは、$this->browse(Closure $callback)ヘルパー内で記述します。
$callbackに渡される$browserオブジェクトを通じて、ブラウザを操作します。

基本的な操作チェーン

以下の例では、新しいユーザー登録の流れをシミュレーションしています。

use Laravel\Dusk\Browser;
use Tests\DuskTestCase;

class RegistrationTest extends DuskTestCase
{
    public function testNewUserCanRegister(): void
    {
        $this->browse(function (Browser $browser) {
            $browser->visit('/register') // 1. 登録ページにアクセス
                    ->type('name', 'Dusk User') // 2. nameフィールドに入力
                    ->type('email', 'dusk@example.com') 
                    ->type('password', 'secret')
                    ->type('password_confirmation', 'secret')
                    ->press('Register') // 3. "Register"ボタンをクリック
                    ->assertPathIs('/home') // 4. /homeにリダイレクトされたことのチェック
                    ->assertSee('Welcome, Dusk User'); // 5. 成功メッセージが表示されたことのチェック
        });
    }
}

4. テストのための高度な機能

A. 認証済みユーザーとしてのテスト

既にログインしている状態でテストを開始したい場合、loginAs()メソッドを使用します。
これにより、テスト実行前に自動的にセッションが確立され、ログインした状態でのテストが行えます。

$this->browse(function (Browser $browser) use ($user) {
    // 事前に作成したユーザーでログインした状態からテストを開始
    $browser->loginAs($user) 
            ->visit('/settings')
            ->assertSee('Account Settings');
});

B. 待機(Waiting)

JavaScriptによる遅延ロードや非同期処理の結果を待つために、待機の操作が非常に重要です。Duskは様々な待機メソッドを提供しています。

メソッド
$browser->waitFor('#element-id') 指定した要素が表示されるまで待機
$browser->waitForText('Loading Complete') 指定したテキストが表示されるまで待機
$browser->pause(1000) 指定時間(ミリ秒)だけ処理を停止 (最終手段として使用)
// 非同期でデータがロードされ、リストが表示されるのを待つ
$browser->visit('/items')
        ->waitFor('#item-list')
        ->assertSee('First Item'); 

C. ページオブジェクト (Page Objects) パターン

テストコードが複雑化するのを防ぐため、Laravel DuskはPage Objectsパターンを推奨しています。

ページオブジェクトの作成

ページオブジェクトは以下コマンドで自動作成が可能です。

php artisan dusk:page Home

ページオブジェクトでは、
ページ内の要素セレクタや、そのページ固有の操作をメソッドとして定義します。

// resources/views/vendor/dusk/pages/Home.php
class Home extends Page
{
    // このページのURLパスを定義
    public function url(): string
    {
        return '/home';
    }

    // ページ内で使用するセレクタを定義
    public function selector(): array
    {
        return [
            '@logoutButton' => 'button[name="logout"]',
        ];
    }
}

テストで実際に利用する例は以下になり、テストコードが大幅に簡略化されます。

$this->browse(function (Browser $browser) {
    $browser->visit(new Home) // Page Objectを利用してアクセス
            ->click('@logoutButton') // セレクタ名を指定
            ->assertGuest();
});

5. テストの実行

ターミナルで実行します。
Laravel Duskはデフォルトでヘッドレスモード(ブラウザが画面に表示されない)で実行されます。

php artisan dusk

デバッグに便利な実行オプション

テスト中にブラウザの動きを実際に確認したい場合、--unheadlessオプションを付けます。

php artisan dusk --unheadless 

また、テストが失敗した場合、Duskは失敗時の画面のスクリーンショットをtests/Browser/screenshotsディレクトリに自動で保存してくれるため、デバッグが容易です。

まとめ

Laravel Duskは、LaravelアプリケーションのUXを保証するためのテストツールです。
ブラウザを自動で操作し、複雑なフロントエンドの挙動を検証することで、アプリケーションの品質を保証できるようになります。
質の高い実装を行うため、Laravel Duskを導入し、テスト駆動開発(TDD)の精神をフロントエンドにも広げてみませんか?

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?