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分となっており、上記の手順を踏んだ場合にこの時間を超過してしまった結果テスト失敗となっていたようです。
同じような症状でお悩みの方は確認してみてください。