XCTest 单元测试初探

在作 iOS 端的单元测试时,XCode 自身集成的 XCTest 框架是一个不错的选择。网络上关于 XCTest 单元测试的文章不胜枚举,这里主要结合实例和 WWDC2018 的新增特性进行总结和梳理。git

本文只针对 iOS 单元测试,UI自动化测试会在之后的博文中陆续展开,下面直接从 Demo 入手。github

在建立好工程后(勾选上"Include Unit Tests"),会在 XCTests.m 中发现一些共同的方法:web

- (void)setUp {}                   // 将要执行测试代码时调用
- (void)tearDown {}                // 测试代码执行完后调用,测试失败不调用
- (void)testExample {}             // 单元测试用例执行主体
- (void)testPerformanceExample {}  // 性能测试用例执行主体

值得注意的是,单元测试类类名都以 Tests 结尾,同一类中的全部测试方法都以 -(void)test 开头。算法

在控制器 ViewController.m 中定义了字符串的 md5 加密算法,代码以下所示。如今要测试该方法的正确性,则须要依照如下步骤:网络

(1)前置条件构建(包括形参构建以及部分属性初始化等操做);
(2)在 - (void)testExample {} 方法中调用待测试方法(此处即为 string2md5 方法);
(3)使用 XCTAssert 断言检验方法正确性。框架

- (NSString *)string2md5:(NSString *)inputString {
    
    const char *cStr = [inputString UTF8String];
    unsigned char result[16];
    CC_MD5(cStr, (CC_LONG)strlen(cStr), result);
    return [NSString stringWithFormat:
           @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
            result[0], result[1], result[2], result[3],
            result[4], result[5], result[6], result[7],
            result[8], result[9], result[10], result[11],
            result[12], result[13], result[14], result[15]
            ];
}

单元测试用例方法详情及程序执行结果以下图所示,能够看出,经过 XCTAssert 断言肯定了 md5 算法执行结果在字符串长度方面的有效性,单元测试代码执行完毕后也成功调用了 - (void)tearDown {} 方法。
在这里插入图片描述
一样地,在控制器 ViewController.m 中定义了累加函数,代码以下所示。可在 XCTests.m 中实现性能测试方法方法执行性能进行评估,具体性能参数在此不赘述。svg

- (void)performanceExample:(NSInteger)number {
    NSInteger index = 0;
    for (NSInteger i = 0; i <= number; i ++) {
        index += i;
    }
}

在这里插入图片描述
为便于理解并造成完整的工程化概念,此处给出完整的示例代码工程连接:XCTest-Demo函数

在 WWDC2018 中,苹果在 iOS 单元测试方面作了一些细节方面的优化和改变,此处对其中三点进行简要总结:工具

(1)Code Coverage:在 WWDC2018 中,苹果重写了 Code Coverage (代码覆盖率)功能,优化了其性能和准确率,苹果内部的一项大型项目的数据显示,代码覆盖率功能性能提高了95%,且代码覆盖文件的大小也下降到了较低的水平,同时准确度也比之前有了不小的提高。而且,还推出了一个全新的命令行工具 xccov,关于该工具的使用等细节会在以后的博文中详细介绍;性能

(2)部分用例测试:在 Xcode10 中,能够选择 scheme 是否自动包含新添加的测试用例,以下图所示,避免每次都执行没必要要的测试,达到只执行部分测试的效果;
在这里插入图片描述
(3)指定测试顺序:Xcode10 之前,测试顺序默认是按照用例函数名称进行排序的,这种排序形式的弊端是对于一些具备特定顺序依赖的测试用例而言,可能会致使测试失败。为此,在写测试用例时,应保持测试的独立性,不在不一样测试间共享状态,Xcode10 提供了随机测试顺序模式以防止这种潜在的依赖关系,以下图所示:
在这里插入图片描述