Android App压力测试(Monkey和ADB)
压力测试简介
压力测试被视为一种基础的质量保障措施,在每个重要软件开发项目中都是必要步骤。其基本思路较为简单:不依赖常规环境下的手动或自动执行方式,在计算机数量有限或系统资源紧张的情况下进行功能模拟。通常用于执行压力测试所需的资源包括内部内存、CPU可用度、存储空间和网络带宽。为了降低对硬件和软件资源的消耗,在某些情况下可使用专门的功能模拟工具(如压力器)来辅助分析。
Monkey简介
以上改写遵循了所有给定的规则
- 猴子测试目标:通过模拟用户的随机操作行为来揭示应用程序中的崩溃现象,并减少应用程序崩溃频率。
- 猴子Test范围预期:除了某些系统参数设置之外,在当前待分析的应用场景内进行重点测试;同时还可以加入断点调试测试。
- 当前阶段我们仅能识别出崩溃事件的发生情况;而具体的复现和解决问题工作仍需依赖开发团队的投入。
- 全面揭示所有崩溃现象同样存在困难;即便如此,在实际测试中我们仍然无法完全消除所有崩溃风险。
Monkey作为Android SDK的一个内置工具,在支持Android平台的设备上提供了一种基于命令行界面的自动化测试解决方案。它可以在模拟器或真实设备上运行。它通过在系统中发送看似随机但实际上精心设计的用户事件序列(包括但不限于键盘输入、触控屏操作以及手势识别等),模拟不同场景下的用户体验,并对开发中的应用程序进行压力性能测试。Monkey提供了丰富的配置选项,默认情况下已将这些设置划分为四大类别:
- 基本配置参数中包含指定要测试的具体事件数量
- 运行约束参数设定仅针对单个包进行测试
- 定义事件类型及发生频率
- 设置调试控制参数
当Monkey运行时,在此过程中会生成事件,并将这些事件传递给相应的系统。此外,在测试环境中Monitor还会监控系统的状态,并针对以下三种情况进行特别处理(例如自动终止):
- 当限制monkey在指定一组特定的包上运行时,系统会监测其尝试迁移至其他包的操作,从而阻止该操作.
- 当应用程序发生崩溃或者接收任何不可控异常时,monkey系统将终止运行并报告错误.
- 当出现应用程序不响应(ANR:application not responding)错误时,monkey系统将终止运行并报告错误.
根据预设的不同层级的反馈机制,在Monkey系统中能够检索到相应的执行过程记录以及生成的相关事件数据。
- Monkey程序作为Android系统的预装应用采用Java语言实现,并在其存储位置中指定安装路径为:Android框架目录下的monkey.jar。
- Monkey.jar程序通过名为"monkey"的Shell脚本启动运行,在Android系统的运行时目录中指定指定目录为:/system/bin/monkey,并负责与设备操作相关的各种操作。
通过这种方式,在CMD窗口中运行ADB shell命令 monkey {+命令参数}就能完成Monkey测试。
ADB简介
Android Debug Bridge(ADB)常被用作调试工具。其主要功能是作为沟通本地开发环境与Andriod设备的方法,在实际操作中帮助开发者定位和修复应用问题。也可简单理解为一个用于调试应用的工具。
ADB作为Android SDK中的一个重要工具,在实际应用中具有广泛的作用。该工具允许开发者直接操作和管理Android模拟器或真实的设备(例如G1手机)。其主要功能包括启动应用程序、启动服务以及连接设备等基本操作。ADB是一个非常有力的工具,在开发过程中能够显著提升效率。
- 在设备上执行shell命令(命令行界面)
- 配置模拟器或设备的端口映射设置
- 在计算机与设备之间转移文件
- 将本地APK应用添加至模拟器或Android设备
ADB是一种客户端至服务器的应用程序,在其中客户端指的是用于操作者的个人电脑;而相应的服务端则对应的是移动设备(如android设备)。
异常测试结果
压力测试结果如下
配置ADB环境变量
导航至SDK所处的目录,在其中定位至SDK位置。随后将...平台工具与工具包整合至变量空间,并将这些整合后的资源纳入系统路径环境中。这样一来,在执行ADB指令时会更加便捷。
压力测试实践
Step 1: 在手机开发者设置中配置USB调试连接
Step 2: 使用ADB命令验证设备与电脑已建立成功通信
Step 3: 执行ADB安装指定的应用程序包名
Step 4: 向ADB shell界面输入monkey指令运行压力测试
Step 5: 使用ADB日志工具提取应用启动标识信息
Step 6: 向ADB shell输入monkey-p指令模拟用户体验场景
Monkey高级参数的应用
- 参数:
- p
通过该选项可以限定应用启动范围。使用此选项时可以指定期望支持的一个或多个应用程序(App)。一旦选定这些应用,则monkey将会仅允许系统运行选定的应用程序。如果未指定期望支持的应用,则monkey则能够自由地运行设备中的所有应用程序。
指定一个应用包: adb shell monkey -p com.htweather 100
- 具体指定了多个应用程序的 package name 后执行以下操作:
在终端中输入 adb shell monkey 并分别指定 -p com.ht(weather)、–p com.ht(pdfreader) 和 -p com.hu(photowidgets) 三个 package name 后ward,并执行 100 次猴子行为。 - 无需指定应用程序的 package name 后执行以下操作:
在终端中输入 adb shell monkey 并执行 100 次猴子行为;Monkey会自动启动随机运行的应用程序并发送相应的事件。 - 为了全面了解设备运行的所有应用程序及其对应的 package names,请在CMD窗口中输入以下命令:
adb shell
cd data/data
ls
代码解释
- 参数: –throttle <毫秒>
用于指定用户操作(即事件)间的时延,单位是毫秒;
示例:adb shell monkey -p com.ht.weather –throttle 3000 100
代码解释
参数选项:-s 用于配置伪随机数生成器的种子(seed)值。当设置相同的seed值时,在两次Monkey测试中所生成的事件序列也会保持一致。
示例:
Monkey 测试1:adb shell monkey -p com.ht.weather –s 10 100
Monkey 测试2:adb shell monkey -p com.ht.weather –s 10 100
代码解释
两次测试的结果相仿,在原因上是因为复制了相同的用户行为模式(每一次行为都严格按照预先设定的执行顺序来进行)。这种行为模式虽然采用了随机算法生成(即一系列按照固定执行顺序执行的行为),但在设定相同的种子值后,则能确保生成的行为模式完全一致。因此此行为模式可视为伪随机性。
事件: [标识符] + 事件类别 + 事件类别比例表示为每种类别事件所占比重(在Monkey事件序列中, 该类事件所占比重占总事件所占比重的百分比)
–pct-touch +百分比
设置触控事件的比例(触控事件指的是上下滑动动作,在屏幕上某个固定区域的操作)
adb shell monkey -p com.ht.weather --pct-touch 10 1000
代码解释
–pct-motion + 百分比
确定动作事件的比例(包括一次down事件、一系列伪随机事件和一次up事件构成)
adb shell monkey -p com.ht.weather --pct-motion 20 1000
代码解释
–pct-trackball + 百分比
优化轨迹事件占比比例(这些轨迹事件通常由单一或多个随机运动构成,并偶尔伴随点击操作)
adb shell monkey -p com.ht.weather --pct-trackball 30 1000
代码解释
–pct-nav + 百分比
优化基础方向事件所占比例(其中基础方向事件由方向输入设备提供的上下左右四个方向控制组成)
adb shell monkey -p com.ht.weather --pct-nav 40 1000
代码解释
–pct-majornav + 百分比
优化核心导航事件的比例(这些操作通常会触发图形界面中的相应响应,例如,在5-way键盘中居中键用于快速导航,在回退键用于返回上一级别,在菜单键用于进入子菜单)
adb shell monkey -p com.ht.weather --pct-majornav 50 1000
代码解释
–pct-syskeys +百分比
设置"系统"按键操作的占比(其中这些按钮通常被保留下来,并由系统所采用使用, 比如Home键、Back键、StartCall按钮、EndCall键以及音量控制键等)
adb shell monkey -p com.ht.weather --pct-syskeys 60 1000
代码解释
–pct-appswitch + 百分比
设置启动Activity的比例,在每隔一定时间后会自动触发一次startActivity()方法的调用,并以此确保整个包中的所有活动都能被完全覆盖
adb shell monkey -p com.ht.weather --pct-appswitch 70 1000
代码解释
–pct-anyevent + 百分比
修改其他类别事件的比例。此比例涵盖了所有其他类型的事件,例如:键盘操作,非常用设备按钮等。
adb shell monkey -p com.ht.weather --pct-anyevent 100 1000
代码解释
指定多个类型事件的百分比:
adb shell monkey -p com.ht.weather --pct-anyevent 50 --pct-appswitch 50 1000
代码解释
该参数用于控制当应用程序发生Force Crash错误时Monkey的行为。当此参数被启用时,即使应用程序崩溃也不会停止发送事件,事件将一直发送直到计数完成。
示例1:adb shell monkey -p com.ht.weather --ignore-crashes 1000
代码解释
在测试过程中, 即使Weather程序发生崩溃, Monkey也会持续不断地发送事件直至事件总数达到1,000时.
示例2:adb shell monkey -p com.ht.eather 1000
代码解释
测试过程中,如果Weather程序崩溃,Monkey将会停止运行。
参数:–ignore-timeouts 该标志位允许开发者配置一个机制来决定在检测到应用程序出现ANR(Application No Responding)错误时Monkey的行为
Monkey Script
adb shell monkey -f <Scriptfile> <event-count>
代码解释
ScriptFile是由编写完成的脚本文件。Event-Count代表脚本运行时的计数器数值。第1点:轨迹球事件。
DispatchTrackball(long downtime, long eventide, int action, float x, float y, float pressure, float size, int metastate, float xprecision, float yprecision, int device, int edgeflags)
代码解释
- long downtime 表示按压所持续的时间长度
- long event duration 表示事件发生所持续的时间
- int action 表示具体的操作动作分为两种情况:一种是触发电器(对应数值为0),另一种是断开触电(对应数值为1)
- float x, float y 表示两个坐标轴上的坐标点
- float pressure 压力值的大小范围限定在0至1之间
- float size 摩擦强度度量值,在0至1范围内变化
- int metastate 触点状态标识符
- float xprecision X轴坐标的精确度参数
- float yprecision Y轴坐标的精确度参数
- int device 设备源标识符
- int edgeflags 超出屏幕边缘的情况标志位
2.点击事件
DispatchPointer(long downtime, long eventide, int action, float x, float y, float pressure, float size, int metastate, float xprecision, float yprecision, int device, int edgeflags)
代码解释
3.输入字符串事件
DispatchString(String text)
代码解释
4.启动应用
LaunchActivity(package, Activity)
代码解释
5.等待事件
UserWait(1000)
代码解释
6.按键事件
DispatchPress(int keycode) #keycode 66 回车键
代码解释
Monkey Script测试案例
- 打开UCAPP程序
- 单击百度按钮
- 单击输入字段
- 在输入字段中输入搜索关键词
- 按下键盘上的Enter键(回车键)
- 单击页面上的搜索按钮
- 等待计算结果的显示
typ=user
count=10
speed=1.0
start data >>
LaunchActivity(com.UCMobile,com.UCMobile.MainActivity)
UserWait(2000)
DispatchPointer(10,10,0,280,740,1,1,-1,1,1,0,0)
DispatchPointer(10,10,1,280,740,1,1,-1,1,1,0,0)
UserWait(2000)
DispatchPointer(10,10,0,280,700,1,1,-1,1,1,0,0)
DispatchPointer(10,10,1,280,700,1,1,-1,1,1,0,0)
DispatchString(test)
UserWait(1000)
DispatchPress(66)
UserWait(1000)
DispatchPointer(10,10,0,880,600,1,1,-1,1,1,0,0)
DispatchPointer(10,10,1,880,600,1,1,-1,1,1,0,0)
UserWait(6000)
代码解释
位于SDK目录中的tools夹子里有一个名为uiautomatorviewer.bat的工具,默认情况下它无法直接访问设备上的信息。这款名为UI Automator Viewer的应用程序是一款用于查看手机界面布局的强大工具,并且能够通过特定配置与外部程序进行交互。当应用首次启动时,在其Android manifest文件中应设置exported属性为true,并且该应用必须能够从系统资源中获取实时设备信息才能正常运行。这款应用能够被外部应用程序调用和操作,并且支持通过特定接口与开发环境进行交互配置
adb shell
cd ../../
monkey -f xx.script <event-count>
代码解释
adb shell monkey -f ../../xx.script <event-count>
代码解释
两种都可执行.script文件
ADB命令大全
1.查看设备
adb devices
代码解释
此命令用于查询当前连接中的设备信息。当您将此命令输入时,连接至计算机上的Android设备或模拟器将展示相关信息。
2.安装软件
adb install <apk文件路径>
代码解释
这个命令将指定的apk文件安装到设备上。
3.卸载软件
adb uninstall <软件名>
adb uninstall -k <软件名>
代码解释
如果加 -k 参数,为卸载软件但是保留配置和缓存文件。
4.登录设备shell
adb shell
adb shell <command命令>
代码解释
该命令会被设置为登录设备的shell界面。在后添加command指令等同于远程执行设备上的操作。
5.从电脑上发送文件到设备
adb push <本地路径> <远程路径>
代码解释
用push命令可以把本机电脑上的文件或者文件夹复制到设备(手机)。
6.从设备上下载文件到电脑
adb pull <远程路径> <本地路径>
代码解释
用pull命令可以把设备(手机)上的文件或者文件夹复制到本机电脑。
7.显示帮助信息
adb help
代码解释
这个命令将显示帮助信息。
8.在命令行中查看LOG信息
adb logcat -s 标签名
代码解释
9.启动Activity
adb shell am start -n 包名/包名 + 类名
代码解释
10.列出手机装的所有app的包名
adb shell pm list packages
代码解释
11.列出系统应用的所有包名
adb shell pm list packages -s
代码解释
12.列出除了系统应用的第三方应用包名
adb shell pm list packages -3
代码解释
13.使用 findstr 来过滤
adb shell pm list packages | findstr qq
代码解释
14.清除应用数据与缓存
有些时候我们测试需要清除数据与缓存,则需要用到如下命令:
adb shell pm clear <packagename>
代码解释
15.强制停止应用
adb shell am force-stop <packagename>
代码解释
16.查看日志
adb logcat
代码解释
17.重启
adb reboot
代码解释
18.获取序列号
adb get-serialno
代码解释
19.获取 MAC 地址
adb shell cat /sys/class/net/wlan0/address
代码解释
20.查看设备型号
adb shell getprop ro.product.model
代码解释
21.查看 Android 系统版本
adb shell getprop ro.build.version.release
代码解释
22.查看屏幕分辨率
adb shell wm size
代码解释
23.查看屏幕密度
adb shell wm density
代码解释
结束语:本文仅用来学习记录,参考查阅。
