Laravel Duskを使って、Chromeを自動的に立ち上げてブラウザテストを実行します。
readouble.com: ブラウザテスト(Laravel Dusk)
【Laravel 5.4】Laravel Duskによるブラウザテストの作成方法 - Qiita
親記事
Laravel 5.7で基本的なCRUDを作る - Qiita
Duskのインストール
# 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でテストする場合、ヘッドレスを指定しなければエラーになってしまいます。
protected function driver()
{
$options = (new ChromeOptions)->addArguments([
'--disable-gpu',
// '--headless' 後で必ず元に戻すこと!!
]);