zoukankan      html  css  js  c++  java
  • 使用MonkeyTest对Android客户端进行压力测试

     

    1、monkey命令简介

    Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。

    先来看一条monkey命令

    adb shell monkey -p ctrip.android.view --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 100000>e:monkeylogmonkeyScreenLog.log

    这条monkey命令是指:在ctrip.android.view中产生10万次伪随机操作(包括触摸、按键、手势等),每次间隔500ms。

    2、monkey命令参数说明

    -s
        伪随机数生成器的 seed 值。

        示例: -s 600(如果用相同的seed值再次运行monkey,它将生成相同的事件序列。)
    --throttle
        在事件之间插入固定延迟。

        示例: --throttle 500(毫秒)
    -p
        如果用此参数指定了一个或几个包,Monkey将只允许系统启动这些包里的Activity。 如果你的应用程序还需要访问其它包里的Activity(如选择取一个联系人),那些包也需要在此 同时指定。如果不指定任何包,Monkey将允许系统启动全部包里的Activity。要指定多个 包,需要使用多个 -p选项,每个-p选项只能用于一个包。

        示例:-p ctrip.android.view
    --kill-process-after-error 
        通常,当Monkey由于一个错误而停止时,出错的应用程序将继续处于运行状态。当设置了此选项时,将会通知系 统停止发生错误的进程。注意,正常的(成功的)结束,并没有停止启动的进程,设备只是在结束事件之 后,简单地保持在最后的状态。
    --ignore-timeouts 
        通常,当应用程序发生任何超时错误(如“Application Not Responding”对 话框)时,Monkey将停止运行。如果设置此选项,Monkey将继 续向系统发送事件,直到计数完成。
    --ignore-security-exceptions 
        通常,当应用程序发生许可错误(如启动一个需要某些许可的Activity)时,Monkey将 停止运行。如果设置了此选项,Monkey将继续向系统发送事件,直到计数完成。
     -v 
        命令行的每一个 -v 将增加反馈信息的级别。 3个-v代表最详细的日志级别。

        示例:-v -v -v 100(数字100: 表示测试事件数)。

    详情请参考:monkey命令参数 

    3、自动化实例

     1 #coding=utf-8
     2 
     3 '''
     4 Create on 2014-12-24
     5 python 2.7 for window
     6 @auther: tangdongchu
     7 '''
     8 import os
     9 import sys
    10 import time
    11 
    12 class monkeyTest():
    13     
    14     def __init__(self):
    15         """ init """
    16             
    17     #monkey命令,packageName包名,interval间隔时间单位ms ,frequency执行次数
    18     def monkeyApp(self,packageName,interval,frequency):
    19         try:
    20             os.popen("adb shell monkey -p %s --throttle %s --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v %s >e:monkeylogmonkeyScreenLog.log" % (packageName, interval, frequency),'r')
    21         except Exception,e:
    22             print e
    23 
    24     #导出日志
    25     def copyErrorLog(self):
    26         try:
    27             anr = "E:\monkeylog\anr"
    28             if not os.path.isdir(anr):
    29                 os.makedirs(anr)
    30             dontpanic = "E:\monkeylog\dontpanic"
    31             if not os.path.isdir(dontpanic):
    32                 os.makedirs(dontpanic)
    33             tombstones = "E:\monkeylog\tombstones"
    34             if not os.path.isdir(tombstones):
    35                 os.makedirs(tombstones)              
    36             bugreports = "E:\monkeylog\bugreports"
    37             if not os.path.isdir(bugreports):
    38                 os.makedirs(bugreports)                                            
    39             os.popen("adb pull /data/anr  E://monkeylog//anr",'r')
    40             os.popen("adb pull /data/dontpanic  E://monkeylog//dontpanic",'r')
    41             os.popen("adb pull /data/tombstones  E://monkeylog//tombstones",'r')
    42             os.popen("adb pull /data/data/com.android.shell/files/bugreports  E://monkeylog//bugreports",'r')
    43         except Exception,e:
    44             print e            
    45            
    46 def main():
    47     print """"""
    48     
    49     
    50 if __name__=="__main__":
    51     
    52     packageName = 'ctrip.android.view'  
    53     myApp = monkeyTest()   
    54     myApp.monkeyApp(packageName,500,100)
    55     #判断是否执行完成,执行完成后导出日志
    56     for i in range(1, 1000000):
    57         monkeylog = open('E:monkeylogmonkeyScreenLog.log')
    58         try:
    59             temp = monkeylog.read( )
    60         finally:
    61             monkeylog.close( )
    62         if temp.count('Monkey finished')>0:
    63             myApp.copyErrorLog()
    64             break
    65         else:
    66             time.sleep(2)

    以上做到了自动执行monkey命令,并在monkey执行完成后将日志导出到PC以供分析。

    4、如何通过日志定位问题

    Android平台应用程序可能产生以下四种Crash:

        App层

        1、Force Close Crash
        2、ANR Crash

        Native层

        3、Tombstone Crash(Native Crash)

        Kernel层

        4、Kernel Panic

    主要Log文件说明

    anr目录:从手机/data/anr导出的日志,保存发生anr crash 时的相关信息;

    dontpanic目录:从手机/data/dontpanic/导出的日志,保存发生Kernel Panic时的相关信息;

    Tombstone目录:从手机/data/tombstones/导出的日志,保存发生Tombstone Crash时的错误信息;

    dropbox目录:从手机/data/tombstones/导出的日志,经过dropbox服务截取的部分tombstones错误信息;

    bugreports.log:从手机data/data/com.android.shell/files/bugreports导出的日志,保存发生异常时的相关系统信息,也可以通过adb shell bugreport命令提取;

    MonkeyScreenLog.Log:保存Monkey测试过程、应用层错误信息,发生Native Crash时,在此文件也会有记录;

    LOG分析方法

    1、在MonkeyScreen.Log日志文件搜索关键词“Fatal”、“Crash”、“ANR”定位到发生Crash的详细堆栈信息,通过上下文初步判断发生问题的时间,进程pid等

    2、检查dropbox目录下是否有相关crash日志信息,主要关注是否有以下4类crash错误信息:data_app_wtf,data_app_anr,data_app_crash,system_server_watchdog

    LOG分析示例

    详细log分析参考

  • 相关阅读:
    多线程2.md
    Python-多线程.md
    Python-Log-note.md
    记账本开发记录——第四天(2020.1.21)
    记账本开发记录——第三天(2020.1.20)
    记账本开发记录——第二天(2020.1.19)
    《构建之法——现代软件工程》读书笔记(一)
    记账本开发记录——第一天(2020.1.18)
    JAVA分级测试——选课系统(补发)
    转专业后补修C语言的一些体会(4)
  • 原文地址:https://www.cnblogs.com/tangdongchu/p/4185014.html
Copyright © 2011-2022 走看看