iOS单元测试简单介绍

单元测试的特点

  1. 用代码来测试代码
  2. 红灯/绿灯迭代开发
  3. 在日常开发中, 数据大部分来自网络, 很难出现'边界数据', 如果不测试所有条件就上架, APP就容易发生闪退
  4. 自己建立测试用例
  5. 单元测试不是靠NSLog来进行测试的, 是使用'断言'来测试的, 提前设置的条件必须满足才能通过测试

扩展 :

  1. 为什么有些公司讨厌单元测试, 因为'代码覆盖率'不好确认,

提示 :

  1. 不是所有的代码都需要测试
    例如, 私有方法不需要测试! 只有暴露在 .h中的方法需要测试! 面向对象有一个原则: 开闭原则!
  2. 所有跟UI有关的都不需要测试, 也不好测试
    MVVM , 把小的业务逻辑代码封装出来, 变成可以测试的代码
  3. 一般而言, 测试的覆盖率 50%~~70%

具体的步骤 (依测试person类为例)

1 . 创建测试类(依Tests结尾)


屏幕快照 2016-12-10 16.09.35.png

2 . 创建好后你会发现有下面两个方法

/// 一次单元测试开始前的准备工作, 可以设置全局变量
- (void)setUp {
    [super setUp];
    // Put setup code here. This method is called before the invocation of each test method in the class.
}
/// 一次单元测试结束前的销毁工作
- (void)tearDown {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    [super tearDown];
}

3 . 新建测试方法

- (void)testNewPerson {
    //
    NSDictionary *dict = @{@"name":@"zhangsan",@"age":@29};//,@"":@"",@"":@"",@"":@"",
    //
    [self checkPersonWithDict:dict];
}

4 . 新建好方法后, 点击快捷键command+s 保存下代码, 你就会发现方法的左侧出现一个菱形框


WX20161210-162016@2x.png

5 . 点击菱形框就可以测试这条方法了

断言测试用法

// 1.检查名称 XCTAssert是系统的宏 用来做断言 格式为 :\
XCTAssert(条件表达式,当条件表达式不成立时需要提示的字符串);
XCTAssert([name isEqualToString:p.name],@"姓名不一致");
// 1.检查名称
XCTAssert(age == p.age,@"年龄不一致");
WX20161210-163230@2x.png

代码覆盖率

1 .Code Coverage的基本设置图如下,更改Scheme的Test中的勾选项,把 Gather coverage data 勾上,然后就可以Command+U或者指定某个UI自动化用例执行了。另外,在Scheme的编辑中,可以指定Test时需要测试哪些单元测试,具体见图

安抚.png

2 . 如何获得静态包的代码覆盖率?
  接入APP是不能直接访问静态库工程的文件的,因此接入APP的UI测试得不到静态库工程的代码覆盖率,如何解决呢?很简单,虽然静态包不能单独运行UI,但可以在静态库的Scheme-Test中添加接入APP的测试Target,就可以在静态库的project里用看到UI Testing的用例并执行。测试类也可以直接访问到静态库工程中的文件,并得到代码覆盖率结果了。同样,这里也需要勾选上 Gather coverage data, 如上图:

3 .再看我们得到的代码覆盖率结果,鼠标悬浮在蓝条时会有数值,点击箭头能进到文件看方法的执行次数。如图

586675-20160316002328506-1991038720.png

结果是得到了,但每次都要悬浮到蓝条上看数值,以及得不到整体统计,可读性非常差。

4 .如何使代码覆盖率测试结果增强可读性?

测试结果文件的位置,从工程目录的生成app,打开finder,往上找Intermediates文件夹就行了。Coverage.profdata就是我们要找的结果文件。

586675-20160316003956881-572376418.png
586675-20160316004010474-1047409749.png

XCode代码测试结果使用了LLVM Code Coverage Mapping Format, 具体格式介绍参考http://llvm.org/docs/CoverageMappingFormat.html。只要是标准格式,就可以按想要的方式解读。这时llvm-cov上场了,llvm是随Xcode一起安装的,不需要另外安装。如果遇到解析文件报错LLVM版本不对的,可以用Xcode-select --print-path看下生成文件时的Xcode路径和跑用例时用的Xcode是不是一个,如果不是,重新选择。

586675-20160316004351146-376599496.png

解析文件的命令为xxx/llvmoconv report -instr-profile xxx/Coverage.profdata xxx/xx.app/xx,其中report为参数,可以换成show得到各文件结果。xx.app要取与Coverage.profdata同目录的Products文件夹内的。

586675-20160316005358834-2036259847.png

这时,我们可以直观的得到各个文件的代码覆盖率数值信息,这里带入了杂质信息,真机和模拟器均存在。但是,这是无关紧要的。我们APP开发或SDK开发都会习惯添加类前缀,那么通过使用shell脚本筛选我们需要的行,重新计算统计值,就能得到app部分文件或静态库文件的统计结果。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容