Xcode中Swift计算属性的代码覆盖率异常问题问询
这种情况我之前也踩过坑,大概率不是Xcode的Bug,而是一些容易忽略的细节在搞鬼,咱们一步步来排查:
确保测试用例的数值能明确区分两个分支
你有没有注意到,如果targetRect.size的宽和高是相等的(比如都是100x100),那不管rotated是true还是false,nativeSize返回的结果都是一样的。这时候Xcode的覆盖率工具可能因为两个分支的输出没有差异,误判其中一个分支没被执行到。
建议修改测试用例,给targetRect设置宽高不同的数值,比如CGRect(x:0, y:0, width:100, height:200),这样rotated=true时返回(200,100),false时返回(100,200),两个分支的结果完全不同,测试断言也能明确区分,覆盖率工具就能正确识别两个分支都被执行了。检查
CGSize.rotated扩展的覆盖率
虽然你说红色标记在结构体的计算属性区域,但如果rotated这个扩展方法本身没被测试覆盖,会不会间接影响结构体的覆盖率统计?可以确认下测试用例中,当rotated=true时,是否真的触发了size.rotated的逻辑——比如断言的时候明确对比宽高值,而不是只判断CGSize是否相等(逻辑上是对的,但能确保工具识别到分支执行)。清理Xcode缓存,重新构建测试
Xcode的覆盖率数据偶尔会出现缓存异常,导致显示错误。试试这些操作:- 用
Cmd+Shift+K清理项目的编译缓存 - 前往
Xcode > Settings > Locations,找到Derived Data,点击箭头打开文件夹并删除整个文件夹 - 重新以Coverage模式运行单元测试(确保测试计划里勾选了“Gather coverage data”)
- 用
调整计算属性的代码写法
有时候Xcode的覆盖率工具对紧凑的单行if-else逻辑识别不够准确,可以尝试把代码拆开来写,比如:var nativeSize: CGSize { let baseSize = targetRect.size if rotated { return baseSize.rotated } else { return baseSize } }这种写法更清晰,也能让覆盖率工具更容易识别两个分支的执行情况。
一般来说,按照上面的步骤排查后,覆盖率显示的问题就能解决,很少是Xcode本身的Bug哦。
内容的提问来源于stack exchange,提问作者Nicolas Miari

