代码覆盖率结果不准确到Xcode 7中的实际覆盖率

时间:2015-06-22 09:48:10

标签: ios xcode swift xcode7 code-coverage

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

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

例如:

enter image description here 这是代码覆盖的结果,正如您可以在右侧看到的那样,有一个信息在测试期间调用这些代码行的次数。在这种情况下 - 0。

但是...

enter image description here 这里是测试中的一个地方,我们可以看到这个函数确实被调用了。多少次?哦......至少一次。这个号码是通过右侧的信息提供的。

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

任何人都能解释一下吗?为什么会这样?

5 个答案:

答案 0 :(得分:28)

IT工作

  1. 由于Apple发布了 @testable 关键字将您的项目导入测试目标,因此您不必再将文件添加到这两个目标:
  2. enter image description here

    1. 因此,只需从测试目标中删除每个文件:
    2. enter image description here

      1. 只要您需要从测试目标访问您的文件,只需使用以下内容导入目标:@testable import MyApp
      2. enter image description here

        1. 对项目中的每个文件执行此操作。
        2. 然后代码覆盖率将正常工作。

          Swift 2 + Xcode 7: Unit Testing Access Made Easy!!!!

          了解详情

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

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

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

答案 1 :(得分:4)

我想我发现了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希望我们测试所有目标。

<强>更新 还有一个提示支持这个理论:

转到报告导航器

report navigator

并点击覆盖率。

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

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

如果两个目标中都有一个文件,则会为两个目标显示此文件的代码范围。并且(至少在我的项目中)一个文件在每个目标中都有不同的蓝线:

目标1中的

覆盖范围:

target 1

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

target 2

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

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

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

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

答案 2 :(得分:2)

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

为了使事情有效,有必要:

  1. 从测试目标中删除所有应用程序源文件
  2. 在您的单元测试来源中放置@testable import <NameOfYourModule>
  3. 重新构建并重新运行测试
  4. 我用我当前的项目对此进行了测试,结果更好。

    原始解决方案配方可在以下网址找到:http://natashatherobot.com/swift-2-xcode-7-unit-testing-access/

    此外,似乎功能有点原始,因此可能存在错误,Apple建议在事情无法正常工作时提交错误报告:

      

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

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

答案 3 :(得分:0)

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

或者Xcode覆盖的内容可能会被破坏,但很难说你是否不详细说明你期望它检查哪种覆盖范围。

答案 4 :(得分:0)

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

手动选择并删除适用于我的文件的测试目标。