一、常规的稳定性测试          



测试背景:



这是一个海外的合作项目,被测程序是Android应用(App)。测试希望通过Monkey来模拟用户长时间的随机操作,检查被测应用是否会出现异常(应用崩溃或者无响应)。



测试脚本:



adb shell monkey -p com.xxx.xxx --pct-touch 40 --pct-motion 25 --pct-appswitch



10 --pct-rotation 5 -s 12358 --throttle 400 --ignore-crashes --ignore-timeouts


-v 500000



显而易见,这个Monkey测试的命令相比上一节提到的要复杂得多,主要是对一些操作事件做了限制,从而减少了Monkey伪随机化的无效操作。这体现在以下几个方面。



1)使用-p参数来制定测试应用的包名(Package)



因为被测程序是一个特定的Android应用程序,需要指定被测程序的包名。指定包名后,Monkey会根据包名找到对应的应用,并启动其main activity,然后执行Monkey测试。



技巧



查找应用包名的方法有很多,这里简单列举几个常用方法:



(1)通过pm命令查看。



在命令行窗口输入:



>adb shell



>pm list package



此时将列出手机上所有的应用包名,在列表中找到要测试的应用包名即可。



(2)通过查看APK源码下的AndroidManifest.xml文件。



(3)通过aapt命令查看。



(4)通过adb logcat抓取当前Android机运行的App的包名。



2)使用--pct-xxx参数限制Monkey执行的事件类型和占比



前面已经说了,这个测试的目的是希望模拟用户操作,因此需要让Monkey执行的事件尽可能地接近用户的常规操作,这样才可以最大限度地发现用户使用过程中可能出现的问题。因此需要对Monkey执行的事件百分比做一些调整。



触摸事件和手势事件是用户最常见的操作,所以通过--pct-touch和--pct-motion将这两个事件的占比调整到40%与25%;目标应用包含了多个Activity,为了能覆盖大部分的Activity,所以通过--pct-appswitch将Activity切换的事件占比调整到10%;被测应用之前在测试中出现过不少横竖屏之间切换的问题,这个场景也必须关注,因此通过--pct-rotation把横竖屏切换事件调整到10%。



3)使用-s参数来指定命令执行的seed值



Monkey会根据seed值来生成对应事件流,同一个seed生成的事件流是完全相同的。这里指定了seed值,是为了测试发现问题时,便于进行问题复现。



4)使用--throttle参数来控制Monkey每个操作之间的时间间隔



指定操作之间的时间间隔,一方面是希望能更接近用户的操作场景,正常用户操作都会有一定的时间间隔;另一方面也是不希望因为过于频繁的操作而导致系统崩溃,尤其是在比较低端的手机上执行测试时。因此通过--throttle设置Monkey每个操作固定延迟0.4秒。



5)使用--ignore-crash和--ignore-timeouts参数使Monkey遇到意外时能继续执行



在执行Monkey测试时,会因为应用的崩溃或没有响应而意外终止,所以需要在命令中增加限制参数--ignore-crash和--ignore-timeouts,让Monkey在遇到崩溃或没有响应的时候,能在日志中记录相关信息,并继续执行后续的测试。



6)使用-v指定log的详细级别



Monkey的日志输出有3个级别:默认的是level 0, -v -v日志级别为level 1, -v -v日志级别为level 2。日志的级别越高,其详细程度也越高。为了方便问题的定位,将日志级别设置为level2。



在常规的稳定性测试中,虽然可以自定义各种事件的操作占比,但毕竟是随机事件流。在实际测试过程中,难免会遇到Monkey点了我们不希望它点击的地方,比如误点了工具栏导致网络断开的情况等。当测试过程中Wi-Fi断开时,是否有可能自动重连呢?这在后面会讲到



二、自定义脚本的稳定性测试                          



常规Monkey测试执行的是随机的事件流,但如果只是想让Monkey测试某个特定场景(执行固定的事件流)呢?这时候就需要用到自定义脚本了,Monkey支持执行用户自定义脚本的测试,用户只需要按照Monkey脚本的规范编写好脚本,存放到手机上,启动Monkey通过-f scriptfile参数调用脚本即可。



Monkey自定义脚本的编写模板如代码清单4-1所示。



代码清单4-1 Monkey自定义脚本的编写模板



#头文件,控制Monkey发送消息的参数,固定写即可



#脚本类型,一般不用更改



type=raw events



#脚本执行次数,但是由于Monkey命令本身可以指定执行次数,所以这里的设置是不生效的



count=10



#命令执行速率,速率也可以通过Monkey命令设置,这里的设置是不生效的



speed=1.0



#以下为Monkey命令



start data>>



LaunchActivity(pkg_name, cl_name)



DispatchPress(KEYCODE_HOME)





 



monkey脚本常见API




python 做monkey测试 如何做monkey测试_自定义


 


技巧


Monkey脚本只能通过坐标的方式来定位点击和移动事件的屏幕位置,这里就需要提前获取坐标信息。获取坐标信息的方法很多,最简单的方法就是打开手机中的开发人员选项,打开“显示指针位置”。随后,在屏幕上的每次操作,在导航栏上都会显示坐标信息


 


下面来看一个简单的例子:


这里要测试的是应用宝App,测试的操作是打开应用宝,点击输入框,输入“yyb”,点击搜索。搜索完成后,点击返回键返回应用宝首页。


首先,将在本地编写需要的测试脚本命名为monkey.script(文件格式无要求),脚本内容如代码清单4-2所示。


代码清单4-2 Monkey自定义脚本实现进入应用宝进行搜索


#启动测试 
  
   

    type = user 
  
   

    count = 49 
  
   

    speed = 1.0 
  
   

    start data >> 
  
   

    #启动应用宝 
  
   

    LaunchActivity(com.tencent.android.qqdownloader, com.tencent.assistant.activity. 
  
   

    SplashActivity) 
  
   

    UserWait(2000) 
  
   

    #点击搜索框 
  
   

    Tap(463,150,1000) 
  
   

    UserWait(2000) 
  
   

    #输入字母“yyb” 
  
   

    DispatchString(yyb) 
  
   

    UserWait(2000) 
  
   

    #点击搜索 
  
   

    Tap(960,150,1000) 
  
   

    UserWait(2000) 
  
   

    #点击返回键返回首页 
  
   

    DispatchPress(KEYCODE_BACK) 
  
   

    其次,将文件push到手机或模拟器的sdcard中: 
  
   

    >adb push monkey.script /sdcard/ 
  
   

    最后,执行脚本: 
  
   

    >adb shell monkey -f /sdcard/monkey.script -v 1 
  
   

      
  
   

    如果需要重复执行某个脚本,只要在monkey启动命令中修改执行次数即可。例如 
  
   

    >adb shell monkey -f /sdcard/monkey.script -v 10


三、结合辅助命令,获取更多信息                        


常规测试只要记录下Monkey日志,再分析Monkey日志检查是否有异常即可。但是,很多时候,测试除了想知道执行过程是否有异常,还需要能获取执行过程中的一些详细信息或性能数据,比如想知道Monkey执行过程中是否存在内存泄漏,需要获取内存信息。这时候就需要借助一些辅助的命令来获取更多信息了。下面列举了几种Monkey测试中常用的辅助命令,使用方法也非常简单,只要在执行Monkey的同时,另起一个CMD命令行窗口输入对应命令执行即可。


❑ 获取logcat日志信息: 
  
   

    adb shell logcat -v time>log.txt 
  
   

    ❑ 获取内存信息: 
  
   

    adb shell dumpsys meminfo <进程名> 
  
   

    ❑ 获取CPU消耗信息: 
  
   

    adb shell top -n 1 |find“进程名” 
  
   

    ❑ 获取电量信息: 
  
   

    adb shell dumpsys battery 
  
   

    ❑ 获取GPU信息: 
  
   

    GPU信息命令:adb shell dumpsys gfxinfo <进程名> 
  
   

    ❑ 获取流量信息: 
  
   

    adb shell cat/proc/uid_stat/<被测应用的uid>/tcp_rcv 
  
   

    技巧 
  
   

    如何获取被测应用的UID 
  
   

    步骤1:查看被测应用的进程ID(PID) 
  
   

    adb shell ps | grep <被测应用包名> 
  
   

    步骤2:查看被测应用的用户ID(UID) 
  
   

    adb shell cat /proc/$pid/status


四、Monkey测试策略制定思路             


前面介绍了几种常见的Monkey测试方法,但在实际项目中,选择哪种Monkey测试策略,则需要根据实际项目的情况来做判断。主要是看测试目的及被测应用自身的特点。假如我们想测试浏览器的双指缩放功能是否有异常,那就需要选择--pct-pinchzoom参数,调大双指缩放事件的占比进行Monkey测试;假如我们想验证ROM的横竖屏切换功能是否正常,那就需要选择--pct-rotation参数,调大横竖屏切换事件的占比进行Monkey测试;假如我们想验证重复某种特定操作时,应用是否会存在异常,那可以选择-f参数,自定义Monkey脚本进行验证;假如我们想验证长时间操作时应用是否会存在内存泄漏,那就需要结合-hprof参数和dumpsys meminfo <进程名>进行Monkey测试。


总之,Monkey测试策略是需要依据测试目的和被测程序的特点来制定的。