Laravel5.7: ブラウザテストの基本


Laravel Duskを使って、Chromeを自動的に立ち上げてブラウザテストを実行します。
readouble.com: ブラウザテスト(Laravel Dusk)
【Laravel 5.4】Laravel Duskによるブラウザテストの作成方法 - Qiita

親記事

Laravel 5.7で基本的なCRUDを作る - Qiita

Duskのインストール

PowerShell
# Composerに追加
> composer require --dev laravel/dusk

# テストファイルを生成する ("tests/Browser/"が生成される)
> php artisan dusk:install

# デフォルトのテストを実行
> php artisan dusk --filter 'ExampleTest'

(以下のように表示されれば成功)
Warning: TTY mode is not supported on Windows platform.
PHPUnit 7.3.4 by Sebastian Bergmann and contributors.

[0910/092205.362:ERROR:gpu_process_transport_factory.cc(1007)] Lost UI shared context.

DevTools listening on ws://127.0.0.1:12501/devtools/browser/cb7ad7c1-76b4-4720-a11b-6593acb94595
.                                                                   1 / 1 (100%)

Time: 7.58 seconds, Memory: 12.00MB

OK (1 test, 1 assertion)

デフォルトのテストに失敗する場合

私の場合、Laravelの環境設定ファイル(.env)のAPP_URLが実際のURLとは異なっていたことが原因でテストが通りませんでした。

項目
Apacheのドキュメントルート C:\xampp-htdocs
Laravelへのパス C:\xampp-htdocs\laravel\basic-crud
ローカルの実際のURL https://localhost/laravel/basic-crud/public
APP_URL http://localhost

今まではAPP_URLはデフォルトのままで問題ありませんでした。
しかし、Duskのテストを通すには下記のように正確にアプリのURLを指定しなければなりません。
APP_URL=https://localhost/laravel/basic-crud/public

しかし、そうすると今度は通常のPHPUnitのテストがエラーになってしまいました。
.htaccessが原因なのか、もしくはLaravel内部での処理が原因なのかは分かりませんが、どうやらLaravelはドメイン直下に設置しなくてはならないようです。

下の記事を参考にして、サブディレクトリでも動作するように何とか粘ってみてもいいと思います。
Laravel5.xをサブディレクトリで動かす - Qiita
しかし、私の場合は本番のURLはドメイン直下(https://sutara79-laravel.herokuapp.com/)なので、ローカルと本番とで.htaccess内の処理を分岐させなくてはならないという別の面倒が発生してしまいます。
それならばと思い、バーチャルホストで対応することにしました。

バーチャルホストの設定は別の記事にまとめています。
本番に合わせてバーチャルホストを設定する

警告「Warning: TTY mode is ...」は無視してよい

テストを実行すると1行目に表示される下記の警告は、無視してかまわないそうです。
Warning: TTY mode is not supported on Windows platform.
テスト結果が色付けされなくなってしまいますが、CIでのテストでは別の方法で色付けされる場合もありますし、そもそも大した不便はありません。
https://github.com/laravel/dusk/pull/226

警告「ERROR:gpu_process_transport_factory.cc ...」は無視してよい

これも無視して構いません。
Windowsのために一時的に作られた--disable-gpuオプションに起因するそうですが、ヘッドレスブラウザの動作上は何の問題もないそうです。
Stack Overflowでの質問

テストの動作を目で確認したい場合

Laravel5.4ではテストを実行すると自動でブラウザが起動して、ボタンをクリックしたりフォームに文字を入力するなどの、テストに記述した動作が自動で実行される様子を眺めることができました。
Laravel5.5以降はヘッドレスでの実行がデフォルトとなり、テストのたびにブラウザが起動することはなくなり、その分テスト時間が短くなりました。
ただ、動作を目で確認したい場合もあると思います。
そんな時は下記のように--headlessをコメントアウトしてください。
ただし、コメントアウトは一時的なものとして必ず元に戻してください。
TravisCIでテストする場合、ヘッドレスを指定しなければエラーになってしまいます。

tests/DuskTestCase.php
    protected function driver()
    {
        $options = (new ChromeOptions)->addArguments([
            '--disable-gpu',
            // '--headless' 後で必ず元に戻すこと!!
        ]);