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

Laravel Duskを使って、Chromeを自動的に立ち上げてブラウザテストを実行します。
:link: readouble.com: [ブラウザテスト(Laravel Dusk)](https://readouble.com/laravel/5.7/ja/dusk.html)
:link: [【Laravel 5.4】Laravel Duskによるブラウザテストの作成方法 - Qiita](https://qiita.com/amymd/items/0a5f2705e29972d0d22e)

![001.png](https://qiita-image-store.s3.amazonaws.com/0/27816/264d225c-42e8-a132-a78d-f90e0fa45817.png)


# 親記事
[Laravel 5.7で基本的なCRUDを作る - Qiita](https://qiita.com/sutara79/items/ef30fcdfb7afcb2188ea)


# Duskのインストール
```text: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はドメイン直下に設置しなくてはならないようです。

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

バーチャルホストの設定は別の記事にまとめています。
:link: [本番に合わせてバーチャルホストを設定する](https://qiita.com/sutara79/items/e2986209ae54923fc3a6)


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

## 警告「ERROR:gpu_process_transport_factory.cc ...」は無視してよい
これも無視して構いません。
Windowsのために一時的に作られた`--disable-gpu`オプションに起因するそうですが、ヘッドレスブラウザの動作上は何の問題もないそうです。
:link: [Stack Overflowでの質問](https://stackoverflow.com/questions/50143413/errorgpu-process-transport-factory-cc1007-lost-ui-shared-context-while-ini)

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

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