SonarQube报告.NET 8代码覆盖率部分缺失,咨询缺失项及排查方法
问题:SonarQube检测.NET 8代码finally块部分覆盖问题
我在构建流程中运行SonarQube检测代码覆盖率,.NET 8代码包含try/catch/finally块:try块使用FTP客户端连接FTP服务器,finally块执行断开连接操作。

SonarQube报告中,finally块的最后一行标记为红色,显示“部分覆盖测试(4个条件中覆盖2个)”,但未明确指出缺失覆盖的具体条件。我已编写测试覆盖以下场景:
- 正常流程(
_client初始化成功,Disconnect()执行无异常) - 多种触发finally块执行的异常场景(try块抛出异常,进入finally)
- 模拟
_client.Disconnect()抛出异常,验证未记录“Finish disconnecting client”文本
想请教:该代码行可能缺失哪些条件的覆盖?SonarCloud是否有办法显示具体缺失项?
回答
一、可能缺失覆盖的条件
结合代码结构(finally块内嵌套try/catch,使用?.调用Disconnect()),SonarQube统计的4个条件对应以下分支,你大概率遗漏了其中两个:
_client为null的场景:如果try块中_client初始化失败(比如实例化FTP客户端时抛出异常),finally块执行时_client是null,此时_client?.Disconnect()会直接跳过,直接执行_logger.LogInformation("Finish disconnecting client"),这个分支你可能未覆盖。_client不为null,但Disconnect()执行无异常,且try块本身抛出异常的场景:你可能测了正常流程(try块无异常+Disconnect成功),但没测“try块抛出异常→进入finally→Disconnect成功→执行成功日志”这个分支。
二、SonarCloud查看具体缺失项的方法
SonarCloud支持查看分支覆盖的具体缺失项:
- 进入项目的Code Coverage页面,找到对应的代码文件并点击进入;
- 在代码详情视图中,将鼠标悬停在标记为部分覆盖的代码行上,会弹出提示框,明确显示哪些分支未被覆盖;
- 也可以在文件的覆盖率详情面板中,查看每行的分支覆盖统计,包括未覆盖分支的具体描述。
内容的提问来源于stack exchange,提问作者g0np
相关产品推荐
相关产品推荐

