我正在使用量角器在angularJS应用程序中运行一些e2e测试(如angularJS文档中所推荐)。 我已经用Google搜索了,无法找到有关如何衡量量角器测试覆盖率的任何信息。
我想我在这里遗漏了什么...有没有办法获得量角器e2e测试的代码覆盖率报告?或者它只是单元测试的一个功能?
答案 0 :(得分:8)
使用Istanbul可以实现这一点。这是一个过程,我从项目中提取了一些示例配置(未经过测试):
使用$ARGV[0]
命令检测代码。确保伊斯坦布尔的覆盖变量为istanbul instrument
。
__coverage__
使用插件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))
});
运行测试。
// spec-e2e.conf.js
var istanbulPlugin = require('protractor-istanbul-plugin');
exports.config = {
// [...]
plugins: [{ inline: istanbulPlugin }]
};
。这种方法对我有用,并且很容易与单元测试的覆盖率报告相结合。为了实现自动化,我已将步骤1放入我的istanbul report
以及gulpfile.js
和test
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来阻止量角器在结果写入之前退出。
答案 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));
});
});
});