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配置 Protractor 。

    // spec-e2e.conf.js
    var istanbulPlugin = require('protractor-istanbul-plugin');
    
    exports.config = {
        // [...]
        plugins: [{ inline: istanbulPlugin }]
    };
    
  3. 运行你的测试。

  4. 使用 提取报告istanbul report

这种方法对我很有效,并且很容易与单元测试的覆盖率报告结合使用。为了自动化,我将第 1 步放入我的gulpfile.js和第 3 步和第 4 步中的testposttest脚本中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 回答
4

如果您使用 grunt - 您可以使用grunt-protractor-coverage插件,它会为您完成这项工作。您必须先检测代码,然后使用提到的插件为您创建覆盖率报告。

于 2014-07-22T17:07:19.990 回答
2

要添加到 ryanb 的答案,我还没有尝试过,但是您应该能够使用gulp-istanbul之类的东西来检测代码并覆盖默认覆盖变量,然后在 Protractor 配置文件中的对象上定义一个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 回答
2

我最初尝试了 daniellmb 建议的 onComplete 方法,但是如果在测试期间有多个页面加载,则仅在最后获取覆盖结果将不会包括所有结果。这里有一个要点总结了我是如何工作的,但基本上我必须创建一个报告器,每次规范完成时将覆盖结果添加到 instanbul 收集器,然后在 onComplete 方法中编写报告。我还必须按照 sjelin的建议使用“waitPlugin”,以防止量角器在写入结果之前退出。

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

于 2015-07-24T03:58:36.393 回答
1

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

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

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));
        });
    });
});
于 2014-03-26T21:18:26.873 回答