欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

测试——Monkey测试的介绍及使用

发布时间:2024/3/13 75 豆豆
生活随笔 收集整理的这篇文章主要介绍了 测试——Monkey测试的介绍及使用 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

Monkey的简单介绍:

  • Monkey是android系统自带的测试工具,他能运行在虚拟机和真机中。
  • Monkey能向系统发送伪随机的用户事件流(像按键,触摸,手势操作等)进行模拟操作,实现对程序的压力测试。
  • Monkey所产生的事件都是随机的,不会带有主观性。
  • 用来测试安卓移动端App的健壮性和稳定性。
  •  

    Monkey的简单使用: 

    搭建环境:

    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次。    
  • 要给某个程序打压力,就要获取App包名。                                                                                                                           获取包名方法: (命令行输入)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代表次数)                                                                                                                   
  • 时间间隔参数--throttle  就是说在执行每个操作之间的时间间隔    :                                                                                      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就是这次测试都进行了什么事件。做了多少(按百分比)。

     

    其他一些参数的使用:

  • Seed :想要两次执行相同的操作,我们就要设置一个seed值:                                                                                               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次

     

  • 系统导航事件:设定系统导航事件的百分比,HOME、BACK、拨号及音量键                                                        adb shell monkey --pct-syskeys 80 100 系统导航事件占总事件的80%,总共执行100次

     

  • 启动Activity事件: adb shell monkey --pct-appswitch 80 100 启动Activity事件占总事件的80%,总共执行100次

     

  • 不常用事件: adb shell monkey --pct-anyevent 80 100 不常用事件占总事件的80%,总共执行100次

     

  • 崩溃事件:设置一下,在系统跑崩溃之后还要继续执行。直到事件数跑够才停止。 adb shell monkey --ignore-crashes <event-count>

     

  • 超时事件:设置一下,在系超时之后还要继续执行。直到事件数跑够才停止。 adb shell monkey --ignore-timeouts <event-count>

     

  •                                                                                                                                                                                                        

  • 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脚本功能:

    在测试过程中如果不使用脚本功能可能执行的事件是随机的。所以想要执行相同功能就要用到

    Monkey Script:它的使用就先要把脚本传输到手机上

    adb push d:\monkey.txt sdcard/monkey.txt 将文件发送到手机 格式:adb push 电脑路径文件 手机路径文件。

     然后通过指令执行:

    adb shell monkey -f <scriptfile> <event-count>

    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(): 长按2sProfileWait(): 等待5sPressAndHold(x, y, pressDuration) :模拟长按 PinchZoom(x1Start, y1Start, x1End, y1End, x2Start, y2Start, x2End, y2End, stepCount): 模拟缩放RunCmd(cmd) :执行shell命令,比如截图 screencap -p /data/local/tmp/tmp.pngDispatchFlip(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的简单使用就介绍完了。

    总结

    以上是生活随笔为你收集整理的测试——Monkey测试的介绍及使用的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。