goodby 2019-06-25
【写在前面】在进行app测试中了解到monkey测试,故在网上学习了一些资料,但自己在实践中仍有一些疑惑和问题出现。在此记录下自己的实际操作,后续仍然会不断调整,以期完善。
monkey:是Android中的一命令行工具,对app的稳定性和健壮性进行测试。
特点:1、测试对象为程序包,有一定局限性;2、伪随机事件,不能自定义;3、可设置事件数量、类型、频率。
适用情况:ANR和CRASH异常情况;低概率很难复现的异常。
http://www.oracle.com/technet...
成功后打开终端,输入‘javac -version’,若弹出版本信息则说明安装成功。
此环境自带SDK,方便下一步配置adb。
下载Android Studio的参考资料戳这里
如果以上过程中Android SDK的下载时间过长,想手动配置,相关参考资料戳这里
总之,我们需要得到Android SDK的环境及其路径。
在Android Studio中查看SDK路径的方法见下图:
终端中输入‘adb’,会出现提示-bash: abd: command not found,故我们此时需要添加adb命令到环境变量中:
(1)终端中输入‘touch .bash_profile’创建文件;
(2)输入‘open -e .bash_profile’打开文件;
(3)在文件中设置:
ANDROID_HOME=/Users/xxx/Library/Android/sdk
(即之前得到的SDK路径)
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools
之后直接关闭文本窗口(会自动保存);
(4)输入‘source .bash_profile’更新文件;
(5)再次输入‘adb’,出现adb命令参数解释,表明配置成功。
若使用真机,用USB将手机和Mac连接,在手机端进行操作:
(1)选择USB连接方式为设备文件管理;
(2)设置->开启开发者选项->勾选‘USB调试’(真机和模拟器上皆需进行)。
在终端中输入’adb devices‘,此时已连接设备列表下应存在设备序列号;我使用的网易木木的模拟器,可看到
⚠️注意,若首次操作成功,但之后存在检测不到连接设备的情况,可能需要重启服务,具体操作是:
a、在终端下,输入‘cd Users/xxx/Library/Android/sdk/platform-tools’来到adb所在目录下;
b、再依次输入‘adb kill-server‘和’adb start-server’来重启服务;
c、之后再输入‘adb devices’,一般便可检测到连接设备。
⚠️另外,部分真机可能存在检测不到的情况,可进行创建、修改adb_usb.ini文件,操作如下:
a、在终端中输入‘system_profiler SPUSBDataType’,找到手机的Vendor ID并记录;
b、在终端中输入‘vi ~/.android/adb_usb.ini’,创建并打开文本,按‘I’键可对文本进行编辑,向文本中添加记录的Vendor ID(若添加多个,需确保每个id占一行且文本中无空行),完成后按‘esc’键,然后键入‘:wq!’,即可保存并退出文本。完成此步后将发现路径/Users/xxx/.android下存在adb_usb.ini文件;
c、将手机拔掉重新接入Mac,重复4.(1)(2),在终端中输入‘adb kill-server’,然后输入‘adb start-server’,再次输入‘adb devices’查看是否识别到设备。
【附】.android是隐藏目录,需要开启隐藏目录显示,开启方式为:
在终端中输入‘defaults write com.apple.finder AppleShowAllFiles -bool true’,退出终端;然后单击窗口左上角的苹果标志->强制退出->Finder->重新启动,选择‘这台Mac’,搜索框中输入user,来到用户->xxx(当前用户名)下即可看到隐藏文件们。
完成以上操作后就可进行monkey测试了,每次只能对一台设备进行测试。
若想对多台设备同时进行测试,可戳此参见
此外,连接一台设备时,终端输入‘adb shell’即可进入命令环境;若连接了多台设备,输入‘adb -s 设备序列号 shell’进入命令环境;‘exit’可退出当前命令环境。
adb shell monkey [-p 包名] [其他参数] [-v] 测试次数 [> /user/…/result.txt](注:‘> /user/…/result.txt’可将结果打印到文本中)
(1)在Mac上完成环境配置,安装并启动模拟器,确保通过‘adb devices’可检测到emulator;
(2)将待测应用程序的apk文件放到platform-tools文件夹下,在终端中输入:
'cd /Users/xxx/Library/Android/sdk/platform-tools'来到此路径下,再输入‘adb install 应用程序名.apk’,程序将安装在模拟器上;操作及结果如下:
(3)保持模拟器打开,终端保持platform-tools目录下,并输入‘adb logcat>log.txt’,将新建log.txt,终端则在当前屏幕下显示日志内容(目前为空);
(4)点击模拟器中的待测程序,待其打开后来到终端,按下‘ctrl+c’中止adb logcat命令;
(5)打开log.txt,查找关键字‘displayed’,找到到类似‘Displayed com.mm.android.hsy/.ui.LoginActivity: +3s859ms
‘的结果,其中,com.mm.android.hsy就是包名;
(6)终端输入‘adb shell’进入命令模式,输入一个基本命令(启动指定的应用程序,并向其发送1000个伪随机事件): monkey -p 包名 -v 1000
,观察模拟器界面,发现app页面开始进行测试。若app发生crash,查看终端,可看到类似如下结果:
⚠️但是,工作中为了保证测试数量的完整进行,我们一般不会在发生错误时立刻退出压力测试,所以需要利用事件(参数)选项来扩充命令。例如可扩充为:
monkey -p 包名 -s 1000 --ignore-crashes --ignore-timeouts -vv 2000 > 日志路径
此命令翻译为自然语言是:monkey作用于此包,产生时间序列的种子序列值定为1000,运行中忽略程序崩溃、超时,同时监视本地程序崩溃,日志的详细信息级别为二级,产生2000个点击事件,相关日志会保存在所写路径中,搜索关键字‘crash’或‘anr’即可查看发生错误的部分(本人未能成功保存日志,是手动将终端中的日志内容拷贝到文本中的OTZ)。
monkey -help:可查看参数说明列表。参数选项有:
(1)-p 包名1 -p 包名2 … :指定一或多个待测试的包,若不指定则测试中可打开任意app;
(2)-v:指定打印日志的详细程度,有‘-v’,'-v -v','-v -v -v'三个级别;
(3)-s seed值:在测试中,虽然用户操作序列(每次操作按一定的顺序所组成的一系列操作)是随机生成的,但只要对同一个包指定相同的Seed值,就能使测试事件相同,可用于排错。所以也说这个操作序列是伪随机的。若不添加此参数,结果中会自动生成seed值;
(4)–-throttle 毫秒数:指定操作(即事件)间的时延,单位是毫秒;
(5)–-ignore-crashes:使得操作序列可以全部执行完,而不会在发生崩溃时就终止程序进程;
(6)–ignore-timeouts:使得操作序列可以全部执行完,而不会在发生ANR(Android Not Responding)时就终止程序进程;
(7)–-ignore-security-exceptions:使得操作序列可以全部执行完,而不会在发生许可错误时(如证书许可,网络许可等)时就终止程序进程;
(8)–-kill-process-after-error:使得当应用程序发生错误时停止运行并保持在当前状态,即仅是静止在发生错误时的状态,而不是结束该应用程序的进程;
(9)–-monitor-native-crashes:指定监视并报告应用程序发生崩溃的本地代码;
(10)–-pct-事件1 事件百分比1 -pct-事件2 事件百分比2 … :用于指定某类事件数目占总事件数目的百分比;
其中所指定事件参数选项可为:
-flip(点击事件)
-touch(触摸事件是一个down-up事件)
-motion(动作事件由一个down事件、一系列的伪随机事件和一个up事件组成)
-trackball(轨迹事件,在屏幕上进行随机拖动)
-nav(基本导航事件,如上下左右键)
-majornav(主要导航事件,通常引发图形界面中的动作)
-syskeys(系统按键事件指如系统按键Home、Back、Start Call、End Call及volumeControl)
-appswitch(启动activity事件)
-anyevent(其它类型事件)
注意,各事件类型的百分比总数不能超过100。
一般我们可以一次发送5万次随机事件的请求,每个请求之间的间隔为150毫秒,测试大约会进行40min,完成以后就可以查看日志。
日志中可能的错误:
更详细的日志内容和分析举例可参见:链接描述
结束语:本人在实践中仍有很多困惑未能解决,如无法通过参数选项来减少系统事件,等。若大家有兴趣,可以深入探究,或去网络查阅MonkeyRunner测试的学习资料。
在此要感谢网络上所有提供资料的大神,也请大家多多指教和分享,谢谢。