风流不在谈锋胜,袖手无言味最长。这篇文章主要讲述使用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:\\monkeylog\\monkeyScreenLog.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 14def __init__(self): 15""" init """ 16 17#monkey命令,packageName包名,interval间隔时间单位ms ,frequency执行次数 18def monkeyApp(self,packageName,interval,frequency): 19try: 20os.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:\\monkeylog\\monkeyScreenLog.log" % (packageName, interval, frequency),\'r\') 21except Exception,e: 22print e 23 24#导出日志 25def copyErrorLog(self): 26try: 27anr = "E:\\\\monkeylog\\\\anr" 28if not os.path.isdir(anr): 29os.makedirs(anr) 30dontpanic = "E:\\\\monkeylog\\\\dontpanic" 31if not os.path.isdir(dontpanic): 32os.makedirs(dontpanic) 33tombstones = "E:\\\\monkeylog\\\\tombstones" 34if not os.path.isdir(tombstones): 35os.makedirs(tombstones) 36bugreports = "E:\\\\monkeylog\\\\bugreports" 37if not os.path.isdir(bugreports): 38os.makedirs(bugreports) 39os.popen("adb pull /data/anrE://monkeylog//anr",\'r\') 40os.popen("adb pull /data/dontpanicE://monkeylog//dontpanic",\'r\') 41os.popen("adb pull /data/tombstonesE://monkeylog//tombstones",\'r\') 42os.popen("adb pull /data/data/com.android.shell/files/bugreportsE://monkeylog//bugreports",\'r\') 43except Exception,e: 44print e 45 46 def main(): 47print """""" 48 49 50 if __name__=="__main__": 51 52packageName = \'ctrip.android.view\' 53myApp = monkeyTest() 54myApp.monkeyApp(packageName,500,100) 55#判断是否执行完成,执行完成后导出日志 56for i in range(1, 1000000): 57monkeylog = open(\'E:\\monkeylog\\monkeyScreenLog.log\') 58try: 59temp = monkeylog.read( ) 60finally: 61monkeylog.close( ) 62if temp.count(\'Monkey finished\')> 0: 63myApp.copyErrorLog() 64break 65else: 66time.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文件说明
【使用MonkeyTest对Android客户端进行压力测试 自动化代码】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分析示例
文章图片
推荐阅读
- 第六章:Android的Drawable
- Android之DOM解析XML
- (转)Android开发(5大布局方式详解)
- Appium Server 传递Android参数
- android应用程序第一次启动时显示引导界面
- Android学习总结——强制下线功能(广播)
- android清除本应用里的各种数据的方法
- 真机调试之android手机+chrome
- Android 开发:由模块化到组件化