2.4.2稳定性测试思路
测试思路是整个测试的核心部分。通过做随机测试,我们有两种思路,一个是获取当前页面的所有控件,随机对某一个控件进行某一个操作;另一种是随机某一个像素点,在屏幕上点击该点。不管是哪一种思路,我们的出发点都是让测试尽可能高效、覆盖面尽可能广。
先来看看控件部分,随机对某一个控件进行某一个操作,测试会比较随机。同时,因为操作都集中在部分可获取、可操作的控件上,所以大部的操作都是有效的。case的大体设计思路如图4-7所示。
图4-1 稳定性测试思路
再看看基于像素点的设计思路。首先必须保证测试有随机性。但是实践证明纯随机的操作,测试效率太低,覆盖面太小,能发现的问题太少。项目初期能发现一些明显的问题,但很快就很难发现问题了。所以,随机胡乱点击的这种测试不可取,但我们可以对其改进。我们的思路是在随机测试的基础上,加入一些非随机的测试,以有效得提高测试效率。所谓的非随机,是和随机相对的,主要的思想有以下几条:
1)特殊坐标点处理:像工具栏中一些常用的按钮、弹出框经常出现位置,都可以先计算出来,在一定概率下直接点击这些位置。这样的点应该不会太多,对于每一个应用都可以花很短的时间去计算出来,但是效果却是非常明显的。
2)将常用操作封装成一个接口,有序得执行:因为很多功能都需要数次的点击或其他操作才能触发,比如删除一个书签,就得先打开书签管理器,然后点击编辑,点击某一个书签,最后点删除这样的操作,用随机的方法不可能连接得执行这一连串的事件。其实像这样需要两次操作以上才能完成的,用随机的方法都太难被覆盖到。所以为了覆盖到这样功能,都会把他的操作路径封装成一个接口,顺序执行,中间不加其他的随机操作。这样的随机就可以覆盖绝大部分的功能。当然,封装接口时,每一个操作可以是绝对坐标点的操作,即计算出第一个操作涉及的坐标点,逐个操作;也可以是模糊的区域操作,即执行某一个操作过后,下一步的操作限定在某一个区域内,有效提高测试效率和覆盖率。
3)提高常用区域的点击率,降低不常用区域的点击率:每一个应用,都会有最常被使用的功能,和边沿性的功能。我们的思路是应该根据应用的特点来提高某些操作的概率,提高某些区域的点击率,以达到提高测试效率的目的。
4)随机地执行1、2点中的动作或者全屏随机操作:即像素点都找好后,想要的操作都封闭好后,再随机执行这些操作,中间或夹杂着全屏纯随机的操作,或是一小段一小段有序的操作。
执行测试设计时,一般会把这两个方式放在一起,这样测试的覆盖面会更大些。
上面提到过,我们的衡量方式是一段时间内程序出现闪退的次数,那一般来说,这段时间越长,这个测试结果才越有说服力,半小时或1小时的测试结果,完全没有意义。这样就要求我们,测试必须要长时间执行,程序出现Crash时也要能拉起来继续执行测试。
说到执行测试,因为我们已经把测试代码和测试框架都集成到被测试软件中了,所以只要启动被测试程序,就开始执行测试了。
我们的思路是从进程入手,在确保进程名唯一的情况下,对被测试程序的进程进行监控,如果发现进程结束了,重新用脚本调起被测试程序,继续执行测试。
while :
do
pid=`psaux|grep $App_binary|grep -v grep |tr -s "” |cut -d '' -f 2`
if[ -z "$pid" ]; then
OpenApp ${App_ID}
waitforAppStart
else
sleep 2
done
其中,open是iOS平台启动应用程序的命令行工具,后面的参数是应用的Bundle ID(用来唯一标识一个应用的ID),需要越狱的机器才能使用。
这边举一个简单的例子,以KIF为框架,用例是浏览器里面随机测试设置的功能。测试的设计思路如上面所描述,这个也是稳定性测试的核心思想。关于基于KIF的工程如何配置,如入上手如用,请见《iOS自动测试入门》一章。示例代码如下:
- (void)closeWindows { //关闭一个窗口 CGPoint pointMultiWindows = CGPointMake(225, 980); [tester tapScreenAtPoint:pointMultiWindows]; CGPoint pointclose = CGPointMake(275, 180); [tester tapScreenAtPoint:pointclose]; } - (void)randomtap { //全屏随机点击 CGPoint point; for (int i = 10; i > 0; i--) { point.x = arc4random() % 640; point.y = arc4random() % 1120; [tester tapScreenAtPoint:point]; } } - (void)returnback { [tester tapViewWithAccessibilityLabel:@"返回"]; } - (void)settings_testcase { //进入页面设置 CGPoint point = CGPointMake(320, 980); [tester tapScreenAtPoint:point]; //随机进入一个设置项 point.y = arc4random() % 900; [tester tapScreenAtPoint:point]; [self randomtap]; [self returnback]; [self closeWindows]; } - (void)other_testcase { //其他的用例 } - (void)testMonkey { if (arc4random() %4 == 1) {//用于控制下面这个用例执行的概率 [self settings_testcase]; } if (arc4random() % 10 ==1){ [self other_testcase]; } } |
本文选自《腾讯iOS测试实践》第四章,本站经机械工业出版社和作者的授权。
版权声明:51Testing软件测试网获机械工业出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。