Laravel Duskの実行をコンテナ内のみで完結させたかったので試してみた。
dockerさえ動けばDuskの実行が可能になるので、環境構築が楽だしCIさせやすい。
サンプルコードは下記リポジトリを参照
https://github.com/hanhan1978/docker-laravel54-skelton
構成図
- NginxからPHP-FPMへリバースプロキシするシンプルな構成
- PHP-FPMのコンテナからLaravel Duskを実行すると、Seleniumのコンテナへテストのリクエストを送信
- Seleniumのサーバはテスト対象のWebアプリを参照するためにNginxのコンテナへリクエストを送信
- 公式イメージの
standalone selenium webdriver
を利用 - docker-composeの設定はv2以上
docker-compose.ymlの中身
1 | version: '2' |
DuskTesetCase.phpの変更点
- baseUrlをオーバーライドして変更。ここでは
Docker Network
のnginxを指定。1
2
3
4protected function baseUrl()
{
return 'http://nginx';
} - static::startChromeDriver() をコメントアウト。ローカルのchrome使わないので不要
1
2
3
4public static function prepare()
{
//static::startChromeDriver();
} - seleniumの参照先をhttp://selenium:4444/wd/hub に変更。コレ大事。
1
2
3
4
5
6protected function driver()
{
return RemoteWebDriver::create(
'http://selenium:4444/wd/hub', DesiredCapabilities::chrome()
);
}
テストの実行
コンテナ内で実行するのでexec
を使う。docker-compose exec laravel php artisan dusk
まとめ
大変だったのは、selenium web driverのendpointが分かりづらかったくらい。docker-composeのlinkを使うと、循環参照エラーになってしまうのでv2以降の文法を使ってdocker networkから各コンテナを参照するのがポイント。