【问题标题】:Code coverage result is not accurate to real coverage in Xcode 7代码覆盖率结果与 Xcode 7 中的实际覆盖率不准确
【发布时间】:2015-06-22 09:48:09
【问题描述】:

我在启用代码覆盖数据 Xcode 7 Beta 2 的应用程序中运行测试用例。但是当我的所有测试用例都成功运行时,我只能获得少量文件覆盖数据。

某些文件已按单元测试用例覆盖了所有代码,但仍显示 3% 的代码覆盖率。

例如:

这是代码覆盖的结果,正如您在右侧看到的,有一个信息,这些代码行在测试期间被调用了多少次。在这种情况下 - 0。

但是……

这是测试中的一个地方,我们可以看到这个函数确实被调用了。多少次?哦……至少一次。此号码由右侧的信息提供。

所以上面的代码应该被标记为被调用,而不是变灰:-)

谁能解释一下?为什么会这样?

【问题讨论】:

  • 我的问题完全相同:) 我涵盖了整个课程,但是代码覆盖使我的方法变灰,实际上,它们不应该变灰。 (仅当变灰表示测试时未调用的代码)。等待答复...
  • 我认为它仍然是坏的(至少对于 iOS 项目)。我有一个针对 OSX 的测试项目,它可以按预期工作,但是对于触发的 iOS 自定义代码没有突出显示。

标签: ios xcode swift xcode7 code-coverage


【解决方案1】:

它工作正常

  1. 由于 Apple 发布了 @testable 关键字来将您的项目导入测试目标,您不必再将文件添加到两个目标:

  1. 因此,只需从您的测试目标中删除所有文件:

  1. 无论您需要从测试目标访问文件的任何位置,只需使用以下命令导入目标:@testable import MyApp

  1. 对项目中的每个文件执行此操作。

然后代码覆盖将正常工作。

阅读更多来自Swift 2 + Xcode 7: Unit Testing Access Made Easy!!!!

如果您需要了解如何处理代码覆盖率,请阅读 How to use code coverage in Xcode 7?

正如@Gerd Castan 之前提到的那样:“所以在我看来,当至少存在一个未测试此方法的目标时,经过测试的方法显示覆盖率为 0。”

解决方案很简单。不要让编译器认为该文件包含在多个目标中,而是使用 @testable 关键字导入您的模块。

【讨论】:

  • 它不工作。使用“@testable import”是个好主意,但它只适用于那些选择编译到测试目标的最简单的特殊情况。将某些类编译成多个(非测试)目标(如主应用程序 + 扩展程序,或免费应用程序 + 付费应用程序)有很多充分的理由。对于那些常见的情况,你的想法是行不通的。正如您在我的答案的源代码中看到的那样,我使用了“@testable import”,但源编辑器仍然没有显示覆盖范围。
  • 因为您的文件(我想)同时针对:应用程序和测试,因为它们不应该。 Apple 发布了@testable 关键字以避免同时定位文件。
  • 不。我没有将应用程序类编译到测试目标中。
  • 删除您的测试目标,然后重新创建它。有一次对我有好处。
  • 同意:不要编译到测试目标中并测试剩余的每个目标。
【解决方案2】:

我想我发现了 XCTest 覆盖范围正在做什么,这很有意义:

我的设置:

class1编译成target1

class2 编译成 target1 和 target2

测试设置:

import XCTest
@testable import target1

class MyTests: XCTestCase {
    func testSomething() {
        someMethodFromClass1()
        someMethodFromClass2()
    }
}

我发现 class1(编译到 target1)显示测试覆盖率,而 class2(编译到 target1 和 target2)显示没有测试覆盖率。

所以在我看来,当存在至少一个未测试此方法的目标时,已测试方法的覆盖率为 0。

这很有意义,因为在目标中测试方法并不能说明它在不同目标中的行为。

Apple 希望我们测试所有目标。

更新 支持这一理论的另一个提示:

转到报告导航器

然后点击覆盖范围。

如果您有多个目标,您会看到按目标分组的文件。

如果你在两个目标中有一个文件,你会看到你的文件两次。

如果您在两个目标中都有一个文件,则会针对两个目标显示该文件的代码覆盖率。而且(至少在我的项目中)一个文件在每个目标中都有不同的蓝线:

目标 1 的覆盖率:

目标 2 中同一测试运行中同一项目中同一文件的覆盖率:

如果您在源代码编辑器中查看您的测试覆盖率,Apple 必须决定它显示给您的覆盖率。 我认为显示覆盖率最低的目标是苹果在源代码编辑器中可以做的最好的事情。

针对特殊情况的简单修复:

如果您唯一的第二个目标是您的测试目标:不要编译到您的测试目标中并使用@testable import

对于所有其他情况,您必须测试每个目标。

【讨论】:

    【解决方案3】:

    我在 Apple 开发者论坛上查看了该主题,在阅读了各种帖子后,我想我找到了解决方案。

    为了使事情正常工作,有必要:

    1. 从测试目标中删除所有应用程序源文件
    2. 在您的单元测试源中输入@testable import <NameOfYourModule>
    3. 重新构建并重新运行测试

    我用我当前的项目对此进行了测试,结果要好得多。

    原始解决方案配方可在:http://natashatherobot.com/swift-2-xcode-7-unit-testing-access/

    此外,该功能似乎有点原始,因此可能存在错误,Apple 建议在事情未按预期工作时提交错误报告:

    我亲眼看到了一些非常大的项目的代码覆盖率结果。目前,该支持最适合应用程序和框架。如果这就是您正在测试的内容,那么最好您可以在https://bugreport.apple.com 提交错误报告,以便我们可以调查您的特定情况。就此而言,无论您拥有什么类型的项目,错误报告都是一件好事。如果可能的话,最好在实际的项目中附上报告。如果您不能这样做,请尽可能详细地描述其设置。图片不错。

    原帖:https://forums.developer.apple.com/message/9733#9733

    【讨论】:

      【解决方案4】:

      请记住,有多种方法可以用测试覆盖代码,您可能会测试所有函数,或者您可能会覆盖函数中的所有指令,但您可能无法覆盖所有可能的执行路径。

      或者 Xcode 覆盖的东西可能被破坏了,但是如果你没有详细说明你希望它检查什么样的覆盖,就很难判断了。

      【讨论】:

      • 所有函数和函数中的所有指令。当我运行测试时使用覆盖功能,在代码中使用的行是灰色的。但它的工作方式并不好。有太细的线条变灰。他们应该是。
      【解决方案5】:

      这是因为默认情况下为两个目标选择了项目的 .swift 文件。

      手动选择和删除文件的测试目标对我有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-29
        • 1970-01-01
        • 2011-01-18
        • 1970-01-01
        • 1970-01-01
        • 2012-06-30
        相关资源
        最近更新 更多