for循环

时间:2018-05-07 17:44:27

标签: swift xcode unit-testing code-coverage

你好伙伴们,

我正在研究一个Swift类,它的初始化程序包含一个for循环,它根据init的参数运行一定次数。不幸的是,我无法向您显示确切的代码,但它与此类似:

init(numberOfTimes: Int) {
    ...
    for index in 0..<numberOfTimes {
        // do some stuff here
        // shows 0 coverage
    }
    ...
}

我为这个初始化程序进行了几次单元测试,运行0到5次的for循环。测试通过,但代码覆盖总是将循环的内部标记为未覆盖,即使它清楚地运行 - 我可以在循环内断点并且循环中调用的每个函数都显示为覆盖。

此外,如果我提取for循环的内容,代码 显示为覆盖,并且该类的整体代码覆盖率增加了近20%:

init(numberOfTimes: Int) {
    ...
    for index in 0..<numberOfTimes {
        doOne(index)
        // this part still shows 0 coverage
    }
    ...
}

private func doOne(_ index: Int) {
    // do same things here
    // shows correct coverage
}

为什么会这样?我是否在for循环中没有满足代码覆盖的正确标准?

1 个答案:

答案 0 :(得分:2)

我相信这可能是你所说的错误:

https://bugs.swift.org/browse/SR-7446

  

自升级到Xcode 9.3 / Swift 4.1以来,我注意到代码覆盖率   在我的几个项目中,百分比下降了。

     

当我在一个内部使用条件代码时,似乎会发生这个错误   初始化...

修复了:

https://github.com/apple/swift/pull/15966

  

使用指定构造函数进行性能分析的这种方案有点脆弱。这个问题的一个具体问题是swift最终试图为名义类型的不同构造函数创建不同的SILProfiler,并且我们想要覆盖的存储属性初始值设定项可能不会在指定的构造函数中发出。

     

一个更简单的想法是将名义类型的地图存储到SILProfilers,   然后为所有人创建一个合并的探查器实例   名义类型的构造函数。