adb系列(1-3)-monkey
monkey是android 系统自带的一个命令行工具,可以向被测应用程序发送伪随机的用户事件流(如按键、触屏、滑动等操作),实现对应用程序进行测试的目的。
monkey测试也叫猴子测试,是指测试时可以像好奇的猴子一样,不停的对应用程序进行随机操作,以便验证应用程序的稳定性和健壮性。因此,monkey测试是软件稳定性,健壮性的测试工具
下面是monkey提供的一些参数:
参数: 事件相关参数表: -s <seed> 3这个参数是伪随机数生成器的种子值,如果用相同的随机种子值再次运行相同的monkey命令时,前、后两次执行的操作事件序列相同,也就是相同的操作。 --throttle <milliseconds> 这个参数是设定在两个事件之间插入一个固定延时,它可以减缓Monkey的执行速度。如果您不指定选项,Monkey将不会被延迟,事件将尽可能快地生产和发送消息。 --pct-touch <percent> 这个参数是设定触屏事件生产的百分比,触屏事件是一个有手指按下、抬起事件的操作。 --pct-motion <percent> 这个参数是设定滑动事件生成的百分比,滑动事件是一个先在某一个位置手指按下,滑动一段距离后再抬起手势的操作。 --pct-trackball <percent> 这个参数是设定轨迹球事件生成的百分比,轨迹球事件是包含一系列随机移动和单击事件的操作。 --pct-nav <percent> 这个参数是设置基本的导航事件的百分比,基本导航事件的模拟方向性设置输入向上、向下、向左、向右的操作。 --pct-majornav <percent> 这个参数是设定主要导航事件的百分比,主要导航事件通常是导致UI产生回馈事件,如:单击BACK键,单击MENU键。 --pct-syskeys <percent> 这个参数是设定系统按键事件的百分比,系统按键是指这些按键通常被保留,由系统使用,如HOME,BACK,拨号,挂断及音量控制键。 --pct-appswitch <percent> 这个参数是设定启动活动事件的百分比,在随机的一定间隔后,Monkey就会执行一个startActivity()函数尽可能多的覆盖包中全部活动。 --pct-anyevent <percent> 这个参数是设定其他类型事件的百分比,如普通的按键消息,不常用的设备按钮事件等。 约束条件: -p <运行的包名列表> 这个参数是设定一个或几个包名,monkey将只允许系统启动这些包里的活动,如果您的应用程序还需要访问其他包里的活动,如选择一个联系人,那也需要在此同时指定联系人所在应用的包名。 要指定多个包时,需要使用多个“-p”选项,每个“-p”选项只能用于一个包。 -c <意图的分类> 这个参数是指定意图的分类,这样monkey只会启动可以处理这些种类的意图的活动。如果没有设置这个选项,monkey则只会启动带有Intent.CATGORY_LAUNCHER 和Intent.CATEGORY_MONKEY。 与“-p”参数类似,要指定多个类别,需要使用多个“-c”选项,每个“-c”选项只能用于一个类别。 调试选项: --dbg-no-events 若指定了该参数,monkey将会执行初始启动,进入到一个测试Activity,不会再进一步生产事件。为了得到最佳结果,把它与“-v”,“-p”和“--throttle”等参数一起使用,并让monkey运行30秒或更长时间, 从而可以让我们观测到应用程序所调用的包与包之间的切换过程。 --hprof 若指定了该参数,monkey会在发送事件序列的前、后,生成性能分析报告。通常会在“data/misc”目录下生成一个5MB左右大小文件。 --ignore-crashes 通常情况下,monkey会在待测应用程序崩溃或发生任何异常后停止运行。若指定了该参数,则monkey将会在产生异常后,继续向系统发送事件,直到指定的事件消息全部完成为止。 --ignore-timeouts 通常情况下,当应用程序发生任何超时错误(如“Application Not Responding” 对话框)时,monkey将停止运行,若指定了该参数,则monkey将会在产生错误消息后,继续向系统发送事件,直到指定的事件 消息全部完成为止。 --igone-security-exceptions 通常情况下,monkey会在被测应用程序发生权限方面的错误时停止运行。若指定了该参数,则monkey将继续向系统发送事件,直到指定的事件消息全部完成为止。 --kill-process-after-error 通常情况下,当monkey由于一个错误而停止时,出错的应用程序就继续处于运行状态。当设置了此选项时,它将会通知系统停止发生错误的进程(注意:当monkey正常执行完毕后,它不会关闭所启动的应用,设备依然保留 其最后接收到的消息状态,所以建议大家在执行命令以后为保持应用的初始状态,需手动或者脚本程序已经打开的应用进行关闭)。 --monitor-native-crashes 监视由android C/C++ 代码部分引起的崩溃,若同时指定了 --kill-process-after-error 参数,则整个系统将会关机。 --wait-dbg 启动monkey后,先中断其运行,等待调式器和它相连接。
示例讲解:
-s 指定随机种子大小 命令:adb shell monkey -p com.xxx.xxx -v 100 -s的参数值为100,表明monkey对应用程序com.xxx.xxx一共发送100个随机操作事件。第一次执行和第二次执行该命令时,操作的事件顺序是一样的,因为-s的参数都是100,产生的随机事件序列的顺序也是一样。
-p 指定运行的应用程序 命令:adb shell monkey -p com.xxx.xxx -p com.android.calendar 200 有两个-p参数,说明monkey同时启动两个应用程序,并对这两个应用程序同时进行200个随机操作事件。
-throttle 指定各个随机事件之间的延时时间,单位:毫秒 命令:adb shell monkey -p com.xxx.xxx --throttle 3000 100 --throttle 参数值为3000毫秒,也就是每个事件操作的时间间隔为3秒,3秒后进入下一个事件操作。
--pct-touch <percent> 用于设定触屏事件生成的百分比 命令:adb shell monkey --pct-touch 50 -p com.xxx.xxx --throttle 3000 100 --pct-touch 50 表示设定触屏事件的占比为50%。
--pct-motion <percent> 用于设定滑动事件生成的百分比 命令:adb shell monkey --pct-motion 50 -p com.xxx.xxx --throttle 3000 100 --pct-motion 50 表示设定滑动事件的占比为50%
--pct-trackball <percent> 用于设定轨迹球事件的百分比 命令:adb shell monkey --pct-trackball 50 -p com.xxx.xxx --throttle 3000 100 -pct-trackball 50 表示设定轨迹球事件的占比是50%
--pct-nav <percent> 用于设定设备向上、向下、向左、向右事件的百分比 命令:adb shell monkey --pct-nav 60 -p com.xxx.xxx 100 --pct-nav 50 表示设置控制设备操作向上、向下、向左、向右的比例占比是60%。
--pct-majornav <percent> 用于控制设备主要导航事件,如单击BACK键,单击MENU键的百分比 命令:adb shell monkey --pct-majonav 70 -p com.xxx.xxx 200 --pct-majornav 70 表示设置控制设备主要导航事件,打击BACK键,单击MENU键的占比是70%。
--pct-syskeys <percent> 用于控制设备系统按键事件,如home、back、拨号、挂断及音量事件生成的百分比 命令:adb shell monkey --pct-syskeys 50 -p com.xxx.xxx 100 -pct-syskeys 50 表示设置控制系统按键事件的占比为50%。
--pct-appswitch <percent> 用于设置启动活动事件的百分比 命令:adb shell monkey --pct-appswitch 60 -p com.xxx.xxx 500 表示设置主要覆盖包中60%的活动
--pct-anyevent <percent> 用于设置其他类型事件的百分比 命令:adb shell monkey --pct-anyevent 50 -p com.xxx.xxx 500 表示其中普通的按键消息、不常用的设备按钮事件等占50%
--hprof 用于记录monkey在执行前、后的性能数据 命令:adb shell monkey --hprof -p com.xxx.xxx 5000 表示在monkey发送事件序列的前、后,生成性能分析报告。通常会“/data/misc”目录下生成一个5MB大小左右的文件。
--ignore-crashes 用于设置monkey运行时,待测程序崩溃或发生异常后,是否需要继续执行 命令:adb shell monkey --ignore-crashes -p com.xxx.xxx 5000 表示在monkey执行事件操作过程中,如果发生了程序崩溃或异常,依然继续执行剩余的操作
--ignore-timeout 用于设置monkey运行时,待测程序出现超时,是否需要继续执行 命令:adb shell monkey --ignore-timeout -p com.xxx.xxx 5000 表示在monkey执行事件操作过程中,如果出现超时(Application Not Responding),monkey依然执行剩余的操作
--ignore-security-exceptions 用于设置monkey运行时,出现一些访问权限问题,是否需要继续执行 命令:adb shell monkey --ignore-security-exceptions -p com.xxx.xxx 5000 表示在monkey运行时,出现证书许可证错误或网络许可错误等情况,monkey依然继续执行剩余的操作
Monkey测试结果分析
初步分析方法
Monkey测试出现错误后,一般的查错步骤为以下几步:
1、找到是monkey里面的哪个地方出错
2、查看Monkey里面出错前的一些事件动作,并手动执行该动作
3、若以上步骤还不能找出,可以使用之前执行的monkey命令再执行一遍,注意seed值要一样--复现
一般的测试结果分析:
1、ANR问题:在日志中搜索“ANR”
2、崩溃问题:在日志中搜索“Crash”
3、 Exception
4、 GC
详细分析monkey日志
将执行Monkey生成的log,从手机中导出并打开查看该log;在log的最开始都会显示Monkey执行的seed值、执行次数和测试的包名。
首先我们需要查看Monkey测试中是否出现了ANR或者异常,具体方法如上述。
然后我们要分析log中的具体信息,方法如下:
查看log中第一个Switch,主要是查看Monkey执行的是那一个Activity,譬如下面的log中,执行的是com.tencent.smtt.SplashActivity,在下一个swtich之间的,如果出现了崩溃或其他异常,可以在该Activity中查找问题的所在。
:Switch:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10000000;component=com.tencent.smtt/.SplashActivity;end // Allowing start of Intent {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]cmp=com.tencent.smtt/.SplashActivity } in package com.tencent.smtt 在下面的log中,Sending Pointer ACTION_DOWN和Sending Pointer ACTION_UP代表当前执行了一个单击的操作; Sleeping for 500 milliseconds这句log是执行Monkey测试时,throttle设定的间隔时间,每出现一次,就代表一个事件。 SendKey(ACTION_DOWN) //KEYCODE_DPAD_DOWN 代表当前执行了一个点击下导航键的操作; Sending Pointer ACTION_MOVE 代表当前执行了一个滑动界面的操作。 :Sending Pointer ACTION_DOWN x=47.0 y=438.0 :Sending Pointer ACTION_MOVE x=-2.0 y=-4.0 ANR 如果Monkey测试顺利执行完成,在log的最后,会打印出当前执行事件的次数和所花费的时间;// Monkey finished代表执行完成。Monkey执行中断,在log的最后也能查看到当前已执行的次数。Monkey执行完成的log具体如下: Events injected: 6000 :Dropped: keys=0 pointers=9 trackballs=0 flips=0 ## Network stats: elapsed time=808384ms (0ms mobile, 808384ms wifi, 0msnot connected) // Monkey finished
范例:
Monkey测试结果:
monkey -p wfh.LessonTable -v -v -v 200
:Monkey: seed=0 count=200 :AllowPackage: wfh.LessonTable :IncludeCategory: android.intent.category.LAUNCHER :IncludeCategory: android.intent.category.MONKEY // Selecting main activities from category android.intent.category.LAUNCHER // - NOT USING main activity com.android.browser.BrowserActivity (from package com.android.browser) // Seeded: 0 // Event percentages: // 0: 15.0% // 1: 10.0% // 2: 15.0% // 3: 25.0% // 4: 15.0% // 5: 2.0% // 6: 2.0% // 7: 1.0% // 8: 15.0% :Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10000000;component=wfh.LessonTable/.MainTable;end // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=wfh.LessonTable/.MainTable } in package wfh.LessonTable Sleeping for 0 milliseconds :SendKey (ACTION_DOWN): 21 // KEYCODE_DPAD_LEFT :SendKey (ACTION_UP): 21 // KEYCODE_DPAD_LEFT Sleeping for 0 milliseconds //------------------------------------用--throttle来设置一个起效的事件发生后时延时。 :Sending Pointer ACTION_DOWN x=0.0 y=0.0 :Sending Pointer ACTION_UP x=0.0 y=0.0 Sleeping for 0 milliseconds :Sending Pointer ACTION_MOVE x=0.0 y=0.0 当测试到ACTION_MOVE x=0.0 y=0.0这个动作时,发生了FC(Force Close)错误,以下为输出错误信息。同时在LogCat里面也有错误输出,而且LogCat里面的错误信息更为详细,在实际的测试中应该结合两者输出的信息进行调试程序。 // CRASH: wfh.LessonTable (pid 1973) // Short Msg: java.lang.NullPointerException // Long Msg: java.lang.NullPointerException // Build Label: android:generic/sdk/generic/:2.1-update1/ECLAIR/35983:eng/test-keys // Build Changelist: 35983 // Build Time: 1273161972 // ID: // Tag: AndroidRuntime // java.lang.NullPointerException: // at android.widget.TabHost.dispatchKeyEvent(TabHost.java:279) // at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:748) Monkey aborted due to error. Events injected: 190 :Dropped: keys=0 pointers=11 trackballs=0 flips=0 ## Network stats: elapsed time=27954ms (27954ms mobile, 0ms wifi, 0ms not connected) ** System appears to have crashed at event 190 of 200 using seed 0
开始monkey测试时android的LogCat输出的信息:
11-01 08:52:53.712: DEBUG/AndroidRuntime(2077): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
11-01 08:52:53.742: DEBUG/AndroidRuntime(2077): CheckJNI is ON
11-01 08:52:54.453: DEBUG/AndroidRuntime(2077): ---
以下为LogCat输出的错误信息,在以下的信息中首先从自己的包中找错误,如果没有自己的包的话就再找发生错误的包的第一个发生了异常。由错误提示可以看出很大的可能是因为TabHost引发的异常。经过查看代码发现是由于TabHost的编写不规范,TabHost与其中一个view放在了一起,在monkey测试做滚球上下滚动时当滚到TabHost时就发生了异常了。所以把TabHost与Activity分开写就不会出现些问题了。
11-01 08:53:27.113: ERROR/AndroidRuntime(1973): Uncaught handler: thread main exiting due to uncaught exception
11-01 08:53:27.133: ERROR/AndroidRuntime(1973): java.lang.NullPointerException
11-01 08:53:27.133: ERROR/AndroidRuntime(1973): at android.widget.TabHost.dispatchKeyEvent(TabHost.java:279)
11-01 08:53:27.133: ERROR/AndroidRuntime(1973): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:748)
四、总结:
在monkey测试中常用的命令组合有:
1、monkey -p com.yourpackage -v 500//简单的输出测试的信息。
2、monkey -p com.yourpackage -v -v 500 //以深度为二级输出测试信息。
4、monkey -p com.yourpackage -s 数字 -v 500//为随机数的事件序列定一个值,若出现问题下次可以重复同样的系列进行排错。
5、monkey -p com.yourpackage -v --throttle 3000 500//为每一次执行一次有效的事件后休眠3000毫秒。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?