如何在VSTS中合并Angular 6与.NET Core项目的代码覆盖率结果?
合并VSTS中C#与JavaScript代码覆盖率报告的方案
这个场景我帮不少开发者解决过,尤其是前后端同项目的.NET Core + Angular组合,确实容易遇到VSTS里两种语言覆盖率不能合并展示的问题。核心思路是把两种覆盖率报告统一转换成VSTS支持的格式,再通过任务合并上传,下面给你详细步骤:
1. 统一覆盖率报告格式
VSTS对Cobertura格式的覆盖率报告支持最好,所以我们需要把JS和C#的覆盖率都转成这个格式:
处理JavaScript(Angular 6 + karma-coverage-istanbul-reporter)
在你的karma.conf.js里,给istanbul reporter添加Cobertura输出配置:
coverageIstanbulReporter: { reports: ['html', 'lcovonly', 'cobertura'], // 新增cobertura格式 dir: require('path').join(__dirname, './coverage'), fixWebpackSourcePaths: true, 'report-config': { html: { subdir: 'html' } } }
运行ng test --code-coverage后,会在项目根目录的coverage文件夹下生成cobertura-coverage.xml文件。
处理C#(改用OpenCover替代MSTest Cover)
OpenCover本身不输出Cobertura,但可以用ReportGenerator工具转换,步骤如下:
- 用OpenCover收集C#代码覆盖率:
OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test YourProject.csproj --no-build" -output:"opencover-results.xml" -filter:"+[*]* -[*.Tests]*" -register:user
- 这里的
filter参数要根据你的项目调整,+[*]*表示包含所有项目,-[*.Tests]*排除测试项目
- 用ReportGenerator把OpenCover的结果转成Cobertura格式:
ReportGenerator.exe -reports:"opencover-results.xml" -targetdir:"coverage-csharp" -reporttypes:Cobertura
执行后会在coverage-csharp目录下生成Cobertura.xml文件。
2. 在VSTS中合并并上传报告
有两种方式可以实现合并展示,选一种适合你的:
方式一:合并两个Cobertura报告后上传
先把JS和C#的Cobertura报告合并成一个文件,再上传到VSTS:
ReportGenerator.exe -reports:"coverage/cobertura-coverage.xml;coverage-csharp/Cobertura.xml" -targetdir:"merged-coverage" -reporttypes:Cobertura
然后在VSTS的构建/发布管道中添加Publish Code Coverage Results任务,配置:
- Code coverage tool: 选择
Cobertura - Summary file: 填写路径
$(Build.SourcesDirectory)/merged-coverage/Cobertura.xml - 可选:勾选Add coverage files to build artifact,把合并后的报告作为构建产物保存
方式二:多任务上传并合并结果
如果不想合并文件,可以添加两个Publish Code Coverage Results任务:
- 第一个任务处理JS覆盖率:
- Code coverage tool:
Cobertura - Summary file:
$(Build.SourcesDirectory)/coverage/cobertura-coverage.xml
- Code coverage tool:
- 第二个任务处理C#覆盖率:
- Code coverage tool:
Cobertura - Summary file:
$(Build.SourcesDirectory)/coverage-csharp/Cobertura.xml - 关键:勾选Merge with existing coverage results选项,这样VSTS会自动把两个报告的统计数据合并展示在同一页面
- Code coverage tool:
3. 注意事项
- 确保VSTS代理服务器上安装了OpenCover和ReportGenerator,用Chocolatey安装很方便:
choco install opencover reportgenerator - 调整OpenCover的
filter参数,避免统计无关代码(比如第三方依赖、测试项目) - 确认Angular的测试命令确实生成了Cobertura报告,
ng test --code-coverage会触发覆盖率收集 - 如果用.NET Core 2.0+的内置测试工具,也可以用
dotnet test /p:CollectCoverage=true收集覆盖率,但OpenCover的过滤和兼容性更好
这样操作后,VSTS的测试结果页面就能同时展示C#和JavaScript的整体覆盖率统计,以及各自的详细文件覆盖率数据了。
内容的提问来源于stack exchange,提问作者Chamika Sandamal




