转载请注明出处!
索引
- Monkey的介绍
- Monkey基本使用
- Monkey命令参考
- Monkey测试信息截取
- CRASH
- ANR
- MonkeyScript
- 脚本格式
- 常用API
- 简单案例
- Monkey案例实践
Monkey是一个命令行工具,可以运行在模拟器里或实际设备中,使用安卓调试桥(adb)来运行它,向系统发送伪随机的用户事件流,实现对正在开发的应用程序进行压力测试,可以根据获取的log信息进行修复。
- 连接设备:adb devices 查看设备是否连接成功
- adb shell 进入shell界面
- 设备安装要运行的程序包或apk(或者通过查看data/data下的程序包):adb安装apk:在所安装的apk路径下,使用adb install **.apk
- 执行monkey测试命令:monkey -p your.package.name -v 500
在不知道所安装的apk的包名的时候,采用adb命令查看包名:
- adb logcat|grep START
- 打开已安装的apk,查看出现的ActivityManager信息,cmp=name,此name就是打开的apk的包名。
-help 列出简单用法
-v 作用:命令行上的每一个-v都将增加反馈信息的详细级别。
Level0(默认),除了启动、测试完成和最终结果外只提供较少的信息。
Level1,提供了较为详细的测试信息,如逐个发送到Activity的事件信息。
Level2,提供了更多的设置信息,如测试中选中或未选中的Activity信息。
例:
adb shell monkey -v 10
adb shell monkey -v -v 10
adb shell monkey -v -v -v 10
-s
作用:伪随机数生成器的seed值。如果用相同的seed值再次运行monkey,将生成相同的事件序列。
例: adb shell monkey -s 12345 -v 10
--throttle
作用:在事件之间插入固定的时间(毫秒)延迟,你可以使用这个设置来减缓Monkey的运行速度,如果你不指定这个参数,则事件之间将没有延迟,事件将以最快的速度生成。
例: adb shell monkey –throttle 300 -v 10
注:常用参数,一般设置为300毫秒,原因是实际用户操作的最快300毫秒左右一个动作事件,所以此处一般设置为300毫秒。
-p
作用:如果你指定一个或多个包,Monkey将只允许访问这些包中的Activity。如果你的应用程序需要访问这些包(如选择联系人)以外的Activity,你需要指定这些包。如果你不指定任何包,Monkey将允许系统启动所有包的Activity。指定多个包,使用多个-p,一个-p后面接一个包名。
例: adb shell monkey -p com.android.browser -v 10
-c
作用:如果你指定一个或多个类别,Monkey将只允许系统启动这些指定类别中列出的Activity。如果你不指定任何类别,Monkey将选择谢列类别中列出的Activity,Intent.CATEGORY_LAUNCHER和Intent.CATEGORY_MONKEY。指定多个类别使用多个-c,每个-c指定一个类别。
例: adb shell monkey -p com.paipai.ershou -v 10 -c
--pct-touch
作用:调整触摸事件的百分比。(触摸事件是指在屏幕中的一个down-up事件,即在屏幕某处按下并抬起的操作)
例: adb shell monkey –pct-touch 100 -v 10
注:常用参数,此参数设置要适应当前被测应用程序的操作,比如一个应用80%的操作都是触摸,那就可以将此参数的百分比设置成相应较高的百分比。
--pct-motion
作用:调整motion事件百分比。(motion事件是由屏幕上某处一个down事件、一系列伪随机的移动事件和一个up事件组成)
例: adb shell monkey –pct-motion 100 -v 10
注:常用参数,需注意的是移动事件是直线滑动,下面的trackball移动包含曲线移动。
--ignore-crashes
作用:通常,应用发生崩溃或异常时Monkey会停止运行。如果设置此项,Monkey将继续发送事件给系统,直到事件计数完成。
--ignore-timeouts
作用:事件请求超时会影响monkey的测试。如果设置此项,Monkey将继续发送事件给系统,直到事件计数完成。
保存测试日志其实很简单,命令如下:
adb shell monkey -p com.ihongqiqu -v -v -v 500 > monkeytest.txt
在Monkey测试过程中可能会出现程序崩溃(CRASH)和程序无响应的情况(ANR),要将测试的log信息获取到,从而解决bug。
CRASH即崩溃信息,程序在运行中非正常退出。 不设置忽略crashes,在测试过程中出现CRASH,会中断测试,并显示CRASH信息和seed信息
根据seed值来完成bug的复现:adb shell monkey -p com.feicuiedu.monkeytestdemo -s 1476474162566 -v 1000
Applicaton Not Responsing.
同样在monkey测试过程中,如果出现ANR现象,会输出相应的信息,以ANR开头,获取到信息进行问题的解决,同样可以通过seed来进行复现。
附:如果在手动测试过程中出现ANR,日志信息出现在手机中:
- adb shell
- cd /data/anr 切换到设备路径下
- ls 可以看到traces.txt 里面即为log信息
MonkeyScript是monkey的脚本语言,是一组可以被Monkey识别的命令集合,可以帮我们完成一系列的被固定的重复性操作,Monkey通过脚本来进行测试,简单快捷、不需要任何工具,只是一个记事本文件,缺点是在坐标、按键等方面没有逻辑性。
#头文件、控制monkey发送消息的参数
type=raw events
count=10
speed=1.0
#以下为monkey命令
start data >>
DispatchPress (KEYCODE_HOME)
DispatchPress (KEYCODE_MENU)
常用API的介绍,其中keycode
参考keycode列表
LaunchActivity(pkg_name, cl_name): 启动应用的Activity。参数:包名和启动的Activity。
Tap(x, y, tapDuration): 模拟一次手指单击事件。参数:x,y为控件坐标,tapDuration为点击的持续时间,此参数可省略。
DispatchPress(keyName): 按键。参数: keycode
RotateScreen(rotationDegree, persist): 旋转屏幕。 参数:rotationDegree为旋转角度, e.g. 1代表90度;persist表示旋转之后是否固定,0表示旋转后恢复,非0则表示固定不变。
DispatchFlip(true/false): 打开或者关闭软键盘。
LongPress(): 长按2秒。
PressAndHold(x, y, pressDuration): 模拟长按事件。
DispatchString(input): 输入字符串。
Drag(xStart, yStart, xEnd, yEnd, stepCount): 用于模拟一个拖拽操作。
PinchZoom(x1Start, y1Start, x1End, y1End, x2Start, y2Start, x2End, y2End, stepCount): 模拟缩放手势。
UserWait(sleepTime): 休眠一段时间
DeviceWakeUp(): 唤醒屏幕。
PowerLog(power_log_type, test_case_status): 模拟电池电量信息。
WriteLog(): 将电池信息写入sd卡。
RunCmd(cmd): 运行shell命令。
DispatchPointer(downtime,eventTime,action,x,yxpressure,size,metastate,xPrecision,yPrecision,device,edgeFlags):向指定位置,发送单个手势。
DispatchPointer(downtime,eventTime,action,x,yxpressure,size,metastate,xPrecision,yPrecision,device,edgeFilags):发送按键消息。
LaunchInstrumentation(test_name,runner_name): 运行一个instrumentation测试用例。
DispatchTrackball: 模拟发送轨迹球事件。
ProfileWait: 等待5秒。
StartCaptureFramerate(): 获取帧率。
EndCaptureFramerate(input): 结束获取帧率。
API方法中控件位置(X,Y轴的坐标)的获取:使用Android提供的工具uiautomatorviewer.bat
在Android SDK路径下--> tools --> uiautomatorviewer.bat,打开就可以展示设备/模拟器上展示的视图,展示视图结构和坐标。
#头文件、控制monkey发送消息的参数
type=raw events
count=10
speed=1.0
#以下为脚本正文
start data >>
#1.打开浏览器
LaunchActivity(com.android.browser,com.android.browser.BrowserActivity)
ProfileWait()
#2.清空网址
Tap(223,146)
ProfileWait()
DispatchPress(112)
ProfileWait()
#3.输入网址
DispatchString(www.baidu.com)
ProfileWait()
#4.确认,载入网址
DispatchPress(KEYCODE_ENTER)
ProfileWait()
#5.完成退出浏览器
DispatchPress(KEYCODE_HOME)
ProfileWait()
1.脚本完成后将.txt 文件push到手机中
adb push name.txt path
其中name是指monkey脚本文件的名称,path是要push到手机上的路径
2.运行Monkey脚本
monkey -f path/name.txt -v 500
path是push的路径,name是脚本文件的名称。
随机事件流对MonketTestDemo进行测试:
1. adb devices 查看设备是否连接
2. adb shell 进入shell界面
3. monkey -p com.feicuiedu.monkeytestdemo -v 500 执行monkey命令
4. (可选)monkey -p com.feicuiedu.monkeytestdemo -v 500 > monkeytest.txt 执行monkey命令,并将monkey日志存储
一次随机的自动化Monkey测试完成。
MonkeyScript对MonkeyTestDemo进行测试:
1. 完成monkey.txt脚本的编写,保存到某一路径下
2. 切换到monkey.txt路径下
3. adb push monkey.txt /data/local/temp/(设备的任一路径,无确切规定)
4. adb shell 切换到设备下
5. cd /data/local/temp 切换到monkey.txt路径下
6. monkey -f monkey.txt -v 10 执行monkey脚本及执行次数
一次MonkeyScript的自动化Monkey测试完成。