Laravel6.x + Laradockな環境でDuskを実行する

Laradock環境にDusk導入した時色々ハマったので手順化しておきます。

# 目次

作業の流れ

1. Laradock設定変更
* Dusk導入
* Duskでテスト作成・実行する

# 環境
* Laravel 6.x
* Laradock
* Docker Engine 19.03.x
* Docker Compose 1.25.x

# 参考サイト

公式リファレンス
[Laravel 6.x Laravel Dusk](https://readouble.com/laravel/6.x/ja/dusk.html)

Laradock周りでハマった時に参考にしたサイト
[laravel5.5でduskがうごかへんねん](https://qiita.com/chtzmrtshgh/items/cea990e1d6bbd60bd823)

# Laradock設定変更

### `laradock/.env` の編集

下記を追記する。
.env.exampleも合わせて直しておく

```ruby:laradock/.env
WORKSPACE_INSTALL_LIBNSS3=true
WORKSPACE_INSTALL_CHROME_DRIVER=true
```

### `laradock/docker-compose.yml` の編集

workspace > build > argsに下記を追記する。

```yml:docker-compose.yml
          - INSTALL_LIBNSS3=${WORKSPACE_INSTALL_LIBNSS3}
          - INSTALL_CHROME_DRIVER=${WORKSPACE_INSTALL_CHROME_DRIVER}
```

### `laradock/workspace/Dockerfile` の編集

```shell:Dockerfile
###########################################################################
# LIBNSS3:
###########################################################################

USER root

ARG INSTALL_LIBNSS3=false

RUN if [ ${INSTALL_LIBNSS3} = true ]; then \
    apt-get -y install libnss3 \
;fi

###########################################################################
# CHROME_DRIVER
###########################################################################

ARG INSTALL_CHROME_DRIVER=false

RUN if [ ${INSTALL_CHROME_DRIVER} = true ]; then \
    apt-get update && apt-get install --no-install-recommends -y wget \
    && wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
    && echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list \
    && apt-get update && apt-get install -y google-chrome-stable \
;fi
```

### Laradockコンテナ郡を停止

```shell
docker-compose down
```

### キャッシュ無しでビルド

```shell
docker-compose build --no-cache workspace
```

### Laradockコンテナ郡を起動

```shell
docker-compose up -d
```

### workspaceコンテナにログイン

```shell
docker-compose exec workspace bash
```

### ChromeDriverのバージョン確認

Laravelプロジェクトディレクトリで実行する

```shell
vendor/laravel/dusk/bin/chromedriver-linux -v
```

下記のような文字が表示されればOK

```
ChromeDriver 84.0.4147.30 (xxxx-refs/branch-heads/4147@{#310})
```

# Dusk導入

### Duskパッケージのインストール

```bash
composer require --dev laravel/dusk
```
**公式に記載の注意事項です。**
> Note: 本番環境にDuskをインストールしてはいけません。インストールすると、アプリケーションに対する未認証でのアクセスを許すようになります。

### Duskのセットアップ

```bash
php artisan dusk:install
```

### ChromeDriverのセットアップ

異なるバージョンのChromeDriverをインストールしているため、下記を実行。

```
php artisan dusk:chrome-driver
```

# Duskでテスト作成・実行する

### サンプルテストを確認

Duskのセットアップの時にサンプルテストが生成されるのでそれを試しに実行してみる。

```php:tests/Browser/ExampleTest.php
<?php

namespace Tests\Browser;

use Illuminate\Foundation\Testing\DatabaseMigrations;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;

class ExampleTest extends DuskTestCase
{
    /**
     * A basic browser test example.
     *
     * @return void
     */
    public function testBasicExample()
    {
        $this->browse(function (Browser $browser) {
            $browser->visit('/')
                ->assertSee('Laravel');
        });
    }
}
```

### 実行

```
php artisan dusk
```

成功すればこんな感じで表示されます。

```
PHPUnit 8.5.8 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 2.74 seconds, Memory: 18.00 MB

OK (1 test, 1 assertion)
```

# トラブルシュート: Chrome failed to start: exited abnormally.

ChromeDriverのインストールした時点のバージョンによって発生するかも

### エラー詳細

```
1) Tests\Browser\ExampleTest::testBasicExample
Facebook\WebDriver\Exception\UnknownErrorException: unknown error: Chrome failed to start: exited abnormally.
  (unknown error: DevToolsActivePort file doesn't exist)
  (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
```

### 解決方法

`--no-sandbox`オプションを追加する

```php:tests/DuskTestCase.php
    protected function driver()
    {
        $options = (new ChromeOptions)->addArguments([
            '--disable-gpu',
            '--headless',
            '--window-size=1920,1080',
            '--no-sandbox',
        ]);
```

FYI. https://github.com/laravel/dusk/issues/488#issuecomment-423065384