背景
之前在做Android端测试的时候,学习了如何使用EMMA工具统计Android端的手工测试覆盖率。受到这个启发,目前在进行AR项目iOS端的测试时,也希望实现iOS端的手工测试覆盖率统计。四处询问了一些同学,暂未发现iOS端的手工测试在周围有落地的实践,于是自己抽时间找了些资料,并进行了实践,把自己的一些收获总结下,希望能和大家一起分享和讨论。
在进行iOS移动端手工测试时,测试覆盖率能够帮助我们发现一些风险和冗余。本文介绍了如何利用Xcode在真机和模拟器上开展iOS的手工测试覆盖率工作。在阐述了原理之后,详细地介绍了操作的方法和步骤,包括设置Xcode编译参数、设定生成文件目录、找到所需文件、生成报告等;进一步给出了一种改进的办法,避免了进入后台软件自动退出的缺点;最后总结了该方法的优点,以及下一步可能要开展的工作。
一 原理和意义
为什么要展开覆盖率测试?
1. 冗余文件、冗余代码的分析。 项目经过日积月累,很有可能产生一些冗余的文件,比如替换了某种解决方案后,原方案的文件并未完全删除。冗余代码也是有可能发生的,比如工程中开发自己写的测试代码、修复bug时未将一些代码删除、拷贝的代码有些分支不会走到等。通过查看覆盖率报告,能够帮助分析以上出现的一些问题。尤其是很多类完全没有覆盖时,可能要与开发协商进行处理。
2. 测试用例未覆盖的代码。 我们知道,测试覆盖到的代码不一定是正确的,但是至少经过了一轮成功的检验,并且没有发现问题。但未覆盖到的代码就像是颗地雷,或许连一次成功的检验都不能通过,但却由于我们没有覆盖到,导致被遗漏。从这方面说,可以利用覆盖率的报告,设计一些针对性的用例,但这属于比较高级的做法,需要对代码的逻辑十分清楚。
原理是什么?
如同Android的EMMA工具,统计iOS端手工测试覆盖率的原理也是程序插桩。Xcode自带了覆盖率编译选项,通过修改编译的参数,就能通过插桩的方式收集覆盖率文件。iOS会为每个类生成两个不同后缀的文件,这两类文件必不可少。
- gcda文件:包含覆盖率信息。会生成在真机的沙盒中,需要我们设置生成的目录。gcda文件一般是追加写入的,所以多次测试的覆盖率信息会累加起来。
- gcno文件:包含代码的结构信息。在Xcode编译项目时生成,为了防止出现问题,需要先clean已经编译的结果,重新编译,然后去指定的地方拷贝gcno文件。
什么是插桩?
这里复制一段好友文章里的话:“程序插桩,它是在保证被测程序原有逻辑完整性的基础上在程序中插入一些探针,通过探针的执行并抛出程序运行的特征数据,通过对这些数据的分析,可以获得程序的控制流和数据流信息,进而得到逻辑覆盖等动态信息,从而实现测试目的的方法。”
二 方法步骤
思路
1、Xcode中设置编译参数,代码中设置写入gcda文件的目录。
2、clean后进行运行,安装到手机上;电脑上找到gcno文件;执行手工测试。
3、手机上拷贝出gcda文件,与gcno文件一起,使用LCOV工具生成覆盖率报告。
步骤(与思路对应):
1、设置Xcode编译参数
我所使用的是7.3版本的Xcode。
位置 | 选项 | 值 | 备注 |
---|---|---|---|
Build Setting | Instrument Program Flow | YES | |
Build Setting | Generate Legacy Test Coverage File | YES |