11

angularJS アプリで分度器を使用していくつかの e2e テストを実行しています (angularJS のドキュメントで推奨されているように)。グーグルで検索しましたが、分度器テストのカバレッジを測定する方法に関する情報が見つかりません。

ここで何かが足りないと思います... 分度器 e2e テストのコード カバレッジ レポートを取得する方法はありますか? それとも単体テスト用の機能ですか?

4

5 に答える 5

9

これは、イスタンブールを使用して実現できます。私たちのプロジェクトから抽出した (テストされていない) いくつかの構成例を含むプロセスは次のとおりです。

  1. コマンドを使用してコードを計測しますistanbul instrument。イスタンブールのカバレッジ変数が であることを確認してください__coverage__

    // gulpfile.js
    
    gulp.task('concat', function () {
        gulp.src(PATH.src)
          // Instrument for protractor-istanbul-plugin:
          .pipe(istanbul({coverageVariable: '__coverage__'}))
          .pipe(concat('scripts.js'))
          .pipe(gulp.dest(PATH.dest))
    });
    
  2. プラグインprotractor-istanbul-plugin で分度器を設定します。

    // spec-e2e.conf.js
    var istanbulPlugin = require('protractor-istanbul-plugin');
    
    exports.config = {
        // [...]
        plugins: [{ inline: istanbulPlugin }]
    };
    
  3. テストを実行します。

  4. を使用してレポートを抽出しますistanbul report

このアプローチは私にとってはうまくいき、単体テストのカバレッジ レポートと簡単に組み合わせることができます。自動化するために、ステップ 1 を my にgulpfile.js、ステップ 3 と 4 をtestとのposttestスクリプトに入れましたpackage.json。多かれ少なかれ次のようになります。

// In package.json:
"scripts": {
  "test": "gulp concat && protractor tests/spec-e2e.conf.js",
  "posttest": "istanbul report --include coverage/**/.json --dir reports/coverage cobertura"
},
于 2015-10-07T21:37:29.047 に答える
2

私は最初にdaniellmbによって提案されたonCompleteメソッドを試しましたが、テスト中に複数のページの読み込みがあった場合、最後にのみカバレッジ結果を取得するとすべての結果が含まれません. これがどのように機能するようになったかを要約した要点ですが、基本的には、スペックが終了するたびにカバレッジ結果をインスタントコレクターに追加するレポーターを作成し、onComplete メソッドでレポートを作成する必要がありました。結果が書き込まれる前に分度器が終了するのを防ぐために、sjelin が提案するように「waitPlugin」も使用する必要がありました。

https://gist.github.com/jbarrus/286cee4294a6537e8217

于 2015-07-24T03:58:36.393 に答える
2

ryanbの答えに追加するために、私はこれを試していませんが、gulp -istanbulのようなものを使用してコードを計測し、デフォルトのカバレッジ変数をオーバーライドしてから、分度器構成ファイルonCompleteのオブジェクトに関数を定義できるはずです。jasmineNodeOptsすべてが閉じられる直前に一度呼び出されます。

exports.config = {

  // ...

  jasmineNodeOpts: {
    onComplete: function(){
      browser.driver.executeScript("return __coverage__;").then(function(val) {
        fs.writeFileSync("/path/to/coverage.json", JSON.stringify(val));
      });
    }
  }
};
于 2014-06-14T22:52:42.163 に答える