浜松のWEBシステム開発・スマートフォンアプリ開発・RTK-GNSS関連の開発はお任せください
株式会社シーポイントラボ
TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:静岡県浜松市中区富塚町1933-1 佐鳴湖パークタウンサウス2F

Laravel DuskでリモートのLaravelプロジェクトのテストに失敗するときの対処法

Laravelには公式のプラグインとして”Dusk”というテストモジュールがあります。

Artisan経由でコマンドでPHPUnitテストを実行できるのですが、このDuskを使ってリモートサーバーのLaravelプロジェクトをテストしようとすると、実際には正常に動作するのにエラーになってしまうことがあります。

> @ browser-test /var/lib/jenkins/workspace/hogeproject-auto-test
> php artisan dusk

Warning: TTY mode requires /dev/tty to be read/writable.
PHPUnit 7.5.0 by Sebastian Bergmann and contributors.

EEEEPHP Fatal error:  Uncaught Illuminate\Contracts\Container\BindingResolutionException: Target [Illuminate\Contracts\Debug\ExceptionHandler] is not instantiable. in /var/lib/jenkins/workspace/hogeproject-auto-test/vendor/laravel/framework/src/Illuminate/Container/Container.php:933
Stack trace:
#0 /var/lib/jenkins/workspace/hogeproject-auto-test/vendor/laravel/framework/src/Illuminate/Container/Container.php(773): Illuminate\Container\Container->notInstantiable('Illuminate\\Cont...')
#1 /var/lib/jenkins/workspace/hogeproject-auto-test/vendor/laravel/framework/src/Illuminate/Container/Container.php(646): Illuminate\Container\Container->build('Illuminate\\Cont...')
#2 /var/lib/jenkins/workspace/hogeproject-auto-test/vendor/laravel/framework/src/Illuminate/Container/Container.php(601): Illuminate\Container\Container->resolve('Illuminate\\Cont...', Array)
#3 /var/lib/jenkins/workspace/hogeproject-auto-test/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(734): Illuminate\Container\ in /var/lib/jenkins/workspace/hogeproject-auto-test/vendor/laravel/framework/src/Illuminate/Container/Container.php on line 933
PHP Fatal error:  Uncaught Illuminate\Contracts\Container\BindingResolutionException: Target [Illuminate\Contracts\Debug\ExceptionHandler] is not instantiable. in /var/lib/jenkins/workspace/hogeproject-auto-test/vendor/laravel/framework/src/Illuminate/Container/Container.php:933
Stack trace:
#0 /var/lib/jenkins/workspace/hogeproject-auto-test/vendor/laravel/framework/src/Illuminate/Container/Container.php(773): Illuminate\Container\Container->notInstantiable('Illuminate\\Cont...')
#1 /var/lib/jenkins/workspace/hogeproject-auto-test/vendor/laravel/framework/src/Illuminate/Container/Container.php(646): Illuminate\Container\Container->build('Illuminate\\Cont...')
#2 /var/lib/jenkins/workspace/hogeproject-auto-test/vendor/laravel/framework/src/Illuminate/Container/Container.php(601): Illuminate\Container\Container->resolve('Illuminate\\Cont...', Array)
#3 /var/lib/jenkins/workspace/hogeproject-auto-test/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(734): Illuminate\Container\ in /var/lib/jenkins/workspace/hogeproject-auto-test/vendor/laravel/framework/src/Illuminate/Container/Container.php on line 933

npm ERR! Linux 4.14.70-72.55.amzn2.x86_64
npm ERR! argv "/usr/bin/node" "/usr/local/bin/npm" "run" "browser-test"
npm ERR! node v6.15.1
npm ERR! npm  v3.10.10
npm ERR! code ELIFECYCLE
npm ERR! @ browser-test: `php artisan dusk`
npm ERR! Exit status 255
npm ERR! 
npm ERR! Failed at the @ browser-test script 'php artisan dusk'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the  package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     php artisan dusk
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs 
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!     npm owner ls 
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /var/lib/jenkins/workspace/hogeproject-auto-test/npm-debug.log
Build step 'Execute shell' marked build as failure
'project' is not included in Backlog URL. Can't comment a pull request.
Finished: FAILURE

恥ずかしながら自分はいろいろ調べても原因がわからなかったので、社内のメンバーに相談したところ、どうやらサイトへのアクセス時にタイムアウトが発生が発生しているのでは、とのことだったため、タイムアウト時間を延ばして解消するか確認してみました。

Laravel Duskのタイムアウト時間を延ばすには、
プロジェクトのルート/tests/DuskTestCase.php

RemoteWebDriver::create
を次の例のように書き換えます。

return RemoteWebDriver::create(
            'http://localhost:9515',
            DesiredCapabilities::chrome()
                ->setCapability(ChromeOptions::CAPABILITY,$options),200*1000, 200*1000
        );

(参考: OctoberCMSでLaravel Dusk + Seleniumを使ってE2Eテストをする – Qiita)

これで実行したところ、無事Duskのテストが通過するようになりました!

リモート環境に接続する際は、
FQDNをIPアドレスに変換し、リモートサーバーに接続し、リクエストを投げ、応答を待つ…
といった手順を踏む必要があるのですが、Duskのタイムアウトデフォルト値が1分となっており、上記の手順を踏んだ場合にこの時間を超過してしまった結果テスト失敗となっていたようです。

同じような症状でお悩みの方は確認してみてください。

  • この記事いいね! (0)