--> -->

skimemo


skimemo - 日記/2018-11-15/Laravel5.4+php5.6でduskをセットアップする のバックアップの現在との差分(No.1)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
#blog2navi()
*Laravel5.4+php5.6でduskをセットアップする [#eb5f67cf]

~Laravel5.4+php5.6の環境にdusk入れるメモです。
~[[公式:https://readouble.com/laravel/5.4/ja/dusk.html]]をはじめ、詳しく導入手順を書いてあるのですが、上手くいかない点があったのでメモ・・・(._.)φ
~最初セットアップで色々回り道をしたのでその事について書いたのですが、結局自分の勘違いだということが分かりましたので、内容を変えて''Laravel5.4+php5.6+dusk1.1でコードカバレッジを取得する''について書こうと思います(^^;)
~ちなみに最初の勘違いというのは以下に起因するものです(書くんだ・・・)。~
導入時には、&inlinecode{app/Providers/AppServiceProvider.php};に以下を追加します。
#code(php){{
if ($this->app->environment('local', 'testing')) {
     $this->app->register(DuskServiceProvider::class);
 }
}}
~しかし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が警告を出しても一度疑って実行してみましょう(笑)~
~
~一部の手順ではcomposer.jsonの&inlinecode{require-dev};セクションに&inlinecode{"laravel/dusk": "~1.0"};を記述して&inlinecode{composer update};するように書いてあります。しかしこれだけではartisan実行時にエラーとなります。
 >php artisan dusb:install
 There are no commands defined in the "dusb" namespace.
#hr
** duskでカバレッジを取る [#i9bc3a52]
~さて、本題のduskでカバレッジです。~
結論だけさくさく書きます。~
~
~また、公式の導入手順ではインストール時に以下をしろと書いてあります。
 composer require --dev laravel/dusk
~しかし、現在duskの最新は2.0系で、これはphp7.1.3以上を必要とします。そのため以下のエラーが出ます。
 - 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
これで、artisanコマンドが使えるようになりました。
 >php atrisan dusk
 Could not open input file: atrisan
+ 以下URLの通りにソースを修正します~
https://github.com/laravel/dusk/issues/258~
~
+ phpcovをインストールします~
 composer require --dev phpunit/phpcov
~

~以上です(笑)。これで、&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でカバレッジレポートが出力されます。

environment()
** 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>
}}
~
~次に、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');
                        :
}}
こんな感じです。~
~
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にすれば取得せず高速にテストを実施するようになります。
~

app/console/kernel.php

''目指せ、カバレッジ100%!(笑)''
~
#htmlinsert(twitterbutton.html)
#hr
#htmlinsert(20181115_duskin.html)
RIGHT:Category: &#x5b;[[Linux>日記/Category/Linux]]&#x5d; - 21:28:03
----
RIGHT:&blog2trackback();
#comment(above)
#blog2navi()

}}