Appium自动化4-MonKey常用命令

1、Monkey 简介

Monkey是 Android sdk中自带的工具
运行在模拟设备中,并生成用户事件的伪随机流,例如点击,触摸,或手势,以及若干系统级事件。
Monkey测试,所有的事件都是随机产生的,不带任何人的主观性。可使用 Monkey进行压力测试

2、Monkey 环境

  • 安装JDK
  • 安装Android SDK
  • 电脑ADB连接手机或虚拟设备

3、Monkey 案例

  1. 连接设备:adb connect 127.0.0.1:62001(夜神模拟器)
  2. 检查设备:adb devices
  3. 获取设备所有包名:adb shell pm list package -f
  4. 指定包名随机操作100次:adb shell monkey -p <包名> -v -v 100 > report.txt

4、Monkey 命令注释

内容 说明
-p <包名> 指定包名进行操作。如果不指定包,Monkey将允许系统启动设备中的所有APP
--throttle <思考时间> --throttle 300 表示延迟300毫秒
--ignore-crashes 忽略程序崩溃。用于指定当应用程序崩溃时(Force & Close 错误),Monkey是否停止运行。如果使用此参数,即使应用程序崩溃,Monkey依然会发送事件,知道事件计数完成。
--ignore-timeouts 忽略超时报错。用于指定当应用程序发生ANR(APPlication No Responding)错误时Monkey是否停止运行。如果使用此参数,即使应用程序发生ANR错误,Monkey依然会发送事件,直到事件计数完成。
ignore-security-ecxeptions 忽略许可报错。用于指定当应用程序发生许可错误时(如证书许可,网络许可等),Monkey是否停止运行。如果使用此参数,即使应用程序发生许可错误,Monkey依然会发送事件,直到事件计数完成。
--pct-touch <事件代码> 指定操作事件,如:--pct-touch 100 10 表示10次都执行触摸事件
-s <seed> log文件会为伪随机生成seed值,下次执行时加上seed值时就可以重复上次log文件的操作流程
日志级别 -v 说明:缺省值,仅提供启动提示和测试完成和最终结果等少了信息
-v -v 说明:提供较为详细的日志,包括每个发送的Activity的事件信息
-v -v -v说明:最详细的日志,包括了测试中选择/未选中的Activity的事件信息
保存日志 保存到PC端中。>D:\test.log 日志保存在名D盘为test.log的文件中
保存到移动端中。> /mnt/sdcard/test.txt 日志保存在目录/mnt/sdcard/的test.log的文件中
分流保存。1>/sdcard/monkey.txt 2>/sdcard/error.txt 运行日志和异常日志将被分开保存。此时 Monkey 的运行日志将被保存在 monkey.txt 文件中,而异常日志将被保存在 error.txt 中。 如果 Monkey 执行期间存在 Crash (崩溃)或 ANR ( Application Not Responding ,应用程序无响应)等, 在error.txt 中会显示错误日志。

注:我们在测试过程中,建议不要忽略这些异常,尽可能的暴露出app中存在的问题,如果选择忽路出现 crach,an等现象,手机中就不会有提示,不便于判断试是否正常。忽略异常是想要对此模块执行完成,尽可能多的发现更多问题,但是这个问题的判断只能通过og去分析,不便于测试的判断。所以我们测试建议使用下边的命令

5、Monkey 日志解析

Monkey 在运行是输出的信息包含一般四类,分别是测试命令信息,事件流信息,异常信息, 执行结果信息

1、测试命令信息:此类信息流主要包括在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

2、事件流信息:当命令开始执行测试后,会依次输出相应执行的事件流信息,主要包括前面提到的事件。这部分日志信息解析主要如下所示:

// 执行的事件流信息
// 启动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 
//其他事件
......

3、异常信息:在执行过程中遇到错误或者异常时,会输出相应的信息。这部分日志信息解析主要如下所示:

// 发送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

4、执行结果信息
4.1 当命令执行完所有事件后,会输出相应执行结果信息,其中包括执行的事件数量、旋转的角度、丢失等事件数量、网络状态以及 最终的执行结果。这部分日志信息解析主要如下所示:

// 执行的事件数量
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

4.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

6、Monkey 异常分析

1、查找异常

  • 程序无响应( ANR ):Android 系统监测到应用程序在 5 秒内没有响应输入的事件或广播在 10 秒内没有执行完毕时抛出无响应提示。【在日志中搜索“ANR”】
  • 崩溃( Crash ):当应用程序出现错误时导致程序异常停止或退出的情况。【在日志中搜索“CRASH”】
  • 其他问题:在日志中搜索”Exception”

2、重现异常

  • 找到是monkey里面的哪个地方出错;
  • 查看Monkey里面出错前的一些事件动作,并手动执行该动作;
  • 若以上步骤还不能找出,可以使用之前执行的monkey命令再执行一遍,注意seed值要一样;

3、通过bat脚本统计异常数量

在日志分析中需要统计错误次数,只需要通过对于关键字的搜索“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

参考文档:https://blog.csdn.net/chengdiyiyo/article/details/121489811

posted @ 2023-02-20 18:11  捕者  阅读(472)  评论(0)    收藏  举报