关于Visual Studio中代码覆盖率显示单行部分未覆盖的技术咨询
我之前也遇到过VS2019里这种奇怪的部分覆盖标记,大概率是下面这几个原因导致的,你可以逐一排查:
同一行包含多个条件分支:这是最常见的情况。比如一行代码里有
&&、||这类逻辑运算符,或者嵌套的三元表达式(condition ? val1 : val2),VS的覆盖率统计是按行内的分支路径来算的,不是只要执行过该行就算完全覆盖。举个例子:bool canLogin = user.IsActive && user.HasVerifiedEmail;如果你的测试只覆盖了
user.IsActive为真但HasVerifiedEmail为假的场景,那&&后面的判断分支没走到,整行就会被标记为“Partially covered”——因为行内有未覆盖的执行路径。一行内有多个独立语句:虽然这种情况不多见,但如果一行代码里写了多个语句(比如
int a = 1; int b = a + 2;),要是其中某个语句因为条件编译、运行时跳过等原因没被执行,也会触发部分覆盖的标记。异常路径未覆盖:如果该行代码可能抛出异常,而你的单元测试只覆盖了正常执行的场景,没测异常触发的情况,VS会认为这行的异常分支没覆盖。比如:
var data = JsonConvert.DeserializeObject<MyModel>(inputString);要是你只测试了合法的
inputString,没测格式错误的情况,那这行就会显示部分覆盖——因为异常抛出的路径没被走到。编译器优化干扰:VS的编译器优化有时候会改变代码的实际执行路径,导致覆盖率统计出现偏差。你可以右键项目→属性→生成→取消勾选“优化代码”,然后清理解决方案、重新生成,再跑一遍测试和覆盖率分析,看看标记是否正常。
覆盖率工具的小bug:偶尔VS2019的覆盖率工具会出现统计异常。这种情况下,尝试清理整个解决方案(Build→Clean Solution),删除bin/obj文件夹,重新生成所有项目后再运行测试,往往能解决这类奇怪的问题。
内容的提问来源于stack exchange,提问作者PierreP

