我正在使用量角器在我的 angularJS 应用程序中运行一些 e2e 测试(如 angularJS 文档中所建议的那样)。我四处搜索,找不到任何有关如何测量量角器测试覆盖率的信息。
我想我在这里遗漏了一些东西......有没有办法获得量角器 e2e 测试的代码覆盖率报告?或者它只是单元测试的一个功能?
我正在使用量角器在我的 angularJS 应用程序中运行一些 e2e 测试(如 angularJS 文档中所建议的那样)。我四处搜索,找不到任何有关如何测量量角器测试覆盖率的信息。
我想我在这里遗漏了一些东西......有没有办法获得量角器 e2e 测试的代码覆盖率报告?或者它只是单元测试的一个功能?
这是可以使用伊斯坦布尔实现的。这是过程,以及我从我们的项目中提取的一些示例配置(未经测试):
使用命令检测您的代码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))
});
使用插件protractor-istanbul-plugin配置 Protractor 。
// spec-e2e.conf.js
var istanbulPlugin = require('protractor-istanbul-plugin');
exports.config = {
// [...]
plugins: [{ inline: istanbulPlugin }]
};
运行你的测试。
istanbul report
。这种方法对我很有效,并且很容易与单元测试的覆盖率报告结合使用。为了自动化,我将第 1 步放入我的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"
},
如果您使用 grunt - 您可以使用grunt-protractor-coverage插件,它会为您完成这项工作。您必须先检测代码,然后使用提到的插件为您创建覆盖率报告。
要添加到 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));
});
}
}
};
我最初尝试了 daniellmb 建议的 onComplete 方法,但是如果在测试期间有多个页面加载,则仅在最后获取覆盖结果将不会包括所有结果。这里有一个要点总结了我是如何工作的,但基本上我必须创建一个报告器,每次规范完成时将覆盖结果添加到 instanbul 收集器,然后在 onComplete 方法中编写报告。我还必须按照 sjelin的建议使用“waitPlugin”,以防止量角器在写入结果之前退出。
我设法让它工作,但目前它是一个黑客。我使用现有的 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));
});
});
});