AngularJS中Protractor测试的代码覆盖率

时间:2014-03-12 11:52:47

标签: angularjs integration-testing code-coverage protractor end-to-end

我正在使用量角器在angularJS应用程序中运行一些e2e测试(如angularJS文档中所推荐)。 我已经用Google搜索了,无法找到有关如何衡量量角器测试覆盖率的任何信息。

我想我在这里遗漏了什么...有没有办法获得量角器e2e测试的代码覆盖率报告?或者它只是单元测试的一个功能?

5 个答案:

答案 0 :(得分:8)

使用Istanbul可以实现这一点。这是一个过程,我从项目中提取了一些示例配置(未经过测试):

  1. 使用$ARGV[0]命令检测代码。确保伊斯坦布尔的覆盖变量为istanbul instrument

    __coverage__
  2. 使用插件protractor-istanbul-plugin配置Protractor。

    // 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))
    });
    
  3. 运行测试。

  4. 使用// spec-e2e.conf.js var istanbulPlugin = require('protractor-istanbul-plugin'); exports.config = { // [...] plugins: [{ inline: istanbulPlugin }] };
  5. 提取报告

    这种方法对我有用,并且很容易与单元测试的覆盖率报告相结合。为了实现自动化,我已将步骤1放入我的istanbul report以及gulpfile.jstest posttest脚本中的步骤3和4,或多或少是这样的:

    package.json

答案 1 :(得分:4)

如果您正在使用grunt - 您可以使用grunt-protractor-coverage插件,它将为您完成工作。您必须首先检测代码,然后使用上述插件为您创建覆盖率报告。

答案 2 :(得分:2)

要添加到ryanb的答案,我还没有尝试过,但您应该可以使用类似gulp-istanbul的内容来检测代码并覆盖default coverage variable,然后定义onComplete在Protractor配置文件中的jasmineNodeOpts对象上运行。在关闭所有内容之前,它会被调用一次。

exports.config = {

  // ...

  jasmineNodeOpts: {
    onComplete: function(){
      browser.driver.executeScript("return __coverage__;").then(function(val) {
        fs.writeFileSync("/path/to/coverage.json", JSON.stringify(val));
      });
    }
  }
};

答案 3 :(得分:2)

我最初尝试过daniellmb建议的onComplete方法,但是如果在测试期间有多个页面加载,那么仅在结尾处获得覆盖结果将不包括所有结果。这里总结了我如何使事情有效,但基本上我必须创建一个记者,每当规范完成时,将覆盖结果添加到instanbul收集器,然后在onComplete方法中编写报告。我还必须使用“waitPlugin”as suggested by sjelin来阻止量角器在结果写入之前退出。

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

答案 4 :(得分:1)

我设法让它正常工作,但目前这是一个黑客攻击。我使用现有的grunt istanbul插件之一来检测代码。然后我制作了一个虚拟规范来抓取' coverage '全局变量并将其写入文件。之后,您可以使用任何报告插件创建报告。

(非常简化)测试看起来像:

describe('Output the code coverage objects', function() {
    it('should output the coverage object.', function() {
        browser.driver.executeScript("return __coverage__;").then(function(val) {
            fs.writeFileSync("/path/to/coverage.json", JSON.stringify(val));
        });
    });
});