为啥这条线没有被覆盖? 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 会导致本地为提交代码被覆盖吗?为啥我从来没出现过,啥情况下才会被覆盖呢?

Xcode 6 代码覆盖率,没有 GDCA 文件“无法打开:没有这样的文件或目录”

UI 测试的 XCode 7 代码覆盖率结果

为啥 codecoverage 要我覆盖定义变量?

如何从Xcode中的代码覆盖范围中排除Pod

为啥 gcov 为 STL 标头创建代码覆盖率数据?