如何从代码覆盖率统计中排除GRPC生成的C#代码?
彻底排除GRPC生成代码的覆盖率统计方案
针对你遇到的GRPC生成代码无法被Coverlet彻底排除的问题,这里提供几种可靠的解决方法:
1. 通过生成文件路径直接排除(最推荐)
Grpc.Tools默认会把所有生成的C#代码输出到项目的obj/[配置]/[目标框架]/generated/目录下(例如obj/Debug/net6.0/generated/),直接在.runsettings中排除整个生成目录的代码,就能彻底覆盖所有GRPC生成的文件,不管是否带有GeneratedCodeAttribute:
<DataCollectionRunSettings> <DataCollectors> <DataCollector friendlyName="XPlat Code Coverage"> <Configuration> <!-- 排除所有GRPC生成代码的目录 --> <ExcludeByFile>**/obj/**/generated/**/*.cs</ExcludeByFile> <!-- 保留特性排除作为补充,兼容其他生成代码场景 --> <ExcludeByAttribute>GeneratedCodeAttribute</ExcludeByAttribute> </Configuration> </DataCollector> </DataCollectors> </DataCollectionRunSettings>
2. 自定义GRPC代码生成目录后排除
如果想让生成代码的路径更直观,可在GRPC服务项目的.csproj中指定统一的生成输出目录:
<PropertyGroup> <!-- 指定GRPC服务代码输出目录 --> <GrpcOutputDir>Generated/GrpcServices</GrpcOutputDir> <!-- 指定Protobuf消息代码输出目录 --> <ProtobufOutputDir>Generated/ProtobufMessages</ProtobufOutputDir> </PropertyGroup>
之后在.runsettings中排除这个自定义目录:
<ExcludeByFile>**/Generated/**/*.cs</ExcludeByFile>
这种方式更可控,也能避免误排除obj目录下的其他非生成文件。
3. 针对未带特性的生成成员补充排除(适配特定场景)
如果不想通过路径排除,可针对那些未添加GeneratedCodeAttribute的生成成员(比如_parser、__ServiceName、__Marshaller_*等),用ExcludeByMember规则精准匹配:
<DataCollectionRunSettings> <DataCollectors> <DataCollector friendlyName="XPlat Code Coverage"> <Configuration> <ExcludeByAttribute>GeneratedCodeAttribute</ExcludeByAttribute> <!-- 匹配GRPC生成的特定成员 --> <ExcludeByMember>*.get_*;*._parser;*.__ServiceName;*.__Marshaller_*;*.__Method_*</ExcludeByMember> </Configuration> </DataCollector> </DataCollectors> </DataCollectionRunSettings>
不过这种方式需要维护匹配规则,不如路径排除彻底。
补充说明:是否需要测试GRPC生成代码?
GRPC官方工具生成的代码已经经过官方的严格测试,属于框架级别的代码,不需要在业务测试中覆盖这部分内容,排除这些代码的覆盖率统计是合理的。
内容的提问来源于stack exchange,提问作者Richardissimo
相关产品推荐
相关产品推荐

