--> -->
#blog2navi() *Laravel5.4+php5.6でduskをセットアップする [#eb5f67cf] ~Laravel5.4+php5.6の環境にdusk入れるメモです。 ~[[公式:https://readouble.com/laravel/5.4/ja/dusk.html]]をはじめ、詳しく導入手順を書いてあるのですが、いろいろと上手くいかない点があったのでメモ・・・(._.)φ ~ + phpのバージョン問題~ 公式の導入手順ではインストール時に以下をしろと書いてあります。 composer require --dev laravel/dusk しかし、現在duskの最新は2.0系で、これは(正確には依存パッケージが)php7.1.3以上を必要とします。そのため以下のエラーが出ます。 Problem 1 - laravel/dusk v2.0.0 requires illuminate/support ~5.5 -> satisfiable by illuminate/support[v5.5.0, v5.5.16... : - illuminate/support v5.7.9 requires php ^7.1.3 -> your PHP version (5.6.37) does not satisfy that requirement. dusk本体ではなく、依存関係のあるパッケージがphp7.1.3を要求するようです。~ そこで、duskのバージョンを指定して導入します。 composer require --dev laravel/dusk:~1.0 ~ + $this->app->environment()問題~ 次に、&inlinecode{app/Providers/AppServiceProvider.php};に以下を追加するとあります。 ~最初セットアップで色々回り道をしたのでその事について書いたのですが、結局自分の勘違いだということが分かりましたので、内容を変えて''Laravel5.4+php5.6+dusk1.1でコードカバレッジを取得する''について書こうと思います(^^;) ~ちなみに最初の勘違いというのは以下に起因するものです(書くんだ・・・)。~ 導入時には、&inlinecode{app/Providers/AppServiceProvider.php};に以下を追加します。 #code(php){{ if ($this->app->environment('local', 'testing')) { $this->app->register(DuskServiceProvider::class); } }} しかし、何故か手元の5.4.36では&inlinecode{$this->app->environment()};という関数がありません。そこで、localとtestingをそれぞれの関数でチェックするように書き換えました。 ~しかしPHPStormだと1行目のenvironment()に警告が出ます。ちょっと探しても見つからなかったので、Laravelのバージョンが何か違うのかなーと思って以下のように修正してしまいました。 #code(php){{ if (app()->isLocal() and app()->runningUnitTests()) { $this->app->register(DuskServiceProvider::class); } }} ~ところがこれは完全に誤りです。この条件式では、.envのAPP_ENVが&inlinecode{local};'且つ'&inlinecode{testing};でないとDuskServiceProviderが登録されません。従って&inlinecode{php artisan dusk:install};を実行しようにも「There are no commands defined in the "dusk" namespace.」というエラーが出て、install ができません。 ~その結果色々手動でいじって、沼に填まってしまいました。~ 結論:PHPStormが警告を出しても一度疑って実行してみましょう(笑)~ ~ + artisanコマンド登録問題~ さらに、テスト実装のディレクトリ構造を生成するため、&inlinecode{artisan duke:install};を実行しろとあります。しかしこれがまた以下のエラーが出て実行できません。 >php artisan dusk:install There are no commands defined in the "dusk" namespace. artisan listなどしてみると、コマンドが登録されていないようです。仕方が無いので、手動で&inlinecode{app/console/kernel.php};に追記して登録します。 #code(php){{ namespace App\Console; #hr ** duskでカバレッジを取る [#i9bc3a52] ~さて、本題のduskでカバレッジです。~ 結論だけさくさく書きます。~ ~ + 以下URLの通りにソースを修正します~ https://github.com/laravel/dusk/issues/258~ ~ + phpcovをインストールします~ composer require --dev phpunit/phpcov ~ use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; use Laravel\Dusk\Console\DuskCommand; use Laravel\Dusk\Console\InstallCommand; use Laravel\Dusk\Console\MakeCommand; ~以上です(笑)。これで、&inlinecode{base_path() . "/build/dusk"};に*.covファイルが作成され、&inlinecode{storage/logs/coverage_dusk.xml};にカバレッジ結果が出力されるようになります。*.covファイルの作成先は改変コードの下から5行目あたりに書いてありますので、好みの場所に変えてください。私は&inlinecode{storage/logs/cov/dusk};にしました。 ~次に、これをhtmlに出力します。 vendor\bin\phpcov merge --html storage\logs\coverage_html storage\logs\cov ~すると、&inlinecode{storage/logs/coverage_html};にHTMLでカバレッジレポートが出力されます。 class Kernel extends ConsoleKernel { /** * The Artisan commands provided by your application. * * @var array */ protected $commands = [ DuskCommand::class, InstallCommand::class, MakeCommand::class, ]; : ** phpunittest(CLI)の結果とマージする [#c9073af2] ~duskの*.covとphpunittest(cli)の*.covをマージするため、まずはphpunit.xmlの<logging>要素に出力先を指定します。 #code(){{ <logging> <log type="coverage-php" target="storage/logs/cov/cli/cli.cov" /> </logging> }} これでコマンドが通るようになりました。 >php artisan dusk:install Dusk scaffolding installed successfully. ~ + TTY mode is not supported on Windows platform.問題~ テストを実行しようとすると、 TTY mode is not supported on Windows platform. というメッセージが出て実行されません。 これは、[[こちらのページ:https://github.com/laravel/dusk/pull/13/files]]を参考に、ソースを修正します。~ chromeの実行は、公式サイトにも書かれている[[ChromeDriver:https://sites.google.com/a/chromium.org/chromedriver/home]]を落としてきて、ファイル名を変更して、&inlinecode{vendor\laravel\dusk\bin\chromedriver-win.exe};に置きます。~ ~次に、duskの方はphpunit.xmlのwhitelistは読んでくれないので、先ほど修正したコード&inlinecode{DuskServiceProvider.php};内に記述します。 #code(php){{ private function triggerCoverage() { $coverage = new \SebastianBergmann\CodeCoverage\CodeCoverage(); $coverage->filter()->addDirectoryToWhitelist(app_path()); $coverage->filter()->removeDirectoryFromWhitelist(app_path().'/Console'); $coverage->filter()->removeDirectoryFromWhitelist(app_path().'/Exceptions'); $coverage->filter()->removeDirectoryFromWhitelist(app_path().'/Providers'); : }} こんな感じです。~ ~ すると、php artisan dusk で自動的にchromeが立ち上がり、画面遷移しながら試験を実施してくれます。すごーい(笑)~ phpunit、duskをそれぞれ実行して*.covファイルができたら、phpcovで双方の *.cov ファイルをマージします。 vendor\bin\phpcov merge --html storage\logs\coverage_html storage\logs\cov ~こうすると、phpunittestとduskの試験結果のカバレッジがマージされたHTMLが作成されます。~ ~ ** カバレッジon/offを切り替える [#n99e4c8e] ~実はこのカバレッジ、取得するとテストがとても遅くなります(当然ですが・・)。手元の環境では約3.5倍かかりました。~ 普段の確認ではカバレッジをoffにしておき、いざ取るというときだけonにできるようにしてみます。~ 頻繁には切り替えないと思いますので、&inlinecode{.env.dusk.local};ファイルに指定する方法で実現します。~ ~ + config/app.phpに変数の取り込みを記載~ 末尾あたりにこんな風に追記します。 // dusk covertage mode 'dusk_coverage' => env('DUSK_COVERAGE', false), ~ + .env.dusk.localに定義を記載~ DUSK_COVERAGE=false ~ + DuskServiceProvider.phpのカバレッジ定義部分にif文を追加~ 以下の1行目のif文に、dusk_coverageを見るような条件式を追加します。 #code(php){{ if ($this->app->environment('testing') and config('app.dusk_coverage')) { try { $this->triggerCoverage(); } catch (Exception $e) { Log::info("Dusk coverage: " . $e->getMessage()); } } }} ~ これで、trueにすればカバレッジを取得、falseにすれば取得せず高速にテストを実施するようになります。 ~ ~でも、昔に比べてパッケージ管理が発達してしているのに、どうしてこういう違いが出てくるんでしょうね・・・。 ''目指せ、カバレッジ100%!(笑)'' ~ #htmlinsert(twitterbutton.html) #hr #htmlinsert(20181115_duskin.html) RIGHT:Category: [[[Linux>日記/Category/Linux]]] - 21:28:03 ---- RIGHT:&blog2trackback(); #comment(above) #blog2navi() }}