skimemo


skimemo - 日記/2018-11-15

_ Laravel5.4+php5.6でduskをセットアップする

最初セットアップで色々回り道をしたのでその事について書いたのですが、結局自分の勘違いだということが分かりましたので、内容を変えてLaravel5.4+php5.6+dusk1.1でコードカバレッジを取得するについて書こうと思います(^^;)

ちなみに最初の勘違いというのは以下に起因するものです(書くんだ・・・)。
導入時には、app/Providers/AppServiceProvider.phpに以下を追加します。

  1
  2
  3
if ($this->app->environment('local', 'testing')) {
     $this->app->register(DuskServiceProvider::class);
 } 

しかしPHPStormだと1行目のenvironment()に警告が出ます。ちょっと探しても見つからなかったので、Laravelのバージョンが何か違うのかなーと思って以下のように修正してしまいました。

  1
  2
  3
if (app()->isLocal() and app()->runningUnitTests()) {
     $this->app->register(DuskServiceProvider::class);
 } 

ところがこれは完全に誤りです。この条件式では、.envのAPP_ENVがlocal'且つ'testingでないとDuskServiceProviderが登録されません。従ってphp artisan dusk:installを実行しようにも「There are no commands defined in the "dusk" namespace.」というエラーが出て、install ができません。

その結果色々手動でいじって、沼に填まってしまいました。
結論:PHPStormが警告を出しても一度疑って実行してみましょう(笑)


_ duskでカバレッジを取る

さて、本題のduskでカバレッジです。
結論だけさくさく書きます。

  1. 以下URLの通りにソースを修正します
    https://github.com/laravel/dusk/issues/258

  2. phpcovをインストールします
    composer require --dev phpunit/phpcov

以上です(笑)。これで、base_path() . "/build/dusk"に*.covファイルが作成され、storage/logs/coverage_dusk.xmlにカバレッジ結果が出力されるようになります。*.covファイルの作成先は改変コードの下から5行目あたりに書いてありますので、好みの場所に変えてください。私はstorage/logs/cov/duskにしました。

次に、これをhtmlに出力します。

vendor\bin\phpcov merge --html storage\logs\coverage_html storage\logs\cov

すると、storage/logs/coverage_htmlにHTMLでカバレッジレポートが出力されます。

_ phpunittest(CLI)の結果とマージする

duskの*.covとphpunittest(cli)の*.covをマージするため、まずはphpunit.xmlの<logging>要素に出力先を指定します。

  1
  2
  3
<logging>
    <log type="coverage-php" target="storage/logs/cov/cli/cli.cov" />
</logging>


次に、duskの方はphpunit.xmlのwhitelistは読んでくれないので、先ほど修正したコードDuskServiceProvider.php内に記述します。

  1
  2
  3
  4
  5
  6
  7
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を切り替える

実はこのカバレッジ、取得するとテストがとても遅くなります(当然ですが・・)。手元の環境では約3.5倍かかりました。
普段の確認ではカバレッジをoffにしておき、いざ取るというときだけonにできるようにしてみます。
頻繁には切り替えないと思いますので、.env.dusk.localファイルに指定する方法で実現します。

  1. config/app.phpに変数の取り込みを記載
    末尾あたりにこんな風に追記します。
    // dusk covertage mode
    'dusk_coverage' => env('DUSK_COVERAGE', false),

  2. .env.dusk.localに定義を記載
    DUSK_COVERAGE=false

  3. DuskServiceProvider.phpのカバレッジ定義部分にif文を追加
    以下の1行目のif文に、dusk_coverageを見るような条件式を追加します。
      1
      2
      3
      4
      5
      6
      7
    
    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%!(笑)


ドキュメントによると「(ダースク:夕暮れ)」だそうです。ということはこれはダスキンではなくて「ダースキン」?(そんなわけはない...)


Category: [Linux] - 21:28:03


}}


 
Last-modified: 2018-11-15 (木) 21:44:15 (248d)