你好,欢迎进入江苏优软数字科技有限公司官网!

诚信、勤奋、创新、卓越

友好定价、专业客服支持、正版软件一站式服务提供

13262879759

工作日:9:00-22:00

codejock xtreme toolkit iOS单元测试覆盖率实战教程,Xcode Code Coverage工具详解

发布时间:2026-02-01

浏览次数:0

CSDN移动会持续为您精心挑选移动开发的精粹内容,一起探讨移动开发的技术热门话题,这些话题涉及移动应用、开发工具、移动游戏及引擎、智能硬件、物联网等诸多方面。要是您想要投稿、参与内容翻译工作,或者寻求近匠报道,那就发送邮件至@csdn.net。

本文出自:,译文出自:的博客,译者:

iOS9 Day-by-Day是系列博客,由作者Chris Grant所写,其覆盖了iOS开发者必须知晓的,关于iOS 9的新技术与API,并且还开展了实际操作演练,在每篇文章里,相关代码Chris都会把它上传上去,在APIs、UI之后,作者写到了第五篇——Xcode Code。译文如下:

有个叫作Code的工具,能用于计算你的单元测试覆盖率。那高水平的覆盖,会给你的单元测试带去信心,还意味着你的应用是经过彻底测试的。你或许写了几千个单元测试,然而要是覆盖率不高,那你所写的这套测试,其价值可能也没多大的标点符号。

此处不存在一个精准的百分比,要求你定要达到这般的覆盖率,这在极大程度上取决于你的项目,比如说,要是你的项目里存在诸多无法编写单元测试的视觉组件,那么覆盖率相较于单纯处理数据的框架而言,会低得多得多。

Code in Xcode

过去,若你要弄出一份测试的代码覆盖报告来,就得做诸多设置,极为繁杂,且有好多得手动去设置。在iOS 9里,苹果给出了智能的代码覆盖工具,它与LLVM是一体的,每次运行测试时都会被调用并进行计算。

Using the Code Tools

此刻,我们借由一个示例予以呈现,怎样运用全新的代码工具,以及如何提高当下的测试用例。完成之后的代码放置在了上面,你能够照着去做。

第一件事是去创建一个新项目,并且还要确认你选上了Unit tests选项,这会依照要求创建出一个默认项目,现在我们得测试点什么,这个测试有可能是你的任意需求,在这里我添加了一个空的swift文件,在里面写好了一个全局的方法,这个方法用于检测两个字母串是不是仅排序不同的相同字母组成的词,写成全局的方法,或许不是好的设计,不过在这里我们仅仅是演示一下。

这是一种颇显简易的方式 ,因而我们极有可能获取到一种不存在丝毫问题的 ,达致百分百覆盖程度的测试覆盖比率。

func checkWord(word: String, isAnagramOfWord: String) -> Bool {
    // Strip the whitespace and make both of the strings lowercase
    let noWhitespaceOriginalString = word.stringByReplacingOccurrencesOfString(" ", withString: "").lowercaseString
    let noWhitespaceComparisonString = isAnagramOfWord.stringByReplacingOccurrencesOfString(" ", withString: "").lowercaseString
    // If they have different lengths, they are definitely not anagrams
    if noWhitespaceOriginalString.characters.count != noWhitespaceComparisonString.characters.count {
        return false
    }
    // If the strings are the same, they must be anagrams of each other!
    if noWhitespaceOriginalString == noWhitespaceComparisonString {
        return true
    }
    // If they have no content, default to true.
    if noWhitespaceOriginalString.characters.count == 0 {
        return true
    }
    var dict = [Character: Int]
    // Go through every character in the original string.
    for index in 1...noWhitespaceOriginalString.characters.count {
        // Find the index of the character at position i, then store the character.
        let originalWordIndex = advance(noWhitespaceOriginalString.startIndex, index - 1)
        let originalWordCharacter = noWhitespaceOriginalString[originalWordIndex]
        // Do the same as above for the compared word.
        let comparedWordIndex = advance(noWhitespaceComparisonString.startIndex, index - 1)
        let comparedWordCharacter = noWhitespaceComparisonString[comparedWordIndex]
        // Increment the value in the dictionary for the original word character. If it doesn't exist, set it to 0 first.
        dict[originalWordCharacter] = (dict[originalWordCharacter] ?? 0) + 1
        // Do the same for the compared word character, but this time decrement instead of increment.
        dict[comparedWordCharacter] = (dict[comparedWordCharacter] ?? 0) - 1
    }
    // Loop through the entire dictionary. If there's a value that isn't 0, the strings aren't anagrams.
    for key in dict.keys {
        if (dict[key] != 0) {
            return false
        }
    }
    // Everything in the dictionary must have been 0, so the strings are balanced.
    return true
}

一旦你将算法撰写完毕,那就应当去编写一个测试啦。把项目创建之际已然创建好的默认的打开,增添一个如下的简单的测试方法。它呈现出来是这样的形态。

class CodeCoverageTests: XCTestCase {
    func testEqualOneCharacterString {
        XCTAssert(checkWord("1", isAnagramOfWord: "1"))
    }
}

运行测试之前,得先确定code有没有被打开,写代码的时候,默认是关闭状态,所以要编辑一下测试,将其打开。

要确保,“data”处于被选中的状态,之后点击关闭的按钮的,运行相关测试的。并且我们期望,刚刚所创建的测试用例可以顺利通过。

The Tab

要是这个测试通过了,那你便能知晓这个方法,起码存在一条路径是正确的。然而你所不晓得的是,究竟还有多少未被测试到。这便是code这个工具的益处所在。当你开启code tab之后,你能够清晰地看见测试的覆盖情形。其依据找以及file进行了自动分组。

让Xcode左边窗口的面板被打开,将你刚刚运行的测试给选中,接着在tab当中得以选中。

此时会呈现出一个属于你的类以及方法的列表,并且会标明每一个的测试覆盖率。要是你把鼠标悬浮在这个方法之上,你能够瞧见测试的覆盖率为28%。这实在没法接受!我们得去找出,那些代码分支是可被测试执行的codejock xtreme toolkit,那些又是不可被测试执行的,从而对它们加以改进。双击方法的名称codejock xtreme toolkit,Xcode会打开类的代码,并且能看到code的状况。

哪些代码是测试覆盖过的呢,是用白色区域来表示的。而那灰色区域所对应的代码,是测试没办法覆盖到的,针对这种情况,我们得增添更多测试用例,以此来覆盖灰色部分的代码。右手边的那些数字,其作用是表明这些代码块,于此次测试里被执行的次数。

明显地,百分之二十八的覆盖率并非我们所追求的目标。此处不存在用户界面,看上去是个绝佳的编写测试用例的候选对象。缘此,我们增添了一个测试用例。在理想状况下,我们期望每个分支都能够被测试到。如此一来便能够达成完整的覆盖。把以下的测试用例添加至你的测试类当中。

func testDifferentLengthStrings {
    XCTAssertFalse(checkWord("a", isAnagramOfWord: "bb"))
}
func testEmptyStrings {
    XCTAssert(checkWord("", isAnagramOfWord: ""))
}
func testLongAnagram {
    XCTAssert(checkWord("chris grant", isAnagramOfWord: "char string"))
}
func testLongInvalidAnagramWithEqualLengths {
    XCTAssertFalse(checkWord("apple", isAnagramOfWord: "tests"))
}

这些用于测试的用例应当是可以做到将我们所编写的代码完完全全覆盖掉的。去运行一回单元,随后把最后那一个测试报告给打开。

我们达成成功状态呈现出百分百覆盖率,你能够目睹整个代码均转变为白色,右面所显示的数字也表明每个代码段至少都有过一次执行情况。

采用code确为超棒方式,助你构建真正富价值测试组合。远比所写诸多测试用例,却未真切测试代码要好。Xcode 7令此途径变得极为简便,我举荐你于项目中开启Code。即便你已撰就测试,它照样能帮你明晰测试究竟状况如何。

如有侵权请联系删除!

13262879759

微信二维码