Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS中量角器测试的代码覆盖率_Angularjs_Integration Testing_Code Coverage_Protractor_End To End - Fatal编程技术网

AngularJS中量角器测试的代码覆盖率

AngularJS中量角器测试的代码覆盖率,angularjs,integration-testing,code-coverage,protractor,end-to-end,Angularjs,Integration Testing,Code Coverage,Protractor,End To End,我正在使用量角器在我的angularJS应用程序中运行一些e2e测试(正如angularJS文档中建议的那样)。 我在谷歌上到处搜索,找不到关于如何测量量角器测试覆盖率的任何信息 我想我错过了一些东西。。。有没有办法获得量角器e2e测试的代码覆盖率报告?或者它只是单元测试的一个特性 我设法让它工作起来了,但目前这是个难题。我使用一个现有的grunt伊斯坦布尔插件来插入代码。然后我制作了一个虚拟规范,它获取“覆盖率””全局变量并将其写入文件。之后,您可以使用任何报告插件创建报告 (过于简化的)测试

我正在使用量角器在我的angularJS应用程序中运行一些e2e测试(正如angularJS文档中建议的那样)。 我在谷歌上到处搜索,找不到关于如何测量量角器测试覆盖率的任何信息


我想我错过了一些东西。。。有没有办法获得量角器e2e测试的代码覆盖率报告?或者它只是单元测试的一个特性

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

(过于简化的)测试如下所示:

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));
        });
    });
});

为了补充ryanb的答案,我还没有尝试过这个方法,但您应该能够使用类似的方法来插入代码并覆盖,然后在量角器配置文件中的
jasmineNodeOpts
对象上定义
onComplete
函数。在一切关闭之前,它会被调用一次

exports.config = {

  // ...

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

如果您使用的是grunt-您可以使用插件,它将为您完成这项工作。您必须首先插入代码,然后使用上述插件为您创建覆盖率报告。

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

这可以通过使用来实现。以下是流程,以及我从项目中提取的一些示例配置(未测试):

  • 使用命令
    Instrument
    插入代码。确保伊斯坦布尔的覆盖率变量为
    \uuuuuuuuuuuuuuuuuuuuuu

    // 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))
    });
    
  • 使用插件配置量角器

  • 运行您的测试

  • 使用
    伊斯坦布尔报告
    提取报告
  • 这种方法对我很有效,并且很容易与单元测试的覆盖率报告结合起来。为了实现自动化,我将步骤1放入
    gulpfile.js
    中,将步骤3和4放入
    test
    中,并将
    post-test
    脚本放入
    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"
    },
    

    依我看,代码覆盖率是针对单元测试的,而不是e2e测试。@YeLiu,你能解释一下你为什么这么想吗?你能分享一个示例
    gulpfile.js
    ?我无法在浏览器中获取覆盖率变量。谢谢。@ezequielc用示例配置更新了答案。希望有帮助!谢谢@dag-høidahl。在我删除
    .pipe(伊斯坦布尔.hookRequire())
    之前,没有生成插入指令的文件,就像在您的示例中一样。干杯这也适用于角度应用吗?它对我的angularjs应用程序有效,但面临Angular5应用程序的问题。@DagHøidahl如果我的项目中有很多gulpfile.js,那么哪一个是正确的配置?
    // In package.json:
    "scripts": {
      "test": "gulp concat && protractor tests/spec-e2e.conf.js",
      "posttest": "istanbul report --include coverage/**/.json --dir reports/coverage cobertura"
    },