目录

一、安装Android SDK

1.1  mac安装Android SDK

1.1.1  方式一:下载 Android SDK

1.1.2  方式二:使用brew 安装 Android SDK

1.2  win安装Android Android SDK

二、安装Android studio

2.1  mac安装Android studio

2.2  win电脑安装Android studio

三、adb

3.1 win 安装adb

3.2 mac使用homebrew安装adb

3.3 手机连接

3.4 adb常用命令

四、查看应用的包名papackage与页面的Activity

4.1 mac 查看 包名papackage与页面的Activity

4.2 win 查看 包名papackage与页面的Activity

五、monkey

3.1 monkey命令模版

3.2 seed值,标记

3.3 设置monkey事件的百分比

3.4 monkey注意事项:

六、monkey实战

6. 1 项目实战

七.  指定页面进行压测

八、monkey bugreport 测试报告分析

8.1 Android adb bugreport工具分析和使用

8.2  battery-historian解析数据

8.3 使用jar包解析数据

九、Monkey日志分析

7.1  ANR 应用程序无响应对话框

7.1.1 ANR分析:

7.1.2   traces.txt 文件

7.2  Monitor&DDMS

7.3  Exception & Crash

7.4 monkey日志分析步骤

十、MonkeyScript脚本

10.1  MonkeyScript 常用命令

10.2   MonkeyScript 脚本编写

10.3 执行脚本

十一、MonkeyRunner介绍

11.1 环境搭建&启动:

​编辑

11.2 MonkeyRunner API介绍&常用命令

11.2.1 MonkeyRunner类

11.2.2 MonkeyDevice类

11.2.3 MonkeyImage类

十二、MonkeyRunner脚本实战

12.1、测试场景

12.2、思路分析

12.3、代码(考研帮app)

十三、python GUI编程(tkinter)基于adb 编写安卓助手


一、安装Android SDK

1.1  mac安装Android SDK

1.1.1  方式一:下载 Android SDK

可以去官网下载,官网要是不方便下载的话,用下面这个下载地址:

Android SDK 百度网盘下载地址链接

下载完成后配置环境变量,(自行百度吧)

1.1.2  方式二:使用brew 安装 Android SDK

mac 安装配置android sdk_拾玖ᵛᵃᵉ的博客-CSDN博客_mac安装android sdk

1、安装好brew后,通过以下命令进行sdk的安装。没有安装brew,需要先安装brew。

brew install android-sdk

2、查看是否已安装成功,在终端执行:android

安装成功。

3、配置SDK的环境变量

查看sdk安装路径:

brew list android-sdk

我电脑android sdk 安装路径为:

/opt/homebrew/Caskroom/android-sdk

编辑环境变量文件.bash_profile文件

vim ~/.bash_profile

配置环境变量

export ANDROID_HOME=/opt/homebrew/Caskroom/android-sdk
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools

使配置立即生效:

source ~/.bash_profile

注意

mac电脑,一定要搞清楚自己要修改

~/.bash_profile 还是要修改 vim ~/.zshrc 文件

mac修改环境变量的两种方式_傲娇的喵酱的博客-CSDN博客_mac 修改环境变量

验证环境变量是否配置成功:

adb version

安装成功。

1.2  win安装Android Android SDK

可以去官网下载,官网要是不方便下载的话,用下面这个下载地址:

http://tools.android-studio.org/index.php/sdk

下载完成后,配置环境变量。(自行百度吧)

二、安装Android studio

为啥要安装Android studio呢?

我们有一些场景用到Android studio,比如内存分析,以及在测试过程中,log的查看,开发可能打了很多日志,我们通过Android studio 可以查看到开发的日志,方便我们定位问题。

Android studio 不着急下载安装,啥时候用到再去下载安装,前期这一章节可以跳过去。

2.1  mac安装Android studio

mac电脑安装Android studio_遛马的博客-CSDN博客_mac安装android studio

Android studio 官网:

Download Android Studio & App Tools - Android Developers

下载之前查一下电脑的芯片,用的是apple的还是intel,我用的apple芯片,点击

Mac with Apple chip

下载完成后,点击dmg安装,

选择do not impot

2.2  win电脑安装Android studio

Android studio 官网:

Download Android Studio & App Tools - Android Developers

下载完成后,剩下的自行百度吧,太杂了,也没啥技术含量。

2.3  win电脑安装Android studio 连接真机调试APP

Android Studio连接真机调试APP_xcj1409385086的博客-CSDN博客

2.4  mac电脑安装Android studio 连接真机调试APP

只有 Windows 需要 Google USB 驱动程序, Mac OS X 或 Linux 上开发,则不需要 USB 驱动程序。

三、adb

adb全称是Android Debug Bridge,它是一个命令行工具,通过它可以与Android设备进行交互,可以进行常见的安装/卸载app、打开app、查看app的日志等操作。

官网:Android Debug Bridge (adb)

3.1 win 安装adb

通过Android sdk安装。1.下载AndroidSDK 2.配置adb环境变量。

如果我们完成了第一章节  安装Android SDK ,就不用再安装adb了,可以直接用。

3.2 mac使用homebrew安装adb

如果我们完成了第一章节  安装Android SDK ,就不用再安装adb了,可以直接用。

也可以单独使用homebrew安装adb

如果已经安装了homebrew,就不用执行安装homebrew命令了

安装homebrew:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装adb:

使用以下命令,如果第一个命令报错,就使用第二个。

brew cask install android-platform-tools
brew install android-platform-tools --cask

安装成功:

再次输入adb devices 显示安装成功

3.3 手机连接

手机打开开发者模式,连接数据线,允许设备调试。

usb连接方式为数据传输模式

adb devices

查看连接设备

无线连接的方法:(大概就是以下方法,具体可以自行百度)

电脑与测试机处于同一局域网中,通过为测试机设置端口号做唯一映射

adb -s 设备号 tcpip 5556

adb connect 设备IP:5556

进入android设备关于手机页面,红框中标识即为设备IP

此时cmd命令窗口中输入adb deveices回车,可正常返回该设备的连接信息即为连接成功

3.4 adb常用命令

1.adb常用命令#连接手机adb devices -l#安装APPadb install name.apk#卸载APPadb unnistall 包名#解锁屏幕adb shell input keyevent 26#点击触屏adb shell input tap 500 500#输入字符adb shell input text abc#登录androidadb shell#从Android拷贝资料到PCadb pull /sdcard/DCIM/Camera/文件名  /Users/lenov#从PC端拷贝资料到设备adb push /Users/lenov/文件名   //sdcard/DCIM/Camera

四、查看应用的包名papackage与页面的Activity

为啥要查看应用的包名papackage与页面的Activity?

因为我们在写自动化的时候,很多参数都需要指定应用的包名papackage与页面的Activity。

win 与mac 查看应用的包名的命令好像不一致,我使用的是mac,所以用mac的命令,我也写了win的命令,不过win的命令,执行失败的话,只能自己百度一下了。

4.1 mac 查看 包名papackage与页面的Activity

注意:在win才有findstr这个命令,mac的命令是grep

方式一:

1、连接手机

2、打开需要查看的app

3、执行命令:

adb shell dumpsys window w |grep / |grep name=

mSurface=Surface(name=com.Test/com)/@0

如上,包名为

com.xxx

主程序入口为:

com.xx.WebActivity

方式二:

在终端中输入命令:

adb shell am monitor

然后打开应用

这个命令只能获取包名。

4.2 win 查看 包名papackage与页面的Activity

如果以下命令不正确,就要自己百度去了。

1、aapt

将apk拖放到cmd中

aapt dump badging <apk文件路径>(将apk拖放到此处即可)

2、adb logcat 获取

adb shell "logcat | grep START"

输入这个命令,然后去启动app。

3.dumpsys

(1)启动要查看的程序;

(2)命令行输入:adb shell dumpsys window w |findstr \/ |findstr name=

(3) 命令输入:adb shell dumpsys window | findstr mCurrentFocus

命令查看当前运行的包名和Activity

五、monkey

Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar;

查看帮助:

adb shell monkey –help

3.1 monkey命令模版

一般在做monkey时,使用以下这个命令就可以了,日志尽量详细一点,将来好分析定位问题。

 adb shell monkey -p packagename --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 1000000>c:\test.log

--throttle 500

每个时间间隔500毫秒。事件之间的固定延迟,若无该项monkey每个时间之间不会有时间间隔

--ignore-crashes

忽略crash,当指定的应用程序发生崩溃时(Force&Close错误),Monkey继续执行事件。

--ignore-timeouts

忽略超时,当指定的应用程序发生ANR 错误时,Monkey事件继续执行。

--ignore-security-exceptions

当应用程序发生许可错误时(如证书许可,网络许可等),Monkey继续执行事件。

--ignore-native-crashes

忽略本地的crashes

--monitor-native-crashes

监视并报告应用程序发生崩溃的本地代码

--kill-process-after-error 

当应用程序发生错误时,应用程序停止运行并保持在当前状态(注意:应用程序仅是静止在发生错误时的状态,系统并不会结束该应用程序的进行)

-v

打印log级别,-v越多日志信息越详细,最多支持3个。三个-v,是最详细的。

例如:adb shell monkey -p 包名 -v -v -v 事件总数

我们在执行monkey时,这个-v 日志详细度要设置最大,这样会方便我们定位问题。

monkey执行时长:

monkey没有执行时长的命令,如jmeter,压测十分钟。monkey没有这种功能,这里只能通过换算。

事件总数计算方式=预计运行时长(换算成秒)/间隔时长(换算成秒)

为什么要加忽略:

如果不忽略crash,出现crash,monkey就停了。

3.2 seed值,标记

如果seed值相同,则两次执行monkey的事件顺序是相同的。

应用场景:

我们在执行monkey时,给一个seed标记。等我们下次需要复现上一次的执行过程时,我们执行monkey命令,带上这个标记,则这一次执行的事件顺序与上一次事件顺序是一致的,就可以复现上一次的步骤。

注意:

两次执行命令,使用相同的seed值,执行过程并不是严格意义上一致的,可能会有不一致的地方,不过这个不重要,我们可以忽略这个。

示例:

第一次执行,1000次。seed值为666

 adb shell monkey -p packagename -s 666 1000

第二次执行,为了与上一次执行的逻辑一样,同样适用666为seed值。

 adb shell monkey -p packagename -s 666 1000

seed值,如果执行的命令里不指定,在monkey执行时,会生成一个seed值。

3.3 设置monkey事件的百分比

monkey的事件都是随机事件,我们这里可以设置每个事件类型发生的百分比。

0:触摸事件百分比,即参数--pct-touch
1:滑动事件百分比,即参数--pct-motion
2:缩放事件百分比,即参数--pct-pinchzoom
3:轨迹球事件百分比,即参数--pct-trackball
4:屏幕旋转事件百分比,
5:基本导航事件百分比,即参数--pct-nav
6:主要导航事件百分比,即参数--pct-majornav
7:系统事件百分比,即参数--pct-syskeys
8:Activity启动事件百分比,即参数--pct-appswitch
9:键盘翻转事件百分比,即参数--pct-flip
10:其他事件百分比,即参数--pct-anyevent

例如:

adb shell monkey -v -p XXX --pct-touch 1 --pct-motion 2 --pct-trackball 3 --pct-nav 4 --pct-majornav 5 --pct-syskeys 6 --pct-appswitch 7 --pct-anyevent 8

3.4 monkey注意事项:

1、. 开启安全设置下的未知来源

2. 手机连接电源充电

3. 若有有关于音频的模块,请插入耳机避免影响其他同事

六、monkey实战

在执行monkey事件中,手机不会自己熄屏

6. 1 项目实战

先执行monkey,获取日志。1000次,每次时间间隔500ms。

adb shell monkey -p comxxx.test --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 1000>/Users/zhaohui/Desktop/monkeylog.txt

zhaohui@zhaohuideMacBook-Pro ~ % adb shell monkey -p com.xxx.Test --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 1000>/Users/zhaohui/Desktop/app.log
args: [-p, com.szking.kyjj.custTest, --throttle, 500, --ignore-crashes, --ignore-timeouts, --ignore-security-exceptions, --ignore-native-crashes, --monitor-native-crashes, -v, -v, -v, 1000]arg: "-p"arg: "com.szking.kyjj.custTest"arg: "--throttle"arg: "500"arg: "--ignore-crashes"arg: "--ignore-timeouts"arg: "--ignore-security-exceptions"arg: "--ignore-native-crashes"arg: "--monitor-native-crashes"arg: "-v"arg: "-v"arg: "-v"arg: "1000"
data="com.szking.kyjj.custTest"
arg="--throttle" mCurArgData="null" mNextArg=3 argwas="--throttle" nextarg="500"
data="500"
arg="--ignore-crashes" mCurArgData="null" mNextArg=5 argwas="--ignore-crashes" nextarg="--ignore-timeouts"
arg="--ignore-timeouts" mCurArgData="null" mNextArg=6 argwas="--ignore-timeouts" nextarg="--ignore-security-exceptions"
arg="--ignore-security-exceptions" mCurArgData="null" mNextArg=7 argwas="--ignore-security-exceptions" nextarg="--ignore-native-crashes"
arg="--ignore-native-crashes" mCurArgData="null" mNextArg=8 argwas="--ignore-native-crashes" nextarg="--monitor-native-crashes"
arg="--monitor-native-crashes" mCurArgData="null" mNextArg=9 argwas="--monitor-native-crashes" nextarg="-v"

七.  指定页面进行压测

原文: 

指定页面进行monkey 测试_testlyIII的博客-CSDN博客_monkey指定页面测试

【转】指定页面进行Monkey测试 - 爱码网

前言:

目前大部分的Monkey测试的方式大都无法对独立的模块进行稳定性测试,而每个业务线的入口在测试阶段很难通过原生的Monkey测试(随机性较强)来发现自己模块内crash的问题,针对这个问题,这个工具设计开发的初衷就是为了能够缩小测试范围,在测试阶段指定业务模块内发现和暴露更多的稳定性相关的问题。

解决问题:

当App业务变多的时候之后我们需要对App内的业务模块进行针对性稳定性测试。由于原生的Monkey随机性较强,很难 对指定的Activity进行针对性的monkey测试,Demons的出现就为了解决了这个问题。

原理:

原理其实就是有一个后台任务可用定时巡检PC上所连的每个设备当前运行在哪个页面,如果发现设备已经crash或者当前页面不在我们指定的白名单页面,那么该程序会自动处理当前进程的数据并初始化回到主入口。

工具特点:

  • 只要手机连上就可以进行监听,无设备数量限制。
  • 可以在每次越界之后随机分配回到一个主入口 进行初始化。
  • 工具与Monkey执行模块是分离的,这样可以防止相互影响。

jar包git下载地址:

GitHub - 18713341733/MonkeyJava

里面就一个配置文件config.xml 和jar包。

使用方式:

1、将工具下载下来放到本地目录下
2、配置工作目录config.xml文件

第一步,获取app的package,并填写配置文件xml

第二步,获app程序的入口activity,并填写配置文件xml

①:adb shell dumpsys window windows | findstr "mCurrent"

②:adb shell dumpsys activity | findstr "mFocusedActivity"

第三步,获取并输入activity白名单:

①.也可以使用adb logcat -v time -s ActivityManager,点击app功能跳转想要测试的页面,cmd页面就可以刷新获取到跳转页面的activity,然后把activity输入到白名单内

【注:当白名单内的activity的数量大于1的时候,每个activity后面都需要添加英文逗号 “,” ,最后一个不需要添加,否则多个白名单的activity的value就会链接在一起,导致程序检测到与当前页的activity不一致,就一直返回到主页面activity上,影响测试】

需要对指定模块设置白名单,在设置白名单前需要知道当前功能页面的Activity。

在win系统中:

adb shell dumpsys activity | findstr "mFocusedActivity"

注意:在win才有findstr这个命令,mac的命令是grep

验证主入口是否有跳转权限

adb shell am start -n 包名/Activity名

主入口如果配的有问题会出现以下错误,原因是Activity 没有调用权限

根据以上名称查看当前功能的Activity,将该页面配置至白名单,如下图所示。

3、monkey执行

将单个或多个设备连接电脑

打开cmd命令窗口,进入当前jar包所在目录,执行

java -jar monkeyTest.jar

等待初始化完成

再启一个cmd命令窗口,执行monkey命令即可。

缺陷:

每个页面都会有个activity,而且,会出现多个页面共有同一个activity的现象,这样的话,就有个缺陷,如果有个A页面下的B页面,他们的共用同一个activity,我只是想在A页面跑monkey,B页面不跑monkey,这个需求是无法通过这个方法达到的,所以,A、B页面都会测试到,原因就是,他这个是针对activity的测试,只要是白名单里的activity,都是可以测试到的,除非A页面、B页面不共用一个activity。这个技术只是比基本的monkey更细化一点,还无法真正达到指定A页面moneky测试

八、monkey bugreport 测试报告分析

当我们使用monkey命令执行时:

adb shell monkey -p com.xxx.Test --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 1000>/Users/zhaohui/Desktop/monkeylog.txt

会在Desktop/生成一个monkeylog.txt文档,这个文档就是monkey记录的日志,包括monkey执行的步骤,app的日志等。

我们在执行monkey后,其实会生成2个日志文件,一个是monkey记录的,一个是adb bugreport记录的。

在我们电脑终端,执行命令。

adb bugreport > bugreport.txt

就可以在当前位置生成一个bugreport.txt文件。

8.1 Android adb bugreport工具分析和使用

Android adb bugreport工具分析和使用 - Android移动开发技术文章_手机开发 - 红黑联盟

Android系统想要成为一个功能完备,生态繁荣的操作系统,那就必须提供完整的应用开发环境。而在应用开发中,app程序的调试分析是日常生产中进程会进行的工作。Android为了方便开发人员分析整个系统平台和某个app在运行一段时间之内的所有信息,专门开发了bugreport工具。这个工具使用起来十分简单,只要在终端执行(linux或者win):

1.Android系统版本>=8.0,直接使用指令adb bugreport,例如:

adb bugreport > bugreport.txt
或者:
adb bugreport > C:\Users\ymlu\Desktop\bugreport.txt

2.针对Android系统版本<8.0,终端切至路径C:\Users\ymlu\Desktop\adt-bundle-windows-x86_64-20140702\adt-bundle-windows-x86_64-20140702\sdk\platform-tools下面,运行adb.exe;然后运行adb bugreport即可

即可生成bugreport文件。

bugreport文件有的时候异常庞大,能够达到15M+,如果我们用文本工具打开一个几十m的txt文件,是一件很痛苦的事情。

实践中发现bugreport只能导出近2小时的日志,所以需要在monkey测试中设置定时任务来定时导出bugreport日志,以便全面分析被测APP在monkey压测过程中出现的问题。

因此google针对android 5.0(api 21)以上的系统开发了一个叫做battery historian的分析工具,这个工具就是用来解析这个txt文本文件,然后使用web图形的形式展现出来,这样出来的效果更加人性化,更加可读。

8.2  battery-historian解析数据

从bugreport导出手机数据,通过battery-historian解析原始数据进行多维度分析功耗异常

下载地址:GitHub - google/battery-historian: Battery Historian is a tool to analyze battery consumers using Android "bugreport" files.

具体使用方式,百度一下吧。

8.3 使用jar包解析数据

我们通过jar包,也是解析的adb bugreport 产生的数据。

jar包地址:

GitHub - 18713341733/bugreport

命令:

adb bugreport > bugreport.txt

在当前目录生成了一个压缩文件bugreport.zip

解压bugreport.zip。解压之后,有一个文件名称带有日期的txt文件。

类似于bugreport-TAS-AN00-HUAWEITAS-AN00-2022-08-19-11-24-15.txt

我们使用jar包,就是具体解析的这个文件。

将这个文件重命名为 bugreport.txt,然后将jar包与txt文件放在同一目录下,执行

java -jar chkbugreport.jar bugreport.txt

即可在当前目录生成报告。

打开index.html,就是报告

九、Monkey日志分析

当我们使用monkey命令执行时:

adb shell monkey -p com.xxx.Test --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 1000>/Users/zhaohui/Desktop/monkeylog.txt

对monkeylog.txt文件的分析

7.1  ANR 应用程序无响应对话框

ANR(Application Not Response)是指在Android上,应用程序响应不够灵敏时,系统会向用户显示的一个对话框。 用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。

7.1.1 ANR分析:

教你如何 分析 Android ANR 问题 - 走看看

1、查看monkey的log

2、/data/anr/traces.txt

3、查看logcat日志ANR

在monkey log文件中,搜索ANR,如下图

1、anr发生的页面

2、每个进程的CPU 利用率

7.1.2   traces.txt 文件

adb shell

进入linux 系统

在/data/anr/目录下,有个traces.txt文件

取出这个文件,在电脑终端执行命令

adb pull /data/anr/traces.txt .

分析这个文件。

系统发生ANR,一定会记录在这个文件里。在每次执行稳定性测试时,可以手动清理这个文件。

7.2  Monitor&DDMS

Monitor 集成了DDMS,也可以单独使用DDMS

在终端输入Monitor ,启动Monitor

看log cat日志

集成了DDMS

1、1点击,出现logcat

2、双击logcat放大

7.3  Exception & Crash

异常Exception 通常伴随着Crash。

1、查看monkey的log日志

2、查看logcat日志Crash

7.4 monkey日志分析步骤

1、按关键字进行搜索,ANR、Exception、Crash

a、无响应问题可以在日志中搜索 “ANR” 。

b、崩溃问题搜索 “CRASH” 。

c、内存泄露问题搜索"GC"(需进一步分析)。

d、异常问题搜索 “Exception”(如果出现空指针, NullPointerException,需格外重视)。

2、找到有问题的地方,查看上下文信息

3、重点查看log中第一个switch,Monkey执行的是那一个Activity 上下文信息,有没有报错之类的。一般错误都会显示在这个后面

4、查看monkey里面出错钱的一些事件动作,可以手动执行该动作

5、进行问题复现,可以使之前执行的monkey命令再执行一遍,注意seed值要一致

搜ANR,如果搜索出来的量 很大,那么搜索的时候,ANR后加一个空格,这样结果就会减少。

在log的最开始都会显示Monkey执行的seed值、执行次数和测试的包名。

报错信息能分析就分析,不能分析就把关键词搜索到的错误信息截图发给开发。

十、MonkeyScript脚本

MonkeyScript使用教程 - 清风软件测试 - 博客园

MonkeyScript 是官方提供的,除了像Monkey一样随机乱点之外,还可以通过编写脚本的形式,完成一系列固定的操作。

MonkeyScript 提供一整套完善的 API 来进行支持,主要还是基于坐标点的操作,包含常用的:点击、长按、输入、等待等操作。

MS脚本只要是文本即可,不关心后缀是什么,所以编写时不要添加后缀,保存文本格式即可。

MonkeyScript 执行命令:

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

<scriptfile>MonkeyScript 脚本

<event-count> 执行次数

10.1  MonkeyScript 常用命令

一、DispatchTrackball 轨迹球事件

DispatchTrackball(long downtime,long eventtide,int action,float x,float y,float pressure,float size,int metastate,float xprecision,float yprecision,int device,int edgeflags)

注意:按一个键需要两个轨迹球事件 。

轨迹球常用命令:

1、int action

指具体操作的动作。action: 0代表按下,1代表谈起,一个点击事件,需要执行0和1两个。

2、float x,float y

x 与y 的坐标

以上2个是轨迹球常用命令,需要根据具体情况进行修改。

轨迹球非常用命令:

以下几个命令,在实际使用时,直接复制用就可以了,不用进行修改,所以也不用关注这几个命令是啥意思。

long downtime指键最初被按下的时间

long eventtide 指事件发生的时间

float pressure 压力事件的大小(0-1)

float size 触摸的记事值(0-1)

int metastate 当前按下mate键的标识

二、DispatchPointer 点击事件

按一个键需要2个点击事件

三、DispatchString 输入字符串命令

DispatchString(String text)

四、LaunchActivity 启动应用

LaunchActivity(package,Activity)

 五、UserWait 等待事件

UserWait(1000)

单位毫秒

六、DispatchPress 按下键值

DispatchPress(int keycode)

如按下回车键:

DispatchPress(66) 

 DispatchPress 与 DispatchPointer 区别:

DispatchPointer 点击的是屏幕(坐标)

DispatchPress 点击的是键盘,如点击回车键、点击a键、f键等。

Android KeyCode 列表:

Android KeyCode 列表 - 狐狸已化妖 - 博客园

遇到不知道的键,需要自己去百度一下,以下是部分键的int值。

KEYCODE_CALL 拨号键 5
KEYCODE_ENDCALL 挂机键 6
KEYCODE_HOME 按键Home 3
KEYCODE_MENU 菜单键 82
KEYCODE_BACK 返回键 4
KEYCODE_SEARCH 搜索键 84
KEYCODE_CAMERA 拍照键 27
KEYCODE_FOCUS 拍照对焦键 80
KEYCODE_POWER 电源键 26
KEYCODE_NOTIFICATION 通知键 83
KEYCODE_MUTE 话筒静音键 91
KEYCODE_VOLUME_MUTE 扬声器静音键 164
KEYCODE_VOLUME_UP 音量增加键 24
KEYCODE_VOLUME_DOWN 音量减小键 25

10.2   MonkeyScript 脚本编写

手机设置,打开开发者模式,打开 指针位置,这样我们就可以看到点击的坐标。

下面以测试登录功能为例:

模板:

type=user
count = 1
speed = 1.0
start data >>
LaunchActivity(Activity)
UserWait(1000)
DispatchPointer(0,0,0,303,312,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,303,312,0,0,0,0,0,0,0)
UserWait(1000)
DispatchString(1234566)
UserWait(100)
DispatchPointer(0,0,0,345,393,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,345,393,0,0,0,0,0,0,0)
UserWait(100)
DispatchString(1234567)
UserWait(1000)
DispatchPointer(0,0,0,100,100,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,100,100,0,0,0,0,0,0,0)
UserWait(1000)
DispatchPointer(0,0,0,361,507,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,361,507,0,0,0,0,0,0,0)
UserWait(3000)

注意:

顶部4行命令,是MonkeyScript 固定的脚本头,需要写在脚本的最前面。

type=user
count = 1
speed = 1.0
start data >>

在脚本中,脚本头是一直不变动的,为了避免写错,可以直接复制粘贴最保险。

在 start data>> 之后就可以正式开始编写 monkey 脚本了。

在脚本中,使用 # 号,对单行进行注释。

例子二:

type=user
count = 1
speed = 1.0
start data >>
LaunchActivity(com..xxx.tTest,com.xxx)
UserWait(1000)
DispatchPointer(0,0,0,956,2283,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,956,2283,0,0,0,0,0,0,0)
UserWait(1000)

DispatchPointer(0,0,0,402,440,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,402,440,0,0,0,0,0,0,0)

UserWait(1000)

DispatchPointer(0,0,0,342,974,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,342,974,0,0,0,0,0,0,0)

DispatchString(1234566)

UserWait(1000)

DispatchPointer(0,0,0,628,2028,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,628,2028,0,0,0,0,0,0,0)

UserWait(3000)

保存文件,名称为mytset。将脚本从电脑push到手机里。

adb push mytest /sdcard/

我将mytset脚本放到/sdcard/目录下,之后在电脑的终端上执行以下命令:

 MonkeyScript 执行命令:

adb shell monkey -f /sdcard/mytest -v 10 > /Users/zhaohui/Desktop/monkey.txt

1、adb shell mkdir /sdcard/script 在设备上创建script文件夹用于存放脚本

2、将本地脚本文件push到设备中上面创建的文件夹中。例如adb push /Users/userName/Desktop/testLogin空格/sdcard/script,/Users/userName/Desktop/testLogin就是你脚本在本地的存放路径。

3、执行

adb shell monkey -f /sdcard/script/你的脚本名称 –v –v 10 >C:\monkey.txt

>C:\monkey.txt为日志输出路径。

例子三:

1、启动APP

2、点击地址栏

3、删除原有地址

4、输入www.baidu.com

5、点击回车

6、点击回车

7、点击搜索框

8、输入字符串test

9、点击回车

10、点击搜索按钮

11、等待搜索结果

type=user
count = 1
speed = 1.0
start data >>LaunchActivity(com,android.browser,com.android.browser.BrowserActivity)
UserWait(1000)
DispatchPointer(10,10,0,200,100,1,1,-1,1,1,0,0)
DispatchPointer(10,10,1,200,100,1,1,-1,1,1,0,0)
DispatchPress(112)
DispatchString(www.baidu.com)
DispatchPress(66)
UserWait(1000)
DispatchPointer(10,10,0,300,400,1,1,-1,1,1,0,0)
DispatchPointer(10,10,1,300,400,1,1,-1,1,1,0,0)
UserWait(1000)
DispatchString(test)
UserWait(1000)
DispatchPress(66)
UserWait(1000)

10.3 执行脚本

1、adb shell mkdir /sdcard/script 在设备上创建script文件夹用于存放脚本

2、将本地脚本文件push到设备中上面创建的文件夹中。例如adb push /Users/userName/Desktop/testLogin空格/sdcard/script,/Users/userName/Desktop/testLogin就是你脚本在本地的存放路径。

3、执行

adb shell monkey -f /sdcard/script/你的脚本名称 –v –v 10 >C:\monkey.txt

>C:\monkey.txt为日志输出路径。

十一、MonkeyRunner介绍

https://www.jianshu.com/p/30532d06306b

MonkeyRunner工具使用Jpython(使用Java编程语言实现的Python)写出来的。MonkeyRunner是安卓SDK提供的功能。MonkeyRunner在Android_sdk中的位置:tools目录下。

MonkeyRunner 跟monkey没有任何关系。Monkey通过在设备直接运行adb shell命令来生成随机事件进行测试。MonkeyRunner通过API发送特定的命令和事件来控制设备。

MonkeyRunner提供了多个API,通过MonkeyRunner API可以编写一个Python程序来模拟操作控制Android设备App,测试其稳定性并通过截屏记录出现的问题。

MonkeyRunner工具主要设计用于在功能/框架级测试应用程序和设备。支持java脚本和python脚本。

11.1 环境搭建&启动:

安装好Android SDK后,配置MonkeyRunner环境变量(将MonkeyRunner的路径放入Path)。在cmd中输入MonkeyRunner出现如下显示内容说明安装成功,使用Ctrl+D退出。

11.2 MonkeyRunner API介绍&常用命令

MonkeyRunner主要分为三个类:

1、MonkeyRunner:它是一个MonkeyRunner程序提供工具方法的类,这个类提供了用于连接MonkeyRunner到设备或模拟器的方法,同时还提供了用于创建一个MonkeyRunner程序的用户界面以及显示内置帮助的方法。

2、MonkeyDevice:它是一个设备或模拟器的类,这个类提供了安装和卸载程序包、启动一个活动以及发送键盘或触摸事件到应用程序的方法,同时提供也可以用这个类来运行测试包。

3、MonkeyImage:它是一个截图对象的类,这个类提供了截图、将位图转换成各种格式、比较两个MonkeyImage对象以及写图像到文件的方法。

官方文档:http://www.android-doc.com/tools/help/monkeyrunner_concepts.html#

11.2.1 MonkeyRunner类

提供连接真机和模拟器、输入、暂停、警告框等方法

API 功能
alert() 警告框
choice() 选项列表框
help() API帮助文档
input() 输入
sleep() 暂停
waitFor Connection() 等待设备连接

常用方法:

from com.android.monkeyrunner import Monkeyrunner as mrprint("connect devices...")device=mr.waitForConnection(5,'127.0.0.1:62001')

1、alert 警告框

MonkeyRunner.alert(String message,String title,String okTitle)

message: 弹出对话框内容

title:对话框的标题栏显示内容,默认值为“Alert”

okTitle: 对话框的按钮,默认值为“OK"

 2、waitForConnection

等待设备连接,多个设备,需要指明哪个设备。

MonkeyRunner.waitForConnection(float timeout,string deviceId)

timeout: 等待超时时间,默认值为永久等待

deviceId:通过设备ID识别手机,如果只有一台手机,不需要输入。

11.2.2 MonkeyDevice类

提供安装和卸载程序包、开启activity、发送按键和点击事件、运行测试包等

API 功能
broadcastIntent() 发送广播
drag() 拖动
getProperty() 获取当前设备属性
getSystemProperty() 获取当前设备属性
installPackage() 安装应用
instrument 执行测试用例
press() 按键
reboot() 重启
removePackage() 删除指定Package
startActivity() 启动应用
touch() 点击

常用方法:

installPackage(string path)removePackage(string package)startActivity(string uri, string action, string data, string mimetype, iterable categories dictionary extras, component component, flags)
touch(integer x, integer y, integer type)

touch参数说明:

  • integer x:x坐标值
  • integer y:y坐标值
  • integer type:key event类型(如: DOWN:按下事件 UP:弹起事件 DOWN_AND_UP:按下弹起事件 )
drag(tuple start, tuple end, float duration, integer steps)

drag参数说明:

  • tuple start:拖拽起始位置,为tuple类型的(x,y)坐标点。
  • tuple end,拖拽终点位置,为tuple类型的(x,y)坐标点。
  • float duration,拖拽手势持续时间,默认为1.0s。
  • integer steps,插值点的步数,默认值为10。

11.2.3 MonkeyImage类

用来保存各种格式的测试截图,并可以进行图像对比

API 功能
convertToBytes() 转换图像格式
getRawPixel() 获取当前坐标像素元组
getRawPixellnt() 获取当前坐标像素值
sameAs() 图像对比
writeToFile() 保存图像文件到指定的文件路径
getSubImage() 截取子图像
takeSnapshot() 屏幕截图

常用方法:

  • takeSnapshot():屏幕截图
  • writeToFile():保存图像文件到指定的文件路径

编写Python测试代码:

# coding=utf-8 # 引入本程序所用到的模块
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage# 连接手机设备
device = MonkeyRunner.waitForConnection()# 截图
result = device.takeSnapshot()
# 将截图保存到文件
result.writeToFile('E:\\manage\\Test1_001.png', 'png')# 卸载APP
device.removePackage('com.baidu.searchbox')
print('Uninstall Success!')# 暂停5秒
MonkeyRunner.sleep(5)# 截图
result = device.takeSnapshot()
result.writeToFile('E:\\manage\\Test1_002.png', 'png')# 安装新的APP
device.installPackage(r'E:\Android_apk\baidusearch1006979t.apk')
print('Install Success!')# 暂停5秒
MonkeyRunner.sleep(5)# 截图
result = device.takeSnapshot()
# 将截图保存到文件
result.writeToFile('E:\\manage\\Test1_003.png', 'png')

十二、MonkeyRunner脚本实战

作者:Cyzhouke
链接:https://www.jianshu.com/p/30532d06306b

12.1、测试场景

使用MonkeyRunner连接设备,进行自动安装并启动APP,完成登录功能,并截图保存到指定目录下

12.2、思路分析

步骤:
1、连接设备
2、安装App
3、启动App
4、点击用户名,密码输入框,完成输入
5、点击登录
6、截图

12.3、代码(考研帮app)

下载考研帮apk

from com.android.monkeyrunner import MonkeyRunner as mrfrom com.android.monkeyrunner import MonkeyDevice as mdfrom com.android.monkeyrunner import MonkeyImage as mi#启动服务
print("-----connect devices-----")
device=mr.waitForConnection()
print("-----succeed start-----")print("-----install app-----")
device.installPackage(r"F:\kaoyan3.1.0.apk")
print("-----succeed install-----")print("-----start App-----")
package="com.tal.kaoyan"
activity="com.tal.kaoyan.ui.activity.SplashActivity"
runComponent=package+"/"+activity
device.startActivity(component=runComponent)mr.sleep(3) #等待#点击取消更新按键
print("-----click cancel update-----")
device.touch(726.2,1096.4,"DOWN_AND_UP")       #对取消更新按钮执行点击弹起操作
mr.sleep(3)#点击跳过
print("---click skip button---")
device.touch(982,69,"DOWN_AND_UP")             #对跳过按钮执行点击弹起操作
mr.sleep(3)#输入账号
print("input username and password")
device.touch(194,381,"DOWN_AND_UP")            #对用户名输入框执行点击弹起操作
mr.sleep(1)
device.type("zxw1234")                         #输入登录账号
device.touch(194,472,"DOWN_AND_UP")            #对密码输入框执行点击弹起操作
mr.sleep(1)
device.type("zxw123456")#点击登录
device.touch(550,628,"DOWN_AND_UP")
mr.sleep(3)print("-----screen shot-----")
screenshot=device.takeSnapshot()                #截屏
screenshot.writeToFile(r"C:\Users\k.zhou\Pictures\Saved Pictures\kyb.png","png")    #保存图片

十三、python GUI编程(tkinter)基于adb 编写安卓助手

工具exe资源下载地址:

pythonGUI编程,基于adb命令编写的安卓助手-Android工具类资源-CSDN下载

源码地址:

https://github.com/18713341733/PhoneAssistant

基于python+adb 编写的安卓助手工具。支持录屏、截图、日志抓取、性能数据查看等功能。目前的功能不是很完善,只是单纯的打个样儿。

大概就是这么一个页面

这个工具是很久之前用python2写的,虽然有点老,但是可以自己手动改改成python3

十四、内存泄漏分析

一、什么是内存泄露、内存溢出,与两者的区别联系

内存泄露 memory leak,是指程序在申请内存后无法释放已申请的内存空间,一次内存泄露危害可以忽略,但是内存泄露堆积后果很严重,无论多少内存迟早会被占光。

内存溢出 out of memory,是指程序在申请内存时没有足够的内存空间供其使用,出现内存溢出;比如申请了一个integer,但给他存了long才能存下的数,这就是内存溢出。

(MAX_VALUE = 0x7FFFFFFFFFFFFFFFL long的最大值/ MAX_VALUE = 0x7FFFFFFF integer的最大值)

memory leak会最终导致out of leak

二:内存泄露的检测工具的种类

1、开发工具Android studio

优点:a:可以很直观的看到应用占用内存波状图与实时内存数据;

b:可以实时查看应用的CPU使用情况;

c:实时查看APP运行日志;

d:截屏功能。

缺点:需要使用debug包连接使用

2、DDMS中VM Heap功能

优点:a:可以分析看到内存泄露出处;

b:可以实时查看应用的CPU使用情况;

c:实时查看APP运行日志;

d:截屏功能。

缺点:a:需要使用debug包连接使用

b:手机端APP性能变差,高概率导致app无响应

三:内存检测工具的使用方法:

Android studio的连接和使用:

1、打开android-studio-bundle-141.2288178-windows.exe安装包安装;

2、手机连接电脑,使用adb devices命令,打开devices视图,确认手机成功连接;

3、启动android studio,Tools->Android->勾选enable ADB integration;

步骤3详见如下附图一:

安卓应用测试MonkeyMonkeyScriptMonkeyRunnerpyhton性能工具脚本相关推荐

  1. .net core 压力测试 web性能工具

    先记录,后续慢慢研究 Apache JMeter ApacheBench (ab) Gatling k6 Locust West Wind WebSurge Netling Vegeta

  2. 性能工具之locust工具get与post请求

    最近在学习 locust 性能工具,发现locust性能工具脚本需要python基础才能写脚本,但是对于性能测试人员来说 python 是基本功夫. 在 locust 中get脚本怎么写,为了方便直接 ...

  3. jmeter脚本_性能工具之Jmeter脚本python启动

    背景 上一节是shell命令启动Jmeter,担心大家对shell脚本语法不是很熟悉,如果定制自己想要的恐怕不好弄,这次改用python启动脚本,在改造之前大家先了解下Jmeter线程组相关参数,这样 ...

  4. unixbench分析_UnixBench,Bench,SuperBench 和 Zbench 四种常用云服务器综合性能测评脚本工具的对比分析以及使用教程...

    君哥今天写了一篇不用脚本进行云服务器配置真伪鉴定,网络性能测评的文章,有童鞋询问有没有更为简单高效的测试方法呢?当然有.这篇文章以4核8G5M的阿里云服务器为例,分别采用 UnixBench. Ben ...

  5. 性能工具之Jmeter脚本python启动

    背景 上一节是shell命令启动Jmeter,担心大家对shell脚本语法不是很熟悉,如果定制自己想要的恐怕不好弄,这次改用python启动脚本,在改造之前大家先了解下Jmeter线程组相关参数,这样 ...

  6. fio工具测试硬盘性能

    云硬盘的性能如何衡量?一般使用以下几个指标对存储设备的性能进行描述: IOPS:每秒读/写次数,单位为次(计数).存储设备的底层驱动类型决定了不同的 IOPS. 吞吐量:每秒的读写数据量,单位为MB/ ...

  7. android o vts测试项,安卓官方测试工具vts

    安卓官方测试工具vts 之前在审计android hal层源码时注意到存在很多test文件,但是又不能直接使用. 谷歌肯定通过某种方式将他们集成到一起,通过搜索得知为vts vts简介 vts是谷歌给 ...

  8. 性能测试之脚本、工具、结果分析总结

    目录 1.脚本模板 2. 场景模板 性能测试工具选择 1. 数据建模工具 2. 脚本开发工具 3. 压力模拟工具 4. 性能监控工具 4.1 监控工具 4.2 监控平台 4.3 第三方监控云服务(AP ...

  9. 性能工具之 JMeter 使用 Python 脚本快速执行

    文章目录 一.前言 二.预备知识 1.Python 基础知识 2.JMeter 基础知识 三.Python 脚本 1.主要步骤 2.参考代码 四.使用说明 五.总结 一.前言 上篇文章 性能工具之 J ...

最新文章

  1. Java中switch对整型/字符型/字符串型具体实现细节
  2. wxWidgets:wxMouseEvent类用法
  3. 【rzxt】windows7怎么设置桌面背景 如何快速道下一个背景
  4. KAFKA介绍(分布式架构)
  5. java 接口编程_JAVA面向接口编程
  6. leetcode 滑动窗口小结 (一)
  7. 持续集成部署Jenkins工作笔记0013---配置远程触发构建的TOKEN值
  8. 2K分辨率下1070TI更换2080S能有多大提升,值得换吗?
  9. 中国***产业链正在形成 ***今年收入可超百亿
  10. adx-desc-adtype统计
  11. 【毕设教学】单片机控制步进电机
  12. WIN10系统蓝屏解决方法
  13. Flink快速回忆之Operators(运算符)
  14. 手机计算机国二支付,“刷手机”时代悄然来临 手机支付呼唤国家标准(二)...
  15. 2015美团算法工程师笔试、面试之旅
  16. igraph 牛刀小试
  17. 四百元左右有什么降噪耳机推荐?高性价比降噪耳机推荐
  18. 多态的含义、多态的作用及多态的详细代码实现
  19. Vertu手机决定采用Android系统
  20. 做c4d计算机配置,震惊!现在玩转C4D的电脑配置只要4000多就可以了!

热门文章

  1. 必须掌握的电脑快捷键
  2. oracle数据库停车管理系统,城市智能停车管理系统的设计与实现
  3. Spring依赖注入的几个注解
  4. 恶搞礼物“七夕青蛙”,有人靠这个叫唤服务盈利10w+
  5. macOS获取文件绝对路径的快捷键
  6. take android,Protake app下载-Protake 安卓版v1.0.7-PC6安卓网
  7. 创新型产品的需求发现
  8. 树莓派4B接4K60p显示器要点
  9. 彻底的清除 Office 以便重新安装
  10. 6.django笔记之orm