ios 单元测试覆盖率怎么查看_iOS单元测试简单介绍

单元测试的特点

用代码来测试代码

红灯/绿灯迭代开发

在日常开发中, 数据大部分来自网络, 很难出现'边界数据', 如果不测试所有条件就上架, 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 保存下代码, 你就会发现方法的左侧出现一个菱形框

[email protected]

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

断言测试用法

// 1.检查名称 XCTAssert是系统的宏 用来做断言 格式为 :\

XCTAssert(条件表达式,当条件表达式不成立时需要提示的字符串);

XCTAssert([name isEqualToString:p.name],@"姓名不一致");

// 1.检查名称

XCTAssert(age == p.age,@"年龄不一致");

[email protected]

代码覆盖率

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部分文件或静态库文件的统计结果。

你可能感兴趣的:(ios,单元测试覆盖率怎么查看)