我目前正在开发一个项目,我们希望为单元测试提供一些代码覆盖率。 测试运行良好,但我在获得正确的覆盖范围时遇到了一些困难。
我们的 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 / ....)并且他们的文档非常轻。
我做错了什么?我该如何解决这个问题?
总的来说,我发现很难在网上找到关于这方面的优秀教程,有很多不同的库相互调用(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' }
Line 1: Unexpected token at settings.component.spec.ts