Azure DevOps CI任务无法同时运行.NET Framework与.NET Core单元测试
混合框架解决方案Azure DevOps流水线全量代码覆盖率采集方案
现存场景与问题
- 解决方案包含多类不同目标框架的项目:
- 面向.NET Standard的
library.csproj核心类库项目 - 面向.NET Framework的
library.UnitTests.csproj单元测试项目 - 面向.NET Core 2.2的
WebApi.csproj服务项目 - 面向.NET Core 2.2、AnyCPU平台构建的
WebApi.UnitTests.csproj单元测试项目
- 面向.NET Standard的
- 流水线基于Azure DevOps搭建,核心目标为采集全量单元测试的代码覆盖率,同步至SonarQube平台完成质量分析
- 原生配置报错:测试执行环节默认采用面向.NET Framework 4.0、X64平台的配置运行测试,无法识别匹配.NET Core 2.2 AnyCPU格式的
WebApi.UnitTests.dll,触发框架不匹配报错 - 已尝试的临时调整:将两类测试拆分为两个独立测试任务执行,拆分后测试流程可正常运行,但单环节生成的代码覆盖率数据无法跨任务留存,无法支撑SonarQube的全量分析要求
可实现全量覆盖率采集的落地方案
方案1:单测试任务适配混合框架并行执行
- 调整Visual Studio Test任务的
Test assemblies参数,手动配置两类测试dll的匹配路径,替换默认的全量扫描规则,避免无关dll被错误加载 - 在任务的执行配置栏,取消勾选仅使用默认测试宿主运行选项,让任务可自动识别测试dll对应的运行时:面向.NET Framework的测试dll自动绑定VSTest运行器执行,面向.NET Core的测试dll自动绑定dotnet test运行时执行
- 开启任务内置的代码覆盖率采集开关,该模式会自动对两类测试的执行流程完成插桩,生成统一格式的覆盖率输出文件,直接对接后续SonarQube分析流程
方案2:拆分测试任务时的覆盖率合并适配
- 若单任务适配存在版本兼容问题,可保留两个独立的测试执行任务,每个任务单独开启代码覆盖率采集,分别生成独立的
.coverage格式输出文件 - 在两个测试任务全部执行完成后,新增一个命令行任务,调用内置的
codecoverage.exe工具将两个独立生成的覆盖率文件合并为单个标准格式文件 - SonarQube分析环节配置为读取合并后的覆盖率文件作为输入,即可完成全量覆盖率的上传分析
关键注意事项
- 针对.NET Core 2.2版本的测试项目,需提前在流水线代理上预置对应版本的.NET Core SDK,避免运行时缺失导致测试执行失败
- SonarQube的前置分析初始化环节需配置在所有测试执行、覆盖率合并步骤完成之后再启动,不可前置触发,否则会出现覆盖率文件缺失的分析异常
内容的提问来源于stack exchange,提问作者Wael Mkaddem
相关产品推荐
相关产品推荐

