You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从代码覆盖率统计中排除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 05:42:47