单元测试的特点
用代码来测试代码
红灯/绿灯迭代开发
在日常开发中, 数据大部分来自网络, 很难出现'边界数据', 如果不测试所有条件就上架, APP就容易发生闪退
自己建立测试用例
单元测试不是靠NSLog来进行测试的, 是使用'断言'来测试的, 提前设置的条件必须满足才能通过测试
扩展 :
为什么有些公司讨厌单元测试, 因为'代码覆盖率'不好确认,
提示 :
不是所有的代码都需要测试
例如, 私有方法不需要测试! 只有暴露在 .h中的方法需要测试! 面向对象有一个原则: 开闭原则!
所有跟UI有关的都不需要测试, 也不好测试
MVVM , 把小的业务逻辑代码封装出来, 变成可以测试的代码
一般而言, 测试的覆盖率 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 保存下代码, 你就会发现方法的左侧出现一个菱形框
5 . 点击菱形框就可以测试这条方法了
断言测试用法
// 1.检查名称 XCTAssert是系统的宏 用来做断言 格式为 :\
XCTAssert(条件表达式,当条件表达式不成立时需要提示的字符串);
XCTAssert([name isEqualToString:p.name],@"姓名不一致");
// 1.检查名称
XCTAssert(age == p.age,@"年龄不一致");
代码覆盖率
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部分文件或静态库文件的统计结果。