You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在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工具转换,步骤如下:

  1. 用OpenCover收集C#代码覆盖率:
OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test YourProject.csproj --no-build" -output:"opencover-results.xml" -filter:"+[*]* -[*.Tests]*" -register:user
  • 这里的filter参数要根据你的项目调整,+[*]*表示包含所有项目,-[*.Tests]*排除测试项目
  1. 用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任务:

  1. 第一个任务处理JS覆盖率:
    • Code coverage tool: Cobertura
    • Summary file: $(Build.SourcesDirectory)/coverage/cobertura-coverage.xml
  2. 第二个任务处理C#覆盖率:
    • Code coverage tool: Cobertura
    • Summary file: $(Build.SourcesDirectory)/coverage-csharp/Cobertura.xml
    • 关键:勾选Merge with existing coverage results选项,这样VSTS会自动把两个报告的统计数据合并展示在同一页面

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

火山引擎 最新活动