Azure DevOps构建流水线:如何从代码覆盖率中排除文件夹
解决XPlat代码覆盖率中排除Migrations文件夹的问题
你遇到的问题是因为XPlat Code Coverage对配置节点的支持和你之前的写法不匹配,以下是可行的配置方案:
正确的cover.runsettings配置
针对Migrations文件夹的源文件,直接匹配源文件路径是最可靠的方式,同时可以兼容程序集排除(如果Migrations编译为独立程序集):
<DataCollector friendlyName="XPlat code coverage"> <Configuration> <CodeCoverage> <!-- 排除所有路径包含Migrations的C#源文件 --> <Sources> <Exclude> <Source>.*Migrations.*\.cs$</Source> </Exclude> </Sources> <!-- 如果Migrations编译成单独的dll,添加此规则排除整个程序集 --> <ModulePaths> <Exclude> <ModulePath>.*Migrations\.dll$</ModulePath> </Exclude> </ModulePaths> <!-- 保留对[ExcludeFromCodeCoverage]属性的支持 --> <Attributes> <Exclude> <Attribute>System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute</Attribute> </Exclude> </Attributes> </CodeCoverage> </Configuration> </DataCollector>
为什么之前的配置无效?
ExcludeDirectories节点:XPlat Code Coverage并不支持这个节点,仅推荐使用Sources、ModulePaths来过滤代码覆盖率范围。- 正则匹配精度不足:之前的
.*Migrations.*没有限定文件类型,无法精准匹配到Migrations下的C#文件;如果Migrations和主程序集编译在一起,ModulePaths的规则也无法生效(因为程序集名称不含Migrations)。 - 路径匹配逻辑:XPlat的
Sources节点基于编译时的源文件路径匹配,而非项目相对路径,.*Migrations.*\.cs$的正则可以覆盖各种路径格式的匹配。
额外验证步骤
- 本地运行测试命令,确认配置生效:
dotnet test --configuration Release --settings ./cover.runsettings --collect:"XPlat Code Coverage" - 查看生成的
coverage.cobertura.xml文件,搜索"Migrations"关键字,确认没有相关类被统计。 - 流水线中确保
cover.runsettings的路径正确,可改为绝对路径避免相对路径问题:arguments: '--configuration $(buildConfiguration) --settings $(System.DefaultWorkingDirectory)/cover.runsettings'
内容的提问来源于stack exchange,提问作者Cheffa Sam
相关产品推荐
相关产品推荐

