我们有 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.Tools 生成的文件的一种方法是使用 coverlet
obj
下)目录)。