我有一个 Angular 项目,我想使用内置的单元测试工具(karma)和 cypress 来测试它。我的任务是合并两者的代码覆盖率报告。
我已成功创建覆盖配置。输出已成功与
nyc merge
合并:但是,数字不相加。
来自
package.json
的相关版本:
"@angular/core": "^16.0.3",
"cypress": "^12.13.0",
"istanbul-lib-coverage": "^3.2.0",
"@cypress/code-coverage": "^3.11.0",
"@cypress/webpack-preprocessor": "^5.17.1",
"@istanbuljs/nyc-config-typescript": "^1.0.2",
"@jsdevtools/coverage-istanbul-loader": "^3.0.5",
"karma": "^6.4.2",
"karma-coverage": "^2.2.0",
"nyc": "^15.1.0",
以下是 coverage-final.json
中
Karma覆盖率报告结果中的文件示例:
...
".../frontend/src/main/resources/ngapp/src/app/common/app-components/language-selector/language-selector.component.ts": {"path":".../frontend/src/main/resources/ngapp/src/app/common/app-components/language-selector/language-selector.component.ts","statementMap":{"0":{"start":{"line":16,"column":11},"end":{"line":16,"column":38}},"1":{"start":{"line":17,"column":12},"end":{"line":17,"column":40}},"2":{"start":{"line":18,"column":21},"end":{"line":18,"column":45}},"3":{"start":{"line":19,"column":12},"end":{"line":19,"column":38}},"4":{"start":{"line":23,"column":4},"end":{"line":23,"column":56}},"5":{"start":{"line":27,"column":4},"end":{"line":27,"column":30}},"6":{"start":{"line":28,"column":4},"end":{"line":28,"column":35}},"7":{"start":{"line":29,"column":4},"end":{"line":29,"column":62}},"8":{"start":{"line":33,"column":4},"end":{"line":33,"column":39}},"9":{"start":{"line":37,"column":4},"end":{"line":37,"column":30}},"10":{"start":{"line":38,"column":4},"end":{"line":38,"column":31}},"11":{"start":{"line":11,"column":13},"end":{"line":40,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":15,"column":2},"end":{"line":15,"column":null}},"loc":{"start":{"line":19,"column":38},"end":{"line":20,"column":6}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":22,"column":2},"end":{"line":22,"column":10}},"loc":{"start":{"line":22,"column":10},"end":{"line":24,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":26,"column":2},"end":{"line":26,"column":16}},"loc":{"start":{"line":26,"column":22},"end":{"line":30,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":32,"column":2},"end":{"line":32,"column":9}},"loc":{"start":{"line":32,"column":13},"end":{"line":34,"column":3}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":36,"column":2},"end":{"line":36,"column":18}},"loc":{"start":{"line":36,"column":18},"end":{"line":39,"column":3}}}},"branchMap":{},"s":{"0":11,"1":11,"2":11,"3":11,"4":7,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":1},"f":{"0":11,"1":7,"2":0,"3":0,"4":0},"b":{}}
...
Karma 运行的coverage-final.json
中Cypress
覆盖结果中的相同文件:
...
".../frontend/src/main/resources/ngapp/src/app/common/app-components/language-selector/language-selector.component.ts": {"path":".../frontend/src/main/resources/ngapp/src/app/common/app-components/language-selector/language-selector.component.ts","statementMap":{"0":{"start":{"line":11,"column":38},"end":{"line":11,"column":null}},"1":{"start":{"line":19,"column":38},"end":{"line":19,"column":null}},"2":{"start":{"line":16,"column":11},"end":{"line":16,"column":38}},"3":{"start":{"line":17,"column":12},"end":{"line":17,"column":40}},"4":{"start":{"line":18,"column":21},"end":{"line":18,"column":45}},"5":{"start":{"line":19,"column":12},"end":{"line":19,"column":38}},"6":{"start":{"line":23,"column":4},"end":{"line":23,"column":null}},"7":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"8":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"9":{"start":{"line":29,"column":4},"end":{"line":29,"column":null}},"10":{"start":{"line":33,"column":4},"end":{"line":33,"column":null}},"11":{"start":{"line":37,"column":4},"end":{"line":37,"column":null}},"12":{"start":{"line":38,"column":4},"end":{"line":38,"column":null}},"13":{"start":{"line":11,"column":13},"end":{"line":11,"column":null}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":11,"column":38},"end":{"line":11,"column":null}},"loc":{"start":{"line":11,"column":38},"end":{"line":11,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":15,"column":2},"end":{"line":15,"column":null}},"loc":{"start":{"line":19,"column":38},"end":{"line":20,"column":null}}},"2":{"name":"(anonymous_3)","decl":{"start":{"line":22,"column":2},"end":{"line":22,"column":10}},"loc":{"start":{"line":22,"column":10},"end":{"line":24,"column":null}}},"3":{"name":"(anonymous_4)","decl":{"start":{"line":26,"column":2},"end":{"line":26,"column":16}},"loc":{"start":{"line":26,"column":22},"end":{"line":30,"column":null}}},"4":{"name":"(anonymous_5)","decl":{"start":{"line":32,"column":2},"end":{"line":32,"column":9}},"loc":{"start":{"line":32,"column":13},"end":{"line":34,"column":null}}},"5":{"name":"(anonymous_6)","decl":{"start":{"line":36,"column":2},"end":{"line":36,"column":18}},"loc":{"start":{"line":36,"column":18},"end":{"line":39,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":13},"end":{"line":11,"column":38}},"type":"binary-expr","locations":[{"start":{"line":11,"column":13},"end":{"line":11,"column":38}},{"start":{"line":11,"column":13},"end":{"line":11,"column":38}}]}},"s":{"0":30,"1":190,"2":38,"3":38,"4":38,"5":38,"6":38,"7":0,"8":0,"9":0,"10":9992,"11":0,"12":0,"13":98},"f":{"0":30,"1":38,"2":38,"3":0,"4":9992,"5":0},"b":{"0":[38,38]}}
...
Cypress 运行的 将两者与 nyc merge
合并
后,我得到这个结果 `:
".../frontend/src/main/resources/ngapp/src/app/common/app-components/language-selector/language-selector.component.ts": {
"path": ".../frontend/src/main/resources/ngapp/src/app/common/app-components/language-selector/language-selector.component.ts",
"statementMap": {
"0": {
"start": {
"line": 11,
"column": 38
},
"end": {
"line": 11,
"column": null
}
},
"1": {
"start": {
"line": 19,
"column": 38
},
"end": {
"line": 19,
"column": null
}
},
"2": {
"start": {
"line": 16,
"column": 11
},
"end": {
"line": 16,
"column": 38
}
},
"3": {
"start": {
"line": 17,
"column": 12
},
"end": {
"line": 17,
"column": 40
}
},
"4": {
"start": {
"line": 18,
"column": 21
},
"end": {
"line": 18,
"column": 45
}
},
"5": {
"start": {
"line": 19,
"column": 12
},
"end": {
"line": 19,
"column": 38
}
},
"6": {
"start": {
"line": 23,
"column": 4
},
"end": {
"line": 23,
"column": null
}
},
"7": {
"start": {
"line": 27,
"column": 4
},
"end": {
"line": 27,
"column": null
}
},
"8": {
"start": {
"line": 28,
"column": 4
},
"end": {
"line": 28,
"column": null
}
},
"9": {
"start": {
"line": 29,
"column": 4
},
"end": {
"line": 29,
"column": null
}
},
"10": {
"start": {
"line": 33,
"column": 4
},
"end": {
"line": 33,
"column": null
}
},
"11": {
"start": {
"line": 37,
"column": 4
},
"end": {
"line": 37,
"column": null
}
},
"12": {
"start": {
"line": 38,
"column": 4
},
"end": {
"line": 38,
"column": null
}
},
"13": {
"start": {
"line": 11,
"column": 13
},
"end": {
"line": 11,
"column": null
}
}
},
"fnMap": {
"0": {
"name": "(anonymous_1)",
"decl": {
"start": {
"line": 11,
"column": 38
},
"end": {
"line": 11,
"column": null
}
},
"loc": {
"start": {
"line": 11,
"column": 38
},
"end": {
"line": 11,
"column": null
}
}
},
"1": {
"name": "(anonymous_2)",
"decl": {
"start": {
"line": 15,
"column": 2
},
"end": {
"line": 15,
"column": null
}
},
"loc": {
"start": {
"line": 19,
"column": 38
},
"end": {
"line": 20,
"column": null
}
}
},
"2": {
"name": "(anonymous_3)",
"decl": {
"start": {
"line": 22,
"column": 2
},
"end": {
"line": 22,
"column": 10
}
},
"loc": {
"start": {
"line": 22,
"column": 10
},
"end": {
"line": 24,
"column": null
}
}
},
"3": {
"name": "(anonymous_4)",
"decl": {
"start": {
"line": 26,
"column": 2
},
"end": {
"line": 26,
"column": 16
}
},
"loc": {
"start": {
"line": 26,
"column": 22
},
"end": {
"line": 30,
"column": null
}
}
},
"4": {
"name": "(anonymous_5)",
"decl": {
"start": {
"line": 32,
"column": 2
},
"end": {
"line": 32,
"column": 9
}
},
"loc": {
"start": {
"line": 32,
"column": 13
},
"end": {
"line": 34,
"column": null
}
}
},
"5": {
"name": "(anonymous_6)",
"decl": {
"start": {
"line": 36,
"column": 2
},
"end": {
"line": 36,
"column": 18
}
},
"loc": {
"start": {
"line": 36,
"column": 18
},
"end": {
"line": 39,
"column": null
}
}
}
},
"branchMap": {
"0": {
"loc": {
"start": {
"line": 11,
"column": 13
},
"end": {
"line": 11,
"column": 38
}
},
"type": "binary-expr",
"locations": [
{
"start": {
"line": 11,
"column": 13
},
"end": {
"line": 11,
"column": 38
}
},
{
"start": {
"line": 11,
"column": 13
},
"end": {
"line": 11,
"column": 38
}
}
]
}
},
"s": {
"0": 183,
"1": 983,
"2": 245,
"3": 245,
"4": 233,
"5": 212,
"6": 190,
"7": 0,
"8": 0,
"9": 0,
"10": 49960,
"11": 3,
"12": 0,
"13": 490,
"14": null,
"15": null,
"16": null,
"17": null,
"18": null,
"19": null,
"20": null,
"21": null
},
"f": {
"0": 183,
"1": 211,
"2": 190,
"3": 0,
"4": 49960,
"5": 0,
"6": null,
"7": null,
"8": null,
"9": null,
"10": null
},
"b": {
"0": [
190,
190
]
}
}
然后运行 nyc report --reporter=lcov --reporter=text-summary
结果:这可能是什么问题?我已经尝试了
https://github.com/istanbuljs/nyc/issues/1302 中的一些建议,但没有一个有效。迁移到早期版本的 Istambul(例如 14.1)会产生乱码数据(它不会解析我的 Typescript 文件)。
/cover
文件夹中的一个干净项目中并运行此语句(注释行是语法)
// nyc merge <input-directory> [output-file]
nyc merge cover cover-merged.json
我没有得到与你相同的合并文件。抽查
index:0
) 中是第 16 行,它的计数为
11
index:2
中并且有计数
38
index:2
中也有第 16 行,并且有计数
49
第 16 行计数在 cypress
lcov-report
中是
147
但在 cypress
coverage-final.json
中是
38
。我首先会集中精力比较
json
文件。问题中没有任何其他线索,但请检查
nyc merge <input-directory> [output-file]
命令的参数,并查找先前运行的输出文件。
并排 VS 代码