Laravel Duskをsailから動かしてみる(動いた)

Laravelロゴ

前回、Duskを動かすために色々試してみたのですが、うまくいかなかったので、Sailでやってみました。

結論

急ぐ人向けに結論だけ先に述べます。
Sail経由でDuskを動かす場合は、sailコマンド経由でやりましょう。
./vendor/bin/sail dusk
artisan経由だと動きません。インストールはリファレンスに書いてある通りにやれば大丈夫です。

やったこと

とりあえず、こちらを参考にしてSailのインストールから行ってみました。

この辺は見たままなので手順は割愛。
リファレンスには、設定ファイルがコメントアウトされているうんぬんと書いてありましたが、コメントアウトはされてませんでした。

ちなみに、Appleシリコン版のMacなのでdocer-compose.ymlの下記の部分を変更しました。

#image: 'selenium/standalone-chrome'
image: 'seleniarm/standalone-chromium'

どうも、現状AppleシリコンのDockerコンテナでchromeを動かすことができないらしく、chromiumを使う必要があるからということみたいでした。
設定ファイルを書き換えたらコンテナをビルドし直すのをお忘れなく。

sail build
または
docker-compose build

インストール&起動が終わったのでDuskを初期化しようとしましたが、入っていない様子。
composer.jsonを見ても入ってなさそうだったのでコンテナ内でインストールと初期化を行います。

composer require --dev laravel/dusk
php artisan dusk:install
php artisan dusk
(省略)
1) Tests\Browser\ExampleTest::testBasicExample
Facebook\WebDriver\Exception\WebDriverCurlException: Curl error thrown for http POST to /session with params: {"capabilities":{"firstMatch":[{"browserName":"chrome","goog:chromeOptions":{"args":["--window-size=1920,1080","--disable-gpu","--headless"]}}]},"desiredCapabilities":{"browserName":"chrome","platform":"ANY","chromeOptions":{"args":["--window-size=1920,1080","--disable-gpu","--headless"]}}}

Failed to connect to localhost port 9515 after 0 ms: Connection refused

接続できないとな?

色々試してみたのですが、ホスト側でsail経由で動かしてあげればいい模様。

./vendor/bin/sail dusk

試しに、サンプルで入っているテスト tests/Browser/ExampleTest.php をわざと失敗(assertSeeの引数の文字列を適当なのにして)させてみたら tests/Browser/screenshots に失敗した時の画像が残りました。みてみると・・・

おおお!ちゃんとエラーの時のスクリーンショットが出てる。これはすごい!

なぜartisanでは動かない?

しかし、なぜartisan経由だとダメなのか?
ちなみに、色々設定を変更しろという情報がありました。たとえば

.ENVファイルをかきかえろ

APP_URL=http://localhost:8000

tests/DuskTestCase.php の接続先を ‘http://selenium:4444/wd/hub’ にしろとか・・・。

この辺りは特にいじる必要はありませんでした。
おそらくですが、Sail経由だとこれらの環境変数が設定された状態で起動するんだと思います。

試しにsailのコードを見てみると


# Proxy the "dusk:fails" command to the "php artisan dusk:fails" Artisan command...
elif [ "$1" == "dusk:fails" ]; then
    shift 1

    if [ "$EXEC" == "yes" ]; then
        ARGS+=(exec -u sail)
        [ ! -t 0 ] && ARGS+=(-T)
        ARGS+=(-e "APP_URL=http://${APP_SERVICE}")
        ARGS+=(-e "DUSK_DRIVER_URL=http://selenium:4444/wd/hub")
        ARGS+=("$APP_SERVICE" php artisan dusk:fails "$@")
    else
        sail_is_not_running
    fi

うむ。たしかに環境変数を書き換えてるっぽいコードが。
APP_SERVICE is 何?
見てみると

export APP_SERVICE=${APP_SERVICE:-"laravel.test"}

なるほど、http://laravel.test に接続しに行けということなのか?これもネットで調べてる時に言及があったな!

追記)コンテナ名が laravel.test なので laravel.test に接続しに行っている

あと、テストはどうもHTTPサーバーではなくてビルドインサーバー経由で動いているっぽい?

それにしても、リファレンスの説明がインチキ&不親切すぎてよくわからんのがいかんのだ。
次回は、これらの情報をもとにSailを使わずに自前のDockerでなんとか動かす方法を探してみます。

タイトルとURLをコピーしました