autoMonkey框架原理与应用(四):autoMonkey框架
来源:互联网 发布:单片机延时时间计算 编辑:程序博客网 时间:2024/06/08 10:09
四、autoMonkey框架
【APP测试前瞻】
当前移动互联网已经过了草创时期,各家公司都在抢占市场和用户;那么,就看哪一家做的更精致(交互做的更好,崩溃出现的更少)。
Android用户也许会经常碰到以下的问题:
1.稳定性问题 —— ANR /Crash等问题;ANR是指当Android系统监测到应用程序在5秒内没有响应输入的事件或广播在10秒内没有执行完毕时抛出无响应提示。Crash是指当应用程序出现错误时导致程序异常停止或退出的情况。
2.性能问题 —— 应用启动慢(首次/非首次启动应用,进入应用特别慢),CPU不足/内存泄露(应用使用过程中,越来越卡),应用耗电快(应用后台开着,手机很快没电)等问题。
注:卡顿与ARN的问题。卡顿简单的来说,就是手机没有及时响应、页面延迟,出现丢帧的现象,或者点击无响应。绝大多数的卡顿,稍等片刻系统就会恢复正常,但假如超过5S,就可能会引发手机ANR警告。
APP测试涉及各个方面,而稳定性和性能测试一般在功能测试完成后开展。如何应用自动化测试场景,如图1所示:
图1 自动化测试应用场景
自动化框架的选择
1.autoMonkey框架:Android平台一般都会考虑使用系统自带的Monkey工具进行测试,此工具既易上手也实用,但运用起来有非常多的讲究和技巧,简单的Monkey工具不一定能完成使命,在测试中也需要花费心思去对Monkey进行封装改造(还可以修改原生的Monkey),以满足测试需求。
2.MBT(Model based testing):基于模型的测试。建模过程,通常是指对被测系统的某些方面的描述,以及对被测系统预期行为的抽象描述。FSM(有限状态机)用途最广泛,一般用于黑盒测试的建模。MBT与Monkey测试理论的结合,即放一只“猴子”在FSM模型中随机漫游,开展充分的稳定性测试。
本文是针对APP完成首轮功能测试后,使用autoMonkey框架进行稳定性和性能测试,从而提高产品的稳定性和留存率。知识结构分为四个部分,如图2所示:
图2 autoMonkey框架原理与应用
四、autoMonkey框架
根据上文对Monkey的介绍和分析,我们现在考虑如何封装autoMonkey框架就比较容易了。个人选择Windows系统下,以Python语言实现。基本思路是在Monkey测试的同时,再增加一个线程监测并记录CPU、内存、流量和流畅度等信息。其他功能封装在appShell.py和util.py两个文件中,因为代码较多,具体实现下载源代码。测试策略通过time类获取时间,区分白天工作时间,晚上和周末非工作时间(test_policy()方法)。如果要测试自己的APP,请在config.py中修改包名,如下:
# APP 包名config['G_APP_PACKAGE_NAME'] = 'xxx.xxx'
框架结构,如图7所示:
1)框架入口:start.py
2)参数预设:conf
3)核心逻辑:core
图7 autoMonkey框架结构
- 框架入口start.py,代码如下:
# encoding=utf-8import timeimport datetimeimport randomimport threadingimport unittestfrom conf.config import configfrom conf.setCondition import pre_condition, except_condition, post_condition, appfrom core.util import createLogPath, combineTestResultclass AutoMonkey(unittest.TestCase): def setUp(self): # 创建log目录 create_log_path() # 配置初始化参数,启动服务及记录日志等 pre_condition() def test_monkey(self): # 生成一个线程,实时记录内存、流量和流畅度等信息 app.start() time.sleep(2) # monkey 测试 package = config['G_APP_PACKAGE_NAME'] for i in xrange(1, 5): # 记录 logcat 日志 app.record_android_log(str(i) + config['U_LOGCAT_LOG']) try: print 'Round: {}'.format(i) seed = random.randint(100, 10000) count = random.randint(10000, 20000) monkey_log = str(i) + config['U_MONKEY_LOG'] traces_log = str(i) + config['U_TRACES_LOG'] # monkey 策略 policy, count = test_policy() # 执行 monkey 命令,并保存日志 app.run_monkey(package, 'L2', seed, 500, count, monkey_log, policy) # 分析 monkey 测试日志,统计结果 res = app.analyze_monkey_log(monkey_log) if res == 0: config['TEST_RESULTS']['PASS'] += 1 elif res == -1: config['TEST_RESULTS']['ANR'] += 1 # ANR时,导出 trace.txt 日志 app.get_error_log(traces_log) elif res == -2: config['TEST_RESULTS']['Exception'] += 1 elif res == -3: config['TEST_RESULTS']['CRASH'] += 1 elif res == -4: config['TEST_RESULTS']['OOM'] += 1 elif res == -5: config['TEST_RESULTS']['FAIL'] += 1 # 结束 logcat 进程 app.stop_running_process('logcat') # 结束 APP 进程 app.stop_running_app(config['G_APP_PACKAGE_NAME']) except Exception as error: # 异常处理 print str(error) except_condition(str(i)) print 'Test Results: ', config['TEST_RESULTS'] # 结束线程 app.stop() def tearDown(self): # 生成测试报告,绘制手机资源使用趋势图 combineTestResult(config['TEST_RESULTS'], config['TEST_DETAILS']) # 结束服务 post_condition()if __name__ == '__main__': unittest.main()
2.Monkey测试记录样例
1)Monkey测试结果概况,如图8所示:
图8 Monkey测试结果概况
2)被测手机的基本信息
图9 被测手机的基本信息
2)CPU使用趋势图,如图10所示:
图10 CPU使用趋势图
3)内存使用趋势图,如图11所示:
图11 内存使用趋势图
4)内存详情趋势图,如图12所示:
图12 内存详情趋势图
5)引用未释放的Activities趋势图,如图13所示:
图13 引用未释放的Activities趋势图
6)流量趋势图,如图14所示:
图14 流量趋势图
7)流畅度趋势图,如图15所示:
图 15 流畅度趋势图
PS:更多关于内存监控和分析,请参考个人博客“Android内存监控与分析”
内存泄漏(Memory Leak)与内存溢出(OOM)的表现
测试中最常遇见的内存泄漏测试场景
内存分析及原理
内存分析实例演示
- autoMonkey框架原理与应用(四):autoMonkey框架
- autoMonkey框架原理与应用(二):Monkey测试策略
- autoMonkey框架原理与应用(一):Monkey基础知识与测试场景
- autoMonkey框架原理与应用(三):Monkey测试的日志分析
- UI autoMonkey
- IOS Monkey测试UI AutoMonkey
- IOS Monkey测试UI AutoMonkey
- IOS压力测试工具:UI AUtoMonkey
- IOS Monkey测试UI AutoMonkey
- IOS压力测试工具:UI AUtoMonkey
- ACE主要应用框架与类别(二):Reactor反应式框架的工作原理示意图
- ACE主要应用框架与类别(三):Proactor前摄式框架的工作原理示意图
- 公司级框架原理解析(四)
- ACE主要应用框架与类别(四):结合Reactor反应器与Proactor前摄器的框架应用技术
- 与JUnit干杯 ---- JUnit框架的架构原理以及应用
- NFramework开源AOP框架ORM的实现原理与应用
- NFramework开源AOP框架ORM的实现原理与应用
- 软件需求最佳实践:SERU过程框架原理与应用
- linux中的正则表达式
- 以太坊下载地址及相关文档
- Android获取Mac地址-兼容6.0及以上系统
- Tensorflow实战学习(二十八)【实现简单卷积网络】
- 生活中有效的学习Java
- autoMonkey框架原理与应用(四):autoMonkey框架
- OGG单向复制(支持DDL)
- mysql分组,然后组内排序,最后取每组前2条数据
- 一键启动Android Studio 自带模拟器(命令行bat文件)
- iPhone is busy: Preparing debugger support for iPhone
- vimrc常用配置参数
- js 日期处理工具类
- 欢迎使用CSDN-markdown编辑器
- 在Salesforce中实现4级联动