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

Monkey的简单介绍:

  1. Monkey是android系统自带的测试工具,他能运行在虚拟机和真机中。
  2. Monkey能向系统发送伪随机的用户事件流(像按键,触摸,手势操作等)进行模拟操作,实现对程序的压力测试。
  3. Monkey所产生的事件都是随机的,不会带有主观性。
  4. 用来测试安卓移动端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 包名   

 

发送各种测试指令: 

  1. 发送压测指令             
      adb shell monkey 1000 
     adb shell +工具名称+完成1000次指令(随机)                     一些提示信息: activityResuming (com.******) 代表这个程序从前台调入到后台再从后台回调到前台这个过程。     Events injected:1000            这个提示信息就代表完成了一千次操作,如果小于1000的话代表有错误,未执行1000次。    
  2. 要给某个程序打压力,就要获取App包名。                                                                                                                           获取包名方法:
    (命令行输入)adb shell pm list package -f            (获取手机内所有程序的包名,包括系统程序)            
    
    (命令行输入)adb shell dumpsys window w | findstr \/ | findstr name=    (获取正在打开的程序的包名)注意空格要加齐了,没空格的地方不要乱加。

    输出的东西是:包名/Activity名。

  3. 给某一个程序打压力 :                     
    adb shell monkey -p 包名 -v  -v  -v 1000    (-v 代表输出信息级别,1000代表次数)
                                                                                                                      
  4. 时间间隔参数--throttle  就是说在执行每个操作之间的时间间隔    :                                                                                     
    adb shell  monkey -p 包名  --throttle 500  -v -v -v 100         (延迟500毫秒执行一次,共执行100次)

     

  5. 打印输出的日志结果:                                                                                                                                                               
     adb shell  monkey -p 包名  --throttle 500  -v -v -v 100  > D:/monkey_log.txt        (延迟500毫秒执行一次,共执行100次 ,并且记录下日志结果打印到D盘下)             
      

       然后我们看一下打印出来的结果。

首先我们能看到日志文件确实存在了。然后我们打开看一下。

测试——Monkey测试的介绍及使用_第1张图片

这上边的提示是:

测试的seed值(因为是随机事件100次,所以seed值是随机的),这个seed值就是说如果我们此次测试出现问题下次用这个seed值就能复现。

count:测试各种事件总共的次数。

Include Category:测试包含的类别。

测试——Monkey测试的介绍及使用_第2张图片

这个就是说测试了100次,sending rotation degree 未发现错误,下边的那些也是一样。

顺便说一下他主要测试的一些点。

测试——Monkey测试的介绍及使用_第3张图片

我们知道seed是测试编号,下边的0-11就是这次测试都进行了什么事件。做了多少(按百分比)。

 

其他一些参数的使用:

  1. Seed :想要两次执行相同的操作,我们就要设置一个seed值:                                                                                             
     adb shell monkey -p  包名  -s 数字   次数      例如:  adb shell monkey -p 包名 -s 50 100

     

  2. 设置点击事件占总事件的百分比: 
     adb shell monkey -v -p 包名 --pct-touch 50 100 
     (解释一下:-v打印日志,-p测试哪个app, --pct-touch 50 点击事件占总事件的50%      100触发100次随机事件)             我在下边放一张图你就能直观看到其中含义,可以看到0事件触发概率是50%。

    测试——Monkey测试的介绍及使用_第4张图片

     

  3. 动作事件:   
    adb shell monkey -v -p 包名 --pct-motion 50 100        (由第二小点总结的理解第三小点并不难)

     如果想要约束两个或者三个事件一起执行的百分比,写法如下:

     adb shell monkey -v -p 包名 --pct-touch 50 --pct-motion 50 100(意思就是点击事件和动作事件的百分比各占50%)

     

  4. 轨迹球事件:

    adb shell monkey -v -p 包名 --pct-trackball 80 100     轨迹球事件占总事件的80%,总共执行100次

     

  5. 基本导航事件:
    adb shell monkey --pct-nav 80 100    基本导航事件(输入设备的上下左右)占总事件的80%,总共执行100次

     

  6. 主要导航事件:设定主要导航事件的百分比,兼容性中间键,返回键,菜单键                                                                        
    adb shell monkey  --pct-majornav 80 100     主要导航事件占总事件的80%,总共执行100次

     

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

     

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

     

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

     

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

     

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

     

  12.                                                                                                                                                                                                        

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  

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测试的介绍及使用_第5张图片

 导入成功后就要切换到手机目录下,用手机里的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')

执行结果:

测试——Monkey测试的介绍及使用_第6张图片

 

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')

脚本文件如上,编写的时候不要添加中文。否则会出现编码错误的问题。

编好后,执行结果如下:

测试——Monkey测试的介绍及使用_第7张图片

查看一下D盘下的文件:

测试——Monkey测试的介绍及使用_第8张图片

到此为止,monkey的简单使用就介绍完了。

你可能感兴趣的:(测试)