从打字稿中的 Angular5 应用程序获取 Cobertura 覆盖范围

问题描述 投票:0回答:2

我目前正在开发一个项目,我们希望为单元测试提供一些代码覆盖率。 测试运行良好,但我在获得正确的覆盖范围时遇到了一些困难。

我们的 CiCd 在 VSTS 中运行,它请求导出 Cobertura 或 JaCoCo 中的代码覆盖率,以便发布结果。

因此,我们的应用程序是完全用 TypeScript 编写的 Angular 5 应用程序,每个组件/模块/...中嵌入了规范文件。

我们的测试正在使用 karma、jasmine 和 chrome 运行,我的 karma.conf.js 现在看起来像这样:

module.exports = function (config) { config.set({ basePath: '', frameworks: ['jasmine', '@angular/cli'], plugins: [ require('karma-jasmine'), require('karma-chrome-launcher'), require('karma-jasmine-html-reporter'), require('karma-coverage-istanbul-reporter'), require('@angular/cli/plugins/karma'), require('karma-junit-reporter'), require('karma-remap-coverage'), require('karma-coverage'), ], client:{ clearContext: false // leave Jasmine Spec Runner output visible in browser }, files: [ { pattern: 'src/**/*.ts' } ], preprocessors: { './src/**/*.ts': ['coverage'] }, coverageIstanbulReporter: { reports: [ 'cobertura' ], fixWebpackSourcePaths: true }, coverageReporter: { type: 'in-memory' }, remapOptions: { basePath: './src' }, remapIstanbulReporter: { reports: { html: 'coverage', cobertura: './coverage/cobertura.xml', } }, remapCoverageReporter: { 'text-summary': null, // to show summary in console html: './coverage/html', cobertura: './coverage/cobertura.xml' }, angularCli: { config: './angular-cli.json', environment: 'dev', codeCoverage: true }, reporters: ['progress', 'junit', 'coverage', 'remap-coverage'], port: 9876, colors: true, logLevel: config.LOG_INFO, autoWatch: true, browsers: ['Chrome'], singleRun: false, sourceMaps: true }); };

有一个 junit 的配置,因为 VSTS 也可以在 junit 中导出结果,但我不认为这是我现在问题的原因。 此外,conf 文件可能有一些不执行任何操作的配置,但由于我昨天为使其正常工作而进行了所有测试,因此它们仍然存在。

我担心的是,代码覆盖率没有完成,因为控制台在运行结束时输出它:

=============================== Coverage summary =============================== Statements : 100% ( 0/0 ) Branches : 100% ( 0/0 ) Functions : 100% ( 0/0 ) Lines : 100% ( 0/0 ) ================================================================================

但我确信我的测试没问题: Chrome 66.0.3359 (Mac OS X 10.12.6):执行了 264 次,共 291 次(跳过 27 次)成功(9.286 秒/0 秒)

此外,在运行开始时,我显示了很多错误:

04 05 2018 10:51:51.473:ERROR [preprocessor.coverage]: Line 1: Unexpected token at /Users/user/Documents/work/project/src/app/settings/settings.component.spec.ts Failed to parse file: /Users/user/Documents/work/project/src/app/settings/settings.component.ts

也许它可以来自这里?但我不知道这些错误是什么以及为什么会出现这些错误。

总的来说,我发现很难在网上找到关于这方面的优秀教程,有很多不同的库相互调用(karma /coverage/istanbul/karma-typescript / ....)并且他们的文档非常轻。

我做错了什么?我该如何解决这个问题?

typescript karma-jasmine cobertura karma-coverage
2个回答
0
投票
我无法解释您在 settings.component.spec.ts 中遇到的错误。但是,这就是您得到错误的覆盖范围摘要的原因。每当由于错误而无法完整执行测试时,就不会计算覆盖率,并且您会在覆盖率中获得上述摘要。


0
投票
总的来说,我发现很难在网上找到关于这方面的优秀教程,有很多不同的库相互调用(karma /coverage/istanbul/karma-typescript / ....)并且他们的文档非常轻。

我也有同样的感觉。 (很多次我在寻找答案时都偶然发现了这个 StackOverflow 问题。)

庆幸的是,今天我终于能够拿到karma的cobertura报告了。设置方法如下:

在我的

package.json

{ "devDependencies": { "jasmine-core": "5.1.1", "jasmine-reporters": "2.5.2", "jasmine-spec-reporter": "7.0.0", "karma": "6.4.2", "karma-chrome-launcher": "3.2.0", "karma-cli": "2.0.0", "karma-coverage": "2.2.1", "karma-jasmine": "5.1.0", "karma-jasmine-html-reporter": "2.1.0", "karma-junit-reporter": "2.0.1", }, // other settings }
在我的

karma.conf

module.exports = function (config) { config.set({ basePath: '', frameworks: ['jasmine', '@angular-devkit/build-angular'], plugins: [ require('karma-jasmine'), require('karma-jasmine-html-reporter'), require('karma-coverage'), require('@angular-devkit/build-angular/plugins/karma'), ], coverageReporter: { dir: require('path').join(__dirname, 'coverage'), reporters: [ { type: 'html', subdir: 'report-html' }, { type: 'cobertura', subdir: '.', file: 'cobertura-coverage.xml' }, { type: 'lcovonly', subdir: '.', file: 'report-lcovonly.txt' }, ], fixWebpackSourcePaths: true }, reporters: ['progress', 'kjhtml', 'junit', 'coverage'], // other settings }
请注意,没有提及

istanbul

。它仍在幕后使用,但 
karma-coverage-istanbul-reporter
 项目已被弃用。相反,只需使用 
karma-coverage

关键是这部分:

{ type: 'cobertura', subdir: '.', file: 'cobertura-coverage.xml' }


不幸的是,当我弄清楚这一切时,我还发现整个 karma 项目已被弃用。所以,很快我们就必须重新开始这个旅程。


以上内容对于任何发现此搜索“cobertura karma”或类似内容的人来说应该很有用,但OP的真正问题是它具有完全无效的Typescript:

Line 1: Unexpected token at settings.component.spec.ts


无论如何,我希望上述内容对那些偶然发现这个问题并试图让 Cobertura 工作的人(像我一样)有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.