背景介绍:
- Monkey 是 Android平台自带的一款测试工具,它主要是用于压力测试以及稳定性测试,常规使用在功能测试之后的专项测试中通过点击,滑动等伪随机事件来实现压力测试。
- Monkey.jar程序是通过Shell脚本来启动执行的,Shell脚本的存放路径在Android文件系统中:/system/bin/monkey;它的执行语句方式主要是:adb shell monkey {+命令参数}来进行Monkey测试。命令集可以通过{adb shell monkey}来进行查看。
跑完脚本后如何对日志有一个深入的解析?
- 日志分析做为monkey测试中非常重要的一个功能,我们可以通过日志分析来获取被测试对象在测试过程中是否发生异常情况,以及发生的概率,同时也能够获取到相应的错误信息,可以有效的帮助开发定位问题和解决问题。
1. 日志保存方法
- 保存在pc端,运行脚本如下:adb shell monkey [option] [count] >c:\monkey.txt 执行以上命令,会在Monkey 运行完后将日志保存在电脑C盘下的一个monkey.txt文件中。
- 保存在手机端,运行脚本如下:adb shell monkey [option] [count] > /mnt/sdcard/monkey.txt 执行以上命令,会在Monkey运行完后将日志保存在手机中的SD卡上的一个 monkey.txt 文件中。
- 分流保存,运行脚本如下:Monkey [option] [count] 1>/sdcard/monkey.txt 2>/sdcard/error.txt 执行以上命令, 会将Monkey 的运行日志和异常日志将被分开保存。此时 Monkey 的运行日志将被保存在 monkey.txt 文件中,而异常日志将被保存在 error.txt 中。 如果 Monkey 执行期间存在 Crash (崩溃)或 ANR ( Application Not Responding ,应用程序无响应)等, 在error.txt 中会显示错误日志。
日志内容分析:
a. 程序无响应,ANR问题:在日志中搜索“ANR”
b. 崩溃问题:在日志中搜索“CRASH”
c. 其他问题:在日志中搜索”Exception”
2. 日志内容解析
Monkey 在运行是输出的信息包含一般四类,分别是测试命令信息,事件流信息,异常信息, 执行结果信息:
- 测试命令信息 此类信息流主要包括在monkey启动后输出的当前执行各种参数信息,其中主要包括:种子值(seed),事件数量,运行的应用列表,各种事件的百分比等。这部分日志信息解析主要如下所示:
// 测试命令信息
// 随机种子值,执行事件数量
:Monkey: seed=1617866276701 count=100000
// 可运行的应用列表
:AllowPackage: com.car300.activity
//Category 包含LAUNCHER 和MONKEY
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// 各事件的百分比
Event percentages:
// 触摸类事件占15%
0: 15.0% 事件0 :--pct-touch
// 手势类事件占10%
1: 10.0% 事件1 :--pct-motion
// 二指缩放类事件占2%
2: 2.0% 事件2 :--pct-pinchzoom
// 轨迹类事件占15%
3: 15.0% 事件3 :--pct-trackball
// 旋转类事件占0%
4: -0.0% 事件4 :--pct-rotation
// 基本导航类事件占25%
5: 25.0% 事件5 :--pct-nav
//主要导航栏类事件占15%
6: 15.0% 事件6 :--pct-majornav
//系统按键类事件占2%
7: 2.0% 事件7 :--pct-syskeys
//启动activity类事件占2%
8: 2.0% 事件8 :--pct-appswitch
//键盘类事件占1%
9: 1.0% 事件9 :--pct-flip
//其他事件类占13%
10: 13.0% 事件10 :--pct-anyevent
- 事件流信息 当命令开始执行测试后,会依次输出相应执行的事件流信息,主要包括前面提到的事件。这部分日志信息解析主要如下所示:
// 执行的事件流信息
// 启动App 事件
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.car300.activity/com.che300.toc.module.splash.SplashActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.car300.activity/com.che300.toc.module.splash.SplashActivity mCallingUid=2000 } in package com.car300.activity
Sleeping for 300 milliseconds
// 轨迹球事件(后面括号里面是表示点击的位置坐标)
:Sending Trackball (ACTION_MOVE) 0:(907.6482,501.939)
// 点击事件(后面括号里面是表示点击的位置坐标)
:Sending Touch (ACTION_DOWN): 0:(338.0,676.0)
:Sending Touch (ACTION_UP): 0:(325.4063,658.7628)
// 延时2秒(每一个事件之间的间隔时间)
Sleeping for 300 milliseconds
//其他事件
......
- 异常信息 在执行过程中遇到错误或者异常时,会输出相应的信息。这部分日志信息解析主要如下所示:
// 发送Crash 的应用包名和pid
CRASH: com.car300.activity (pid 912)
//Crash 的简要信息(提示文件未找到)
Short Msg: java.lang.ClassNotFoundException
//Crash 的详细信息
Long Msg: java.lang.ClassNotFoundException: Didn't find class "com.qq.AppService.AstApp" on path DexPathList[[zip file "/data/app/monkey.apk"],nativeLibraryDirectories[/data/app-lib/com.car300.activity.android.qqdownloader-2, /vendor/lib, /system/lib]]
// 机型和系统信息
Build Label: Xiaomi/pisces/pisces:4.4.4/KTU84P/5.12.24:user/release-keys
Build Changelist: 5.12.24
Build Time: 1450958964000
//Crash 的详细日志
java.lang.RuntimeException: Unable to instantiate application com.qq.AppService.AstApp: java.lan.ClassNotFoundException: Didn't find class "com.qq.AppService.AstApp" on path: DexPathList[[zip fil "/data/app/monkey.apk"],nativeLibraryDirectories=[/data/app-lib/com.
car300.activity.android.qqdownloader-2, /vendor/lib, /system/lib]]
at android.app.LoadedApk.makeApplication(LoadedApk.java:509)
at android.app.ActivityThread.access$1500(ActivityThread.java:138)
at dalvik.system.NativeStart.main(Native Method)
... 11 more
- 执行结果信息
- 当命令执行完所有事件后,会输出相应执行结果信息,其中包括执行的事件数量、旋转的角度、丢失等事件数量、网络状态以及 最终的执行结果。这部分日志信息解析主要如下所示:
// 执行的事件数量
Events injected: 100000
// 旋转的角度为0
:Sending rotation degree=0, persist=false
// 丢失的事件数量,按键0,提示0,轨迹球0,翻转0,旋转0
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
// 网络状态,移动网络 0ms ,Wi-Fi 0ms ,无网 144ms
## Network stats: elapsed time=9947108ms (0ms mobile, 0ms wifi, 9947108ms not connected)
// Monkey finished
2.如果执行过程中出现了异常导致执行失败,会输出对应的执行失败的原因,比如第几个事件执行失败以及所使用的随机种子数。这部分日志信息解析主要如下所示:
// 显示Monkey 执行失败
** Monkey aborted due to error.
// 执行的事件数量
Events injected: 8
// 旋转的角度为0
:Sending rotation degree=0, persist=false
// 丢失的事件数量,按键0,提示0,轨迹球0,翻转0,旋转0
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
// 网络状态,移动网络 0ms,Wi-Fi 0ms,无网 405ms
## Network stats: elapsed time=405ms (0ms mobile, 0ms wifi, 405ms not connected)
// 提示在执行到第8 个事件时出现Crash ,以及所使用的随机种子值
** System appears to have crashed at event 8 of 10 using seed 1454215444564
- Monkey测试出现错误后,一般的查错步骤分为以下几步:
- 找到是monkey里面的哪个地方出错;
- 查看Monkey里面出错前的一些事件动作,并手动执行该动作;
- 若以上步骤还不能找出,可以使用之前执行的monkey命令再执行一遍,注意seed值要一样;
3. 日志异常信息查找
- Monkey 执行过程中常见的错误类型主要有两类:
- 程序无响应( ANR ):Android 系统监测到应用程序在 5 秒内没有响应输入的事件或广播在 10 秒内没有执行完毕时抛出无响应提示。
- 崩溃( Crash ):当应用程序出现错误时导致程序异常停止或退出的情况。
在日志分析中需要统计错误次数,只需要通过对于关键字的搜索“ANR”和“Carsh”即可。这种方式比较适用于日志内容相对较小的demo测试,对于常规测试往往日志内容会比较大,可以使用bat脚本进行统计,具体实现代码如下所示:
@echo off&setlocal enabledelayedexpansion
//设置所有Monkey 日志存放的目录
set ff=C:\Users\admin\Desktop\log\*.txt
//设置查询关键字
set str=CRASH crash ANR died Exception exception
//设置查询结果存放的目录
set fileName=Result.txt
//开始查询
echo 正在统计&echo;
echo %date% %time% >%fileName%
echo.>>%fileName%
echo 分析结果:>>%fileName%
echo ---------------------------------------------->>%fileName%
//依次打开目录下每一个Monkey 日志查询关键字并输出个数
(for %%a in (%str%)do (
set n%%a=0&set/p= %%a : <nul>con
for /f "delims=" %%b in ('findstr "%%a" "%ff%"')do (
set h=%%b
call :yky %%a)
echo !n%%a!>con
echo 关键字 %%a 共有 !n%%a! 处
))>>%fileName%
echo.>>%fileName%
//针对崩溃的日志输出其所在文件行数
echo 崩溃日志:>>%fileName%
findstr "%str%" "%ff%">>%fileName%
echo/&pause&exit
//yky
set/a n%1+=1
set h=!h:*%1=!
if defined h if not "!h:*%1=!"=="!h!" goto :yky
常见技巧
- adb install xxx.apk ----安装指定应用包,显示success为安装成功
- adb install -r xxx.apk ---覆盖安装
- adb uninstall 包名(com.car300.activity) ---卸载指定应用
- adb uninstall -k 包名(com.car300.activity) ---卸载指定应用并保留数据
- adb shell dumpsys window w |findstr \ / | findstr name= ---查看前台应用包名(activity)
- adb connect 127.0.0.1:62001 ---连接“夜神”模拟器
- WiFi远程连接:
- 第一步 adb devices 连接设备
- 第二步 adb tcpip 5555 确认手机与电脑通讯端口
- 第三步 adb connect 手机ip地址(查看wifi里的网络详情找到ip地址即可)
- 第四步 adb disconnect 手机IP地址 断开WiFi设备号
adb shell dumpsys | findstr "mFoucesdActivity"
-添加应用白名单:
- 第一步编写txt文档(里面填写需要添加白名单的包名),记住保存路径
- 第二部输入adb push 加上白名单路径 /data/loacl/tmp
- 第三步输入adb shell
- 第四步输入cd /data/local/tmp
- 第五步输入ls(查看所有内容)