如何从代码覆盖率中排除 GRPC 生成的 C# 代码

问题描述 投票:0回答:1

我们有 C# GRPC 服务。它引用“Grpc.AspNetCore”NuGet 包,该包又拉入“Grpc.Tools”包。据我所知,这些工具将项目中的“原始”文件转换为自动生成的代码。 Tests 项目引用服务项目,并具有 NuGet 包 Microsoft.NET.Test.Sdk、NUnit3TestAdapter、NUnit、coverlet.collector、Microsoft.CodeAnalysis 和其他一些我认为不相关的包。我们使用

dotnet test

和“XPlat Code Coverage”收集器来运行测试。

之前有人向 Coverlet

提出了关于将生成的代码从代码覆盖率中排除的问题,他们只是在等待 Grpc.Tools 更改为具有

GeneratedCode 属性的属性。看起来已经完成了,因为我可以看到生成的代码通常

具有该属性。
因此,我将以下部分添加到我们的“.runsettings”文件中,以排除具有该属性的内容:

<DataCollectionRunSettings> <DataCollectors> <DataCollector friendlyName="XPlat Code Coverage"> <Configuration> <ExcludeByAttribute>GeneratedCodeAttribute</ExcludeByAttribute> </Configuration> </DataCollector> </DataCollectors> </DataCollectionRunSettings>

这已经改善了事情。但也不完全是这样,部分原因是该属性并不总是到位。例如,它不会把它放在这个字段上:
    private static readonly pb::MessageParser<GetRedactedRequest> _parser = new pb::MessageParser<GetRedactedRequest>(()

或者这个
    static readonly string __ServiceName = "MyService.v1.Redacted";

也有一些地方存在属性
is
,但 coverlet 仍将这些报告为“未覆盖”(以下内容取自生成的报告,因此其中一些行被截断):

[global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)] static readonly grpc::Marshaller<global::MyService.V1.GetRedactedRequest> __Marshaller_MyService_v1_GetR [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)] static readonly grpc::Marshaller<global::MyService.V1.GetRedactedResponse> __Marshaller_MyService_v1_Get [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)] static readonly grpc::Method<global::MyService.V1.GetRedactedRequest, global::MyService.V1.GetRedactedRe grpc::MethodType.Unary, __ServiceName, "GetRedacted", __Marshaller_MyService_v1_GetRedactedRequest, __Marshaller_MyService_v1_GetRedactedResponse);

还有另一种方法可以排除它,即将生成的类放入特定的命名空间中,然后排除该命名空间中的所有内容;但这需要我们每次添加新的“原型”时确保它位于被排除的命名空间中。我正在寻找一种可以排除所有生成的 GRPC 代码的方法。
我不确定这是否是 Grpc Tools 或 Coverlet(或两者)上的错误;或者也许我们不应该将其排除在覆盖范围之外 - 也许我们应该对其进行单元测试(尽管这感觉不像“单元”测试)。我们如何从我们的代码覆盖率中排除生成的 GRPC 代码?

排除 Grpc.Tools 生成的文件的一种方法是使用 coverlet
code-coverage grpc-c# coverlet
1个回答
0
投票
排除生成的文件,并具有与 Grpc.Tools 中指定的输出目录中的 cs 文件匹配的模式(默认位于

obj

 下)目录)。

© www.soinside.com 2019 - 2024. All rights reserved.