如何通过SonarScanner for MSBuild编程排除指定项目的代码覆盖率分析?
我之前在维护多Visual Studio解决方案+共享代码项目的Sonar分析时,也碰到过一模一样的问题——公共代码的高覆盖率把业务项目的覆盖率拉得虚高,想单独统计公共代码的覆盖率,又不想永久修改.csproj配置。结合你用的SonarQube 7.0和SonarScanner for MSBuild 4.0.2版本,给你几个经过验证的解决思路:
方法1:精准传递sonar.coverage.exclusions参数
你之前用的**/MyCommonCode/**可能匹配范围太宽泛,或者路径格式没贴合Sonar识别的文件结构。试试把参数细化成针对代码文件的精准匹配,并且一定要在begin步骤传递:
SonarScanner.MSBuild.exe begin /k:"你的Sonar项目Key" /d:sonar.coverage.exclusions="**/MyCommonCode/**/*.cs"
注意:路径要和SonarQube界面里显示的公共代码文件路径一致(比如如果Sonar里显示的是src/MyCommonCode/Utils.cs,就用src/MyCommonCode/**/*.cs)。如果是在CI脚本里,还可以根据项目Key动态判断是否添加这个参数,只给需要排除的项目生效。
方法2:通过测试.runsettings文件排除公共项目
这个方法从覆盖率数据源头入手,让测试工具(比如VSTest)直接不收集公共项目的覆盖率,Sonar自然就不会统计了。创建一个ExcludeCommonCode.runsettings文件:
<RunSettings> <DataCollectionRunSettings> <DataCollectors> <DataCollector friendlyName="Code Coverage"> <Configuration> <CodeCoverage> <ModulePaths> <Exclude> <!-- 匹配公共项目的输出DLL --> <ModulePath>.*MyCommonCode\.dll$</ModulePath> </Exclude> </ModulePaths> </CodeCoverage> </Configuration> </DataCollector> </DataCollectors> </DataCollectionRunSettings> </RunSettings>
然后运行测试时指定这个文件:
vstest.console.exe 你的测试项目.dll /Settings:ExcludeCommonCode.runsettings
这种方式的好处是,不会影响Sonar对公共项目的代码质量分析,只是排除覆盖率统计。
方法3:用覆盖率工具(如OpenCover)直接排除
如果你用的是OpenCover这类第三方覆盖率工具,可以在生成覆盖率报告时直接排除公共项目的程序集:
OpenCover.Console.exe -target:"vstest.console.exe" -targetargs:"你的测试项目.dll" -filter:"-[MyCommonCode]*"
这里的-[MyCommonCode]*表示排除所有属于MyCommonCode程序集的代码,生成的覆盖率报告里就不会包含公共代码的数据,Sonar导入后自然就不会统计了。
这几个方法都能实现“仅部分Sonar项目排除公共代码覆盖率”的需求,你可以根据自己的CI流程选最顺手的。
内容的提问来源于stack exchange,提问作者nullPainter

