为啥这条线没有被覆盖? Xcode 代码覆盖率
Posted
技术标签:
【中文标题】为啥这条线没有被覆盖? Xcode 代码覆盖率【英文标题】:Why this line is not covered? Xcode code coverage为什么这条线没有被覆盖? Xcode 代码覆盖率 【发布时间】:2019-03-20 09:36:04 【问题描述】:我在 Xcode 中遇到代码覆盖率报告问题。 从这个截图可以看出:
在左侧选项卡上,第 58 行从断点“触及”,在右侧选项卡上,测试通过。在右侧选项卡上,我只运行第 37 行的测试。
为什么 Xcode 将第 58 行标记为红色,因为没有被覆盖?
第 53 行没有被“触及”(如果我在那里设置断点)。 使用 SQLite 作为数据库。
整个项目可用here。
编辑:添加代码:
Test.swift
func testAddFuelFail()
fuelsManager.dropTable()
XCTAssertEqual(addFuel(), -1)
FuelsManager.swift
func addFuel(dateOfFuel: Date, mileageOnSave: Int, quantityOfFuel: Double, pricePerUnitOfFuel: Double) -> Int64
let insertFuel = fuelsTable.insert(date <- dateOfFuel, mileage <- mileageOnSave, quantity <- quantityOfFuel, pricePerUnit <- pricePerUnitOfFuel)
do
let id = try database!.run(insertFuel)
return id
catch
print(error)
return -1
【问题讨论】:
关于这个问题,我们怎么知道database
是什么以及run
方法是如何定义的或者dropTable
是做什么的?我只能假设 run
在出现问题而不是生成错误或 Xcode 代码覆盖率被破坏时返回 -1
如果断点被触及,则表示返回值为“-1”,也表示该行被覆盖。为什么 Xcode 将其报告为未涵盖?
啊,我没有得到关于“触及”的部分,但如果第 51 行没有被触及,那么之前一定发生了错误,只留下let insertFuel = ...
,这没有多大意义。您是否尝试过使用打印语句而不是断点来跟踪正在发生的事情?
@JoakimDanielson 我刚刚上传了一张带有打印声明的新图片。
对我来说,这看起来像是代码覆盖工具中的一个错误。
【参考方案1】:
其实这是一个错误报告here。
在 XC 10 上对同一二进制文件进行多次运行时,覆盖率会有所不同。就像在第一次运行时它显示 x% 而在另一次运行中它会显示 y% 保持相同的代码。 在 XC 10 上运行的 11.4 模拟器和 12.0 模拟器上运行时,覆盖数/测试数会有所不同 测试数量也略有不同,例如在某些运行中是 5507 次测试,而在某些运行中是 5506。
XC 10 肯定有很多错误。
【讨论】:
【参考方案2】:取出断点并运行测试。一旦测试完成运行,覆盖信息应该会改变。
【讨论】:
感谢您的回答,但即使没有断点,代码也不会被覆盖。以上是关于为啥这条线没有被覆盖? Xcode 代码覆盖率的主要内容,如果未能解决你的问题,请参考以下文章
git pull 会导致本地为提交代码被覆盖吗?为啥我从来没出现过,啥情况下才会被覆盖呢?