美文网首页
Python Appium自动化测试 Monkey日志

Python Appium自动化测试 Monkey日志

作者: 白码会说 | 来源:发表于2020-12-11 22:07 被阅读0次

    Time will tell.

    日志是很重要的东西,用于记录系统、软件操作事件的记录文件或文件集合,可分为事件日志和消息日志。

    具有处理历史数据、诊断问题的追踪以及理解系统、软件的活动等重要作用,在开发或者测试软系统过程中出现了问题,首先想到的就是 logging ,只需按图索骥就可以定位到问题所在,然后分析,再解决问题。好了,下面直接进如正题。

    1、 Monkey 日志管理

    Monkey 日志管理是 Monkey 测试中重要的一个环节。

    通过日志管理分析,可以获取当前测试对象在测试过程中是否会发生异常,以及发生的概率。同时还可以获取对应的错误信息,帮助开发定位和解决问题。

    这样你就不会只停留在一个点点点的点工上,对自己也是一个很好的提升。

    2、Monkey Log 分析

    当 monkey 测试时出现问题,此时我们需要分析定位问题,我们需要分析 monkey 日志。Monkey 测试出现的异常的原因,一般是两种原因导致,一个是crash 程序崩溃,导致crash原因如下 :

    1. 程序存在空指针
    2. cpu不足
    3. 内存不足

    另一种是 ANR程序无响应,导致anr无响应原因如下:

    1. 线程阻塞
    2. cpu不足
    3. 内存不足

    查找分析原因:

    1. 当 monkey 测试出现异常终止,请打开 logcat 日志搜索关键字anrin,如果存在该关键字,说明 app 出现了ANR异常,我们需要把 /data/anr 目录下的trace.txt文件取下来。

    2. 取下来trace.txt文件后,将出现问题的进程号对应的日志发给软件工程师定位,如果在logcat日志里没有搜索到anrin关键字,就搜索nullpointer异常关键字的上下日志,发给开发定位 。

    3. 当出现ANR后,需要导出,步骤如下: 1. 输入adb shell2.输入cd /data/anr/3. 输入ls

      退出exit后,直接在 cmd 下输入

    4. adb pull /data/anr/traces.txt d:\trace.txt

    5. 在 logcat 将出现anr问题的进程号复制,然后在trace.txt文件里按 ctrl+F 查找,粘贴进程号,查找对应的问题

    Monkey 结果分类

    Monkey 运行 log 输出,按下列顺序输出:

    下面是详细 LOG 分析。表情代替注释符号,以免跟日志搞混:

    ☀ 伪随机种子数与事件总数
    :Monkey: seed=1519697645236 count=10
    
    ☀ 允许测试包
    :AllowPackage: 包名1
    
    ☀ Category包含的LAUNCHER
    :IncludeCategory: android.intent.category.LAUNCHER
    
    ☀ Category包含的MONKEY 
    :IncludeCategory: android.intent.category.MONKEY
    
    ☀ 查询允许包的activity 结果列表
    // Selecting main activities from category android.intent.category.LAUNCHER
    
    ☀ 这些都不是指定包的activity
    //   - NOT USING main activity com.android.browser.BrowserActivity (from package com.android.browser)  
    //   - NOT USING main activity com.android.calendar.homepage.AllInOneActivity (from package com.android.calendar)
    //   - NOT USING main activity com.android.camera.Camera (from package com.android.camera)
    
    .... ☀ 中间忽略,从这也可以看出你手机上都安装了哪些应用
    ☀ 这个就是我们指定的包的activity 
    // + Using main activity 包名1.ui.portal.WelcomeActivity (from package 包名1)
    //   Selecting main activities from category android.intent.category.MONKEY
    
    ☀ 种子为1519697645236
    // Seeded: 1519697645236
    
    ☀ 事件百分比
    // Event percentages: 
    //   0: 15.0%
    //   1: 10.0%
    //   2: 2.0%
    //   3: 15.0%
    //   4: -0.0%
    //   5: -0.0%
    //   6: 25.0%
    //   7: 15.0%
    //   8: 2.0%
    //   9: 2.0%
    //   10: 1.0%
    //   11: 13.0%
    
    ☀ 表示跳转到com.crazyhornets.MyHokageAndroidZSY包中的com.crazyhornets.MyHokage.MyHokageActivity里
    ☀ 查看log中第一个Switch,主要是查看 Monkey 执行的是那一个 Activity,譬如下面的 log 中,执行的是com.yulore.yellowpage/.activity.SplashActivity,
    在下一个swtich之间的,如果出现了崩溃或其他异常,可以在该Activity中查找问题的所在。
    :Switch:  
    #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity;end
    
    ☀ 允许此Intent跳转
    // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity } in package cn.yaomaitong.app.daily
    // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity } in package cn.yaomaitong.app.daily
    
    ☀ 以下就是事件间的延迟和发送的各种事件
    ☀ --pct-nav事件
    ☀ sleeping for 0 milliseconds这句 log 是执行Monkey测试时,throttle设定的间隔时间,每出现一次,就代表一个事件。(这个事件是指从用户角度来说的一个事件,比如点击:实际包括手指按下与抬起两个动作,monkey日记将被记为2个事件)
    Sleeping for 0 milliseconds    
    :Sending Key (ACTION_DOWN): 82    // KEYCODE_MENU
    :Sending Key (ACTION_UP): 82    // KEYCODE_MENU
    Sleeping for 0 milliseconds
    :Switch: 
    #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity;end
        // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity } in package cn.yaomaitong.app.daily
        // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=cn.yaomaitong.app.daily/cn.yaomaitong.app.ui.portal.WelcomeActivity } in package cn.yaomaitong.app.daily 
    
    ☀ --pct-touch事件
    Sleeping for 0 milliseconds  
    :Sending Touch (ACTION_DOWN): 0:(532.0,1392.0)
    :Sending Touch (ACTION_UP): 0:(542.04724,1391.5958) 
    
    ☀ --pct-motion事件
    Sleeping for 0 milliseconds    
    :Sending Touch (ACTION_DOWN): 0:(838.0,113.0)
    :Sending Touch (ACTION_UP): 0:(852.82526,101.77225)
    
    ☀ --pct-trackball事件
    Sleeping for 0 milliseconds     
    :Sending Trackball (ACTION_MOVE): 0:(1.0,4.0)
    :Sending Trackball (ACTION_MOVE): 0:(-5.0,-3.0)
    
    ☀ --pct-rotation屏幕旋转百分比 ####隐藏事件
    : Sending rotation degree=0, persist=true
    : Sending rotation degree=1, persist=false: 
    : Sending rotation degree=2, persist=true
    : Sending rotation degree=3, persist=false
    
    ☀ 注入事件10
    Events injected: 10
    
    ☀ 发送屏幕翻转 度=0,存留=假
    :Sending rotation degree=0, persist=false
    
    ☀ 丢弃:键=0,指针=0,轨迹球=0,键盘轻弹=0,屏幕翻转=0
    :Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
    
    ☀ 网络状态:占用时间=42ms(手机0ms,wifi0ms,未连接42ms)
    ## Network stats: elapsed time=42ms (0ms mobile, 0ms wifi, 42ms not connected)
    
    ☀ 如果 Monkey 测试顺利执行完成,在 log 的最后,会打印出当前执行事件的次数和所花费的时间Monkey finished代表执行完成。Monkey 执行完成的 log 具体如下: 
    Events injected: 100:Sending rotation degree=0, persist=false:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0## Network stats: elapsed time=2042ms (0ms mobile, 0ms wifi, 2042ms not connected)// Monkey finished
    
    ☀ Monkey 执行中断,在 log 的最后也能查看到当前大约已执行的次数
    :Sending Trackball (ACTION_MOVE): 0:(-3.0,1.0):Sending Trackball (ACTION_MOVE): 0:(4.0,0.0)    //[calendar_time:2018-04-02 11:23:50.322  system_uptime:718998]    // Sending event #7500:Sending Trackball (ACTION_MOVE): 0:(3.0,-2.0)
    
    ☀ Monkey测试完成 
    // Monkey finished
    
    ☀ CRASH输出LOG:
    // CRASH: cn.包名1 (pid 3165)
    // Short Msg: java.lang.IllegalStateException
    // Long Msg: java.lang.IllegalStateException: Fragment SingleChatFragment{366281} not attached to Activity
    // Build Label: Xiaomi/sagit/sagit:7.1.1/NMF26X/V9.2.4.0.NCACNEK:user/release-keys
    // Build Changelist: V9.2.4.0.NCACNEK
    // Build Time: 1516183841000
    // java.lang.IllegalStateException: Fragment SingleChatFragment{366281} not attached to Activity
    //  at android.support.v4.app.Fragment.getResources(Fragment.java:646)
    //  at cn.yaomaitong.app.ui.message.fragment.SingleChatFragment$13$1.run(SingleChatFragment.java:586)
    //  at android.os.Handler.handleCallback(Handler.java:754)
    //  at android.os.Handler.dispatchMessage(Handler.java:95)
    //  at android.os.Looper.loop(Looper.java:163)
    //  at android.app.ActivityThread.main(ActivityThread.java:6365)
    //  at java.lang.reflect.Method.invoke(Native Method)
    //  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
    //  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:791)
    
    ☀ ANR输出LOG
    //NOT RESPONDING:com.android.quicksearchbox(pid 6333)
    ANR in com.android.quicksearchbox(com.android.quicksearchbox/.SearchActivity)
    CPU usage from 8381ms to 2276ms ago:
    procrank: ->adb shell procrank
    anr traces: ->保存于/data/anr/traces.txt
    meminfo: ->adb shell dumpsys meminfo
    Bugreport ->adb bugreport 可选通过 --bugreport 参数控制
    
    

    3、快速从monkey.txt日志中定位问题

    测试结果初步判断

    1. monkey 执行时未加--ignore-crashes --ignore-crashes参数,就先浏览日志中Events injected: 值,查看当前已执行的次数,就知道有无bug。

    2. 程序无响应的问题:在日志中搜索 “ANR” 。

    3. 崩溃问题:在日志中搜索 “Exception” 。

    找出问题后的操作步骤:

    1. 找到是 monkey 里面的哪个地方出错。

    2. 查看 Monkey 里面出错前的一些事件动作,并手动执行该动作。

    3. 若以上步骤还不能找出,可以使用之前执行的 monkey 命令再执行一遍,注意 seed值要一样。

    4、日志导出

    细心的小伙伴可能通过前边的一系列操作和查找日志定位问题,发现 docs 命令窗口在查看和操作的时候特别地不方便,那么 Monkey 有没有像 Tomcat 等其他工具那样有 log 日志文件,答案是:NO!但是我们可以将日志导出到文件中。然后将文件导出到手机或者是电脑上。

    导出到手机:

    C:\Users\Shuqing>adb shell
    
    monkey -v 100 >/sdcard/monkeylog.log
    
    注意:不能写成C:\Users\Shuqing>adb shell monkey -f /sdcard/kyb.txt -v 1 > /mnt/sdcard/monkey.log 否则会报错“系统找不到指定的路径”。
    
    需要将手机连接PC,拷贝以上文件:我们需要对这3个文件进行分析整理,以便提交开发人员处理。
    
    当然了除了这种方法也比较麻烦,你可以通过命令直接导出到PC电脑端
    
    

    导出到电脑:

    例如:保存到电脑上并命名为monkey.txt
    
    >adb shell monkey [option] <count> >d:\monkey.txt
    
    eg:
    
    C:\Users\Shuqing>adb shell monkey -v -v 100 >d:\monkeylog.txt
    
    

    以上的导出方法,导出日志后,标准流和错误流的日志混合在一起,给我们定位和分析问题又带来麻烦了,因此需要将其分开导出保存。

    标准流和错误流分开保存:

    标准流与错误流分开保存,代码如下:
    Monkey [option] <count> 1>/sdcard/monkey.txt 2>/sdcard/error.txt
    
    C:\Users\Shuqing>adb shell monkey -v 100 1>d:\monkey.log  2>d:\error.log
    执行以上命令,Monkey的运行日志和异常日志将被分开保存。此时Monkey的运行日志将被保存在monkey.txt文件中,而异常日志将被保存在D盘下的error.txt中。
    
    

    各个文件主要内容:

    info.txt:主要记录了MONKEY测试时发送的各种事件,如触摸事件的位置等等。
    
    error.txt:主要记录了MONKEY测试时产生的一些ANR、强制关闭等异常。
    
    LOG文件:主要主要记录程序对MONKEY测试时的响应情况。
    
    

    5、日志参数

    1. -v 较少的日志信息

    2. -v -v 较为丰富的日志信息

    3. -v -v -v 最高级别的日志信息(推荐)

    6、最后

    初步分析方法:

    (1)找到是 monkey 里面的哪个地方出现错误

    (2)查看 monkey 里面出错前的一些事件动作,并手动执行该动作

    (3)若以上步骤还不能找到,可以使用之前执行 monkey 命令,再执行一遍,注意使用的seed值要一样

    测试结果分析:

    (1)ANR问题(程序无响应):在日志中搜索“ANR"(application no response)

    (2)闪退问题:在日志中搜索"crash"

    (3)异常:搜索"exception"

    (4)强制退出:搜索"force closed"


    如果你对Python自动化软件测试感兴趣可以加入我们扣裙一起学习175317069。有各项测试学习资源发放,更有行业深潜多年的技术人分析讲解。

    以上内容就分享到这里。

    欢迎【点赞】、【评论】、【关注】~

    Time will tell.(时间会证明一切)

    相关文章

      网友评论

          本文标题:Python Appium自动化测试 Monkey日志

          本文链接:https://www.haomeiwen.com/subject/ncmsgktx.html