【ADB基础】ADB及Monkey测试

【ADB基础】ADB及Monkey测试

什么是monkey

Monkey 是Android SDK提供的一个命令行工具,可以简单方便的发送伪随机的用户事件流,对Android APP做压力(稳定性)测试。主要是为了测试app是否存在无响应和崩溃的情况。

monkey命令说明

monkey 测试命令使用及详细说明

常用命令

语法:adb shell monkey -p 包名 (-s 种子数) 事件 调试选项 -v 执行次数 >日志路径

-p # 包名

-v # 反馈信息的级别,共三级(-v -v -v)

-s(seed) # 随机数种子(随机种子数seed值是一个用于生成伪随机数的起始值)

"""

seed的作用和重要性

Seed值在Monkey测试中起着至关重要的作用。它决定了随机事件生成的顺序和结果。如果两次Monkey测试使用相同的seed值,那么它们生成的事件序列将会完全相同。这意味着,通过使用相同的seed值,可以复现之前测试的结果,这对于调试和验证软件的稳定性非常有用‌

"""

--throttle 300 # 延时300ms(实际用户操作的最快300毫秒左右一个动作事件,所以可以设置为300毫秒)

--randomize-throttle 300 # 随机延时300ms

--ignore-crashes # 忽略崩溃

--ignore-timeouts # 忽略反应时间过长(忽略超时 系统ANR时,继续发送事件)

--ignore-native-crashes # 忽略本地代码导致的崩溃

--ignore-security-exceptions # 忽略安全异常

--pct-touch # 触摸事件百分比

--pct-motion # 滑动事件百分比(在屏幕某处按下、随机移动、抬起的操作)

192000 # 事件数量

> 1.txt # // 输出日志

其他命令

--pct-pinchzoom # 缩放事件百分比

--pct-trackball # 轨迹球事件百分比(滚动球事件---不常使用参数,现在手机基本没有滚动球)

--pct-rotation # 屏幕旋转事件百分比

--pct-nav # 基本导航事件百分比(点击键盘上下左右按键的操作---不常使用参数,现在手机基本没有方向键)

--pct-majornav # 主要导航事件百分比(5-way 键中的KEYCODE_DPAD_CENTER、KEYCODE_MENU键---不常使用参数,现在手机基本没有这几个实体键)

--pct-syskeys # 系统事件百分比(Home、Back、startCall、endCall、volumeControl)

--pct-appswitch # Activity启动事件百分比(appswitch 切换Activity事件:执行一个startActivity()操作)

--pct-flip # 键盘翻转事件百分比

--pct-anyevent # 其他事件百分比(除了上述事件之外的其他事件)

实例:(touch事件及motion事件各执行10000次)

adb shell monkey -p com.IGRS.shtmeeting --throttle 300 --pct-touch 50 --pct-motion 50 --ignore-crashes --ignore-timeouts --ignore-native-crashes --ignore-security-exceptions -v -v -v 200000 >D:\Log\monkey_log\2020_09_28.txt

Monkey终止命令

在命令执行过程中,按 Ctrl+C 可以退出,但不代表monkey停止 (包括运行monkey时拔掉数据线,仍然未停止),如果需要停止monkey可以杀死该进程 id,如下命令:

# 停止前先查看当前系统,monkey在跑的 进程id

adb shell ps | findstr monkey

执行结果:

# 强制杀死在跑的monkey进程

adb shell kill <进程pid>

执行结果:

monkey的日志分析

在文件中查找failed失败 error错误 crashes崩溃 timeouts超时 exception异常 ANR等字段

正常:

monkey测试顺利执行完成,在log的最后,会打印当前执行时间的次数和所花费的时间。Monkey finished代表执行完成

异常:(日志内搜索异常关键字)

无响应-Anr问题:在日志中搜索“ANR”

在日志中搜索“CRASH”

其他问题:在日志中搜索”Exception”

日志中异常实例

ANR:程序无响应

###########操作无响应的问题,主要表现在Monkey运行过程中,出现某功能无响应,提示是否“强制关闭“或“等待“##########

// NOT RESPONDING: com.android.soundrecorder (pid 1931)

ANR in process: com.android.soundrecorder (last in com.android.soundrecorder)

Annotation: keyDispatchingTimedOut

CPU usage:

Load: 8.24 / 8.41 / 8.25

CPU usage from 35911ms to 83ms ago:

com.android.soundrecorder: 4% = 3% user + 0% kernel / faults: 997 minor 43 maj

or

mediaserver: 2% = 2% user + 0% kernel / faults: 267 minor 3 major

android.process.media: 2% = 0% user + 1% kernel / faults: 563 minor 194 major

system_server: 1% = 1% user + 0% kernel / faults: 1279 minor 5 major

com.cootek.touchpal: 0% = 0% user + 0% kernel / faults: 180 minor 1 major

sensorserver_ya: 0% = 0% user + 0% kernel / faults: 47 minor 1 major

mmcqd: 0% = 0% user + 0% kernel

app_process: 0% = 0% user + 0% kernel / faults: 203 minor 1 major

com.fihtdc.brservice: 0% = 0% user + 0% kernel / faults: 29 minor

kswapd0: 0% = 0% user + 0% kernel

com.android.settings: 0% = 0% user + 0% kernel / faults: 266 minor

port-bridge: 0% = 0% user + 0% kernel / faults: 19 minor

rpcrouter: 0% = 0% user + 0% kernel

com.android.mms: 0% = 0% user + 0% kernel / faults: 135 minor 8 major

TOTAL: 13% = 8% user + 4% kernel + 0% iowait

procrank:

PID Vss Rss Pss Uss cmdline

1209 35368K 25376K 15283K 14036K system_server

1342 32788K 24596K 14899K 14136K android.process.acore

……

// procrank status was 0

anr traces:

// meminfo status was 0

** System appears to have crashed at event 59034 of 5000000 using seed 0

CRASH:程序崩溃闪退

NullPointerException

**************************************************************************

// CRASH: android.process.acore (pid 1339)

// Short Msg: java.lang.NullPointerException

// Long Msg: java.lang.NullPointerException

// Build Label: android:FIH/msm7627_surf/msm7627_surf/F0X:1.6/DONUT/0001_0_020:e

ng/release-keys

// Build Changelist: -1

// Build Time: 1271397239

// ID:

// Tag: AndroidRuntime

// java.lang.NullPointerException:

// at com.android.launcher.LauncherAnimator.ScrollAnimate3dRotate.drawFrame(ScrollAnimate3dRotate.java:275)

// at com.android.launcher.Workspace.dispatchDraw(Workspace.java:605)

// at android.view.ViewGroup.drawChild(ViewGroup.java:1524)

// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)

// at com.android.launcher.DragLayer.dispatchDraw(DragLayer.java:258)

// at android.view.ViewGroup.drawChild(ViewGroup.java:1524)

// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)

// at android.view.View.draw(View.java:6329)

// at android.widget.FrameLayout.draw(FrameLayout.java:352)

// at android.view.ViewGroup.drawChild(ViewGroup.java:1526)

// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)

// at android.view.View.draw(View.java:6329)

// at android.widget.FrameLayout.draw(FrameLayout.java:352)

// at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1901)

// at android.view.ViewRoot.draw(ViewRoot.java:1333)

// at android.view.ViewRoot.performTraversals(ViewRoot.java:1098)

// at android.view.ViewRoot.handleMessage(ViewRoot.java:1618)

// at android.os.Handler.dispatchMessage(Handler.java:99)

// at android.os.Looper.loop(Looper.java:123)

// at android.app.ActivityThread.main(ActivityThread.java:4203)

// at java.lang.reflect.Method.invokeNative(Method.java:-2)

// at java.lang.reflect.Method.invoke(Method.java:521)

// at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)

// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)

// at dalvik.system.NativeStart.main(NativeStart.java:-2)

** System appears to have crashed at event 7908 of 5000000 using seed 0

OutOfMemoryError

#####低内存异常,抛出OutOfMemoryError异常或者是通过kill process 来杀掉部分进程以释放内存空间,当然如果被kill点关键的进程的话,也就可能导致部分应用会自动的退出。出现该情况时,主要是在进行频繁的进行大量的操作导致的#############

// CRASH: com.android.elastos.backup (pid 1581)

// Short Msg: bitmap size exceeds VM budget

// Long Msg: java.lang.OutOfMemoryError: bitmap size exceeds VM budget

// Build Label: android:FIH/msm7627_surf/msm7627_surf/F0X:1.6/DONUT/0001_0_020:eng/release-keys

// Build Changelist: -1

// Build Time: 1271397239

// ID:

// Tag: AndroidRuntime

// java.lang.OutOfMemoryError: bitmap size exceeds VM budget

// at android.graphics.Bitmap.nativeCreate(Bitmap.java:-2)

// at android.graphics.Bitmap.createBitmap(Bitmap.java:464)

// at android.graphics.Bitmap.createBitmap(Bitmap.java:431)

// at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:336)

// at android.widget.AbsListView.preScaleBitmapBG(AbsListView.java:2354)

// at android.widget.AbsListView.draw(AbsListView.java:2365)

// at android.view.ViewGroup.drawChild(ViewGroup.java:1526)

// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)

// at android.view.View.draw(View.java:6329)

// at android.view.ViewGroup.drawChild(ViewGroup.java:1526)

// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)

// at android.view.View.draw(View.java:6329)

// at android.widget.FrameLayout.draw(FrameLayout.java:352)

// at android.view.ViewGroup.drawChild(ViewGroup.java:1526)

// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)

// at android.view.View.draw(View.java:6329)

// at android.widget.FrameLayout.draw(FrameLayout.java:352)

// at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1901)

// at android.view.ViewRoot.draw(ViewRoot.java:1333)

// at android.view.ViewRoot.performTraversals(ViewRoot.java:1098)

// at android.view.ViewRoot.handleMessage(ViewRoot.java:1618)

// at android.os.Handler.dispatchMessage(Handler.java:99)

// at android.os.Looper.loop(Looper.java:123)

// at android.app.ActivityThread.main(ActivityThread.java:4203)

// at java.lang.reflect.Method.invokeNative(Method.java:-2)

// at java.lang.reflect.Method.invoke(Method.java:521)

// at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)

// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)

// at dalvik.system.NativeStart.main(NativeStart.java:-2)

** System appears to have crashed at event 143290 of 100000000 using seed 0#

monkey测试顺利完成,日志最后会有monkey finished标识

Monkey测试pass或fail判断1)Monkey finished打开LOG,查看log的最下端,是否有类似以下字段

日志搜索”CRASH”字段,如果搜索到有结果,则表明有进程出现问题,测试不通过。

CRASH: com.onekchi.downloadmanager (pid 12919)

ANR

在Log中搜素该字段,如果有搜索有结果,则表示测试过程中,测试对象出现了无响应的现象,因此测试不通过。--throttle <毫秒>值建议为500

Exception

崩溃问题:在日志中搜索“Exception”,快速定位到关键事件信息。

屏蔽设备功能

// 隐藏手机的状态栏

adb shell settings put global policy_control immersive.full=*

// 开启手机状态栏

adb shell settings put global policy_control null

// 屏蔽音量键

--pct-syskeys 0

adb logcat的日志和monkey命令日志的区别

adb monkey日志是记录monkey命令在手机APP操作的事件。

adb logcat日志是记录手机系统在运行app时有什么异常的事件。

相关推荐

电脑屏幕自动变色原因及解决方法
000-365 bet

电脑屏幕自动变色原因及解决方法

📅 08-29 👁️ 9483
粉丝要泡多长时间?不同粉丝怎么泡才好吃?建议弄明白了再买
dnf哪个角色技能不墨迹
bt365体育官网育

dnf哪个角色技能不墨迹

📅 01-31 👁️ 6178