搭建环境:
Android SDK环境:下载Android SDK,下载完成后,添加路径到Path。(步骤简单不会的自行百度)
下面是Android SDK下载地址:Android SDK下载地址。
Python环境:下载Python下载完成后一路next安装上就行了。
下面是Python下载地址:Python下载地址
配置好环境之后连接手机或者模拟器(注意要在连接电脑之前把usb调试打开),然后在cmd命令行输入adb devices会出现一行手机唯一标志名。代表手机和电脑已经建立了软连接。
安装一个被测软件:
(命令行输入)adb install App文件名.apk
卸载一个软件:
(命令行输入)adb.uninstall 包名
发送各种测试指令:
adb shell monkey 1000
adb shell +工具名称+完成1000次指令(随机) 一些提示信息: activityResuming (com.******) 代表这个程序从前台调入到后台再从后台回调到前台这个过程。 Events injected:1000 这个提示信息就代表完成了一千次操作,如果小于1000的话代表有错误,未执行1000次。 (命令行输入)adb shell pm list package -f (获取手机内所有程序的包名,包括系统程序)
(命令行输入)adb shell dumpsys window w | findstr \/ | findstr name= (获取正在打开的程序的包名)注意空格要加齐了,没空格的地方不要乱加。
输出的东西是:包名/Activity名。
adb shell monkey -p 包名 -v -v -v 1000 (-v 代表输出信息级别,1000代表次数)
adb shell monkey -p 包名 --throttle 500 -v -v -v 100 (延迟500毫秒执行一次,共执行100次)
adb shell monkey -p 包名 --throttle 500 -v -v -v 100 > D:/monkey_log.txt (延迟500毫秒执行一次,共执行100次 ,并且记录下日志结果打印到D盘下)
然后我们看一下打印出来的结果。
首先我们能看到日志文件确实存在了。然后我们打开看一下。
这上边的提示是:
测试的seed值(因为是随机事件100次,所以seed值是随机的),这个seed值就是说如果我们此次测试出现问题下次用这个seed值就能复现。
count:测试各种事件总共的次数。
Include Category:测试包含的类别。
这个就是说测试了100次,sending rotation degree 未发现错误,下边的那些也是一样。
顺便说一下他主要测试的一些点。
我们知道seed是测试编号,下边的0-11就是这次测试都进行了什么事件。做了多少(按百分比)。
其他一些参数的使用:
adb shell monkey -p 包名 -s 数字 次数 例如: adb shell monkey -p 包名 -s 50 100
adb shell monkey -v -p 包名 --pct-touch 50 100
(解释一下:-v打印日志,-p测试哪个app, --pct-touch 50 点击事件占总事件的50% 100触发100次随机事件) 我在下边放一张图你就能直观看到其中含义,可以看到0事件触发概率是50%。
adb shell monkey -v -p 包名 --pct-motion 50 100 (由第二小点总结的理解第三小点并不难)
如果想要约束两个或者三个事件一起执行的百分比,写法如下:
adb shell monkey -v -p 包名 --pct-touch 50 --pct-motion 50 100(意思就是点击事件和动作事件的百分比各占50%)
轨迹球事件:
adb shell monkey -v -p 包名 --pct-trackball 80 100 轨迹球事件占总事件的80%,总共执行100次
adb shell monkey --pct-nav 80 100 基本导航事件(输入设备的上下左右)占总事件的80%,总共执行100次
adb shell monkey --pct-majornav 80 100 主要导航事件占总事件的80%,总共执行100次
adb shell monkey --pct-syskeys 80 100 系统导航事件占总事件的80%,总共执行100次
adb shell monkey --pct-appswitch 80 100 启动Activity事件占总事件的80%,总共执行100次
adb shell monkey --pct-anyevent 80 100 不常用事件占总事件的80%,总共执行100次
adb shell monkey --ignore-crashes
adb shell monkey --ignore-timeouts
CRASH结果的析取:
实现步骤:安装一个能引发CRASH 的 App →执行压力测试命令(触发CRASH)→提取CRASH的Exception信息。
adb shell monkey -v -p 包名 --ignore-crashes 10000 //出现Crash后继续执行
ANR结果的析取:
实现步骤:安装一个能引发ANR的 App →执行压力测试命令(触发ANR)→提取ANR的Exception信息。
手动测试的时候出现ANR怎么获取Log信息:
adb shell
cd data/anr //到anr目录下
ls //查看一下文件
more (tracts)文件名 //查看文件内容
在测试过程中如果不使用脚本功能可能执行的事件是随机的。所以想要执行相同功能就要用到
Monkey Script:它的使用就先要把脚本传输到手机上
adb push d:\monkey.txt sdcard/monkey.txt 将文件发送到手机
格式:adb push 电脑路径文件 手机路径文件。
然后通过指令执行:
adb shell monkey -f
Monkey Script 的一些命令:
1 Dispatch Trackball 命令
轨迹球事件:
Dispatch Trackball(longdowntime,long eventide,int action,float x ,float y ,....)
action 0 代表按下 , 1 代表弹起 ,x,y代表坐标点。
2 Dispatch Pointer 命令
点击事件:
Dispatch Pointer(longdowntime,long eventide,int action,float x ,float y ,....)
action 0 代表按下 , 1 代表弹起 ,x,y代表坐标点。
3 Dispatch String命令
输入字符串事件
Dispatch String (String text)
4 Launch Activity 命令
启动应用
Launch Activity(package,Activity)(包名,活动页面名)
5 UserWait命令
等待事件
UserWait(1000)
6 Dispatch Press
按下键值
Dispatch Press (int keycode) #keycode 66 回车键 ,不同的keycode 代表不同的键值
其他一些命令:
RotateScreen(rotationDegree, persist): 翻转屏幕,第一个参数是旋转角度,第二个是旋转后是否停在当前位置
Tap(x, y) :单击事件,点击屏幕,参数是点击坐标
Drag(xStart, yStart, xEnd, yEnd) :在屏幕上滑动,坐标是从哪一点滑到哪一点
LongPress(): 长按2s
ProfileWait(): 等待5s
PressAndHold(x, y, pressDuration) :模拟长按
PinchZoom(x1Start, y1Start, x1End, y1End, x2Start, y2Start, x2End, y2End, stepCount): 模拟缩放
RunCmd(cmd) :执行shell命令,比如截图 screencap -p /data/local/tmp/tmp.png
DispatchFlip(true/false) :打开或者关闭软键盘
UserWait(sleepTime) :睡眠指定时间
DeviceWakeUp() :唤醒屏幕
编写一个简单的浏览器搜索脚本:
编写步骤:
1 启动App
2 点击输入框
3 输入查询词
4 点击键盘回车键
5 点击搜索按钮
6 等待结果出现
7 点击清除按钮
typ = user
count = 10
speed = 1.0
start data >>
LaunchActivity(com.android.browser,com.android.browser.BrowserActivity) //设置开启那个软件,哪个界面
UserWait(2000) //等待两秒
DispatchPointer(10,10,0,400,400,1,1,-1,1,1,0,0) //设置按下输入框点击焦点
DispatchPointer(10,10,1,400,400,1,1,-1,1,1,0,0) //设置抬起输入框点击焦点
DispatchString(test) //设置要搜索的文字
UserWait(1000) //等待一秒
DispatchPress(66) //点击回车键
UserWait(1000) //等待一秒
DispatchPointer(10,10,0,400,900,1,1,-1,1,1,0,0) //设置按下搜索的点击焦点
DispatchPointer(10,10,1,400,900,1,1,-1,1,1,0,0) //设置抬起搜索的点击焦点
UserWait(6000) //等待6秒
DispatchPointer(10,10,0,756,281,1,1,-1,1,1,0,0) //设置按下输入框点击焦点
DispatchPointer(10,10,1,756,281,1,1,-1,1,1,0,0) //设置抬起输入框点击焦点
UserWait(3000) //等待三秒
脚本编写完成以后想要运行这个脚本就要把此脚本放到手机中。那编写的脚本文件在电脑中怎么放到手机中呢?用如下命令
脚本名monkey.script 位置:D盘根目录下 想要放到手机中的位置: data/local/tmp 目录下
命令行执行:adb push D:/monkey.script /data/local/tmp/
可以看到如下执行结果,代表文件已经成功导入到手机中。
导入成功后就要切换到手机目录下,用手机里的monkey去执行我们的monkey.script.脚本了操作步骤如下:
命令行输入:
adb shell //切换到手机目录下
cd /data/local/tmp //进入到我们存放脚本的目录
ls //查看目录下是否有我们已经导入的脚本,确认存在
monkey -f monkey.script 2 //执行monkey.script脚本执行两次
这里要注意,要确定app工程中设置了能被外部调起 android:exported = "true"。
MonkeyRunner
在运行monkeyrunner的时候可能会有踩到一些坑,我把坑总结了一下,如有monkeyrunner 无法启动的问题,脚本执行命令问题请查看——————MonkeyRunner无法正常运行
为了要满足更多的模拟操作我们就要用到monkeyRunner中的一些API
1、MonkeyRunner API - alert
警示框
代码段 void alert (string message ,stringtitle,string okTitle)
//正文内容,警告框的title ,按钮上的文字
我们在编译器中编写如下代码
#!/usr/bin/python
#-*- UTF-8 -*-
from com.android.monkeyrunner import MonkeyRunner
MonkeyRunner.alert('hello mook frends','this is title','OK')
执行结果:
2、MonkeyRunner API -waitForConnection
等待设备连接,有多个device id,需要指明具体哪个设备。
waitForConnection(float timeout,string deviceid)
3、MonkeyDevice API -drag
拖动:
drag(tuple start,tuple end,float duration,integer steps)
(拖动起始点位置,拖动结束点位置,手势持续时间,插值点的步数,默认10)
4、MonkeyDevice API -press
按键
press(string keycode,dictionary type)
(keycode(回车键66),动作类型Down、UP、DOWN_AND_UP(弹起,按下))
5、MonkeyDevice API - startActivity
启动应用
startActivity(package+'/'+activity)
6、MonkeyDevice API -touch
touch(integer x,integer y,integer type)
(x坐标值,y坐标值,type= DOWN,UP,DOWN_AND_UP)
7、MonkeyDevice API -type
输入
type(string message)
文本信息
8、MonkeyDevice API -takeSnapshot
截屏
MonkeyImage takeSnapshot()
9、Monkey Image API - sameAs
图像对比
boolean sameAs (MonkeyImage other,float percent)
(文件名称,相似度百分比)
10、MonkeyImage API -writetoFile
保存图像文件
void writeTOFile(string path,string format)
(保存文件的路径,保存文件的格式(JPG、PNG...))
综合:在输入框输入文字,并截图。
#!/usr/bin/python
#-*- UTF-8 -*-
#把要用到的模块导入到工程中
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,MonkeyImage
#连接手机(延迟多少秒,手机的devices号)
device = MonkeyRunner.waitForConnection(5,"emulator-5556")
#要运行软件的包名和Activity名
device.startActivity("com.android.browser/com.android.browser.BrowserActivity")
#延迟两秒
MonkeyRunner.sleep(2)
#按下输入文本框操作
device.touch(400,400,'DOWN_AND_UP')
#延迟一秒
MonkeyRunner.sleep(1)
#输入文本
device.type('test')
#延迟一秒
MonkeyRunner.sleep(1)
#按下回车键
device.press('66','DOWN_AND_UP')
#延迟一秒
MonkeyRunner.sleep(1)
#点击搜索按钮
device.touch(400,900,'DOWN_AND_UP')
#延迟六秒
MonkeyRunner.sleep(6)
#将执行后的界面截图,并保存到D盘下
result = device.takeSnapshot()
result.writeToFile('D:\TEST.png','png')
脚本文件如上,编写的时候不要添加中文。否则会出现编码错误的问题。
编好后,执行结果如下:
查看一下D盘下的文件:
到此为止,monkey的简单使用就介绍完了。