android实用测试方法之Monkey与MonkeyRunner

简介:

前言

本人比较懒,但是,研究如何让人变懒,却很积极…最新版的android SDK 4.0 ,monkey和monkeyRunner,变化很大…大到默认是运行失败的…囧,虽然,monkey和monkeyrunner目前有些不完善,但是,足以应付我们的使用需要.(最新的R15已经解决了这个问题更新真快…)

Android UI 测试懒人第一:胡乱的按键,交给电脑搞定

有时候,我们要折腾一下程序,健壮不健壮,然后,找个上幼儿园的的弟弟/妹妹,把手机交给他/她,让他/她胡乱的按,看你的程序能不能接受这样的折腾,但是,我们身边不可能都有正太和萝莉,也不能保证他们拿到手机以后不是测试软件的健壮性,反而测试你的手机经不经摔,这与我们的期望差太远了…毕竟咱们是来软的不是来硬的…

当然,这世界牛人一把把的,然后,google公司考虑到我们的需要,把找个由某个牛人写的程序,集成到了比较新版本的SDK R8(即 android 2.2以后),然后,就有了下文

monkey 的使用

Monkey的智力就是一个三岁小孩的水平,所以,使用起来也是非常简单,当然,也做不了什么复杂的东西

adb shell monkey [options] <event-count>

详细的monkey介绍,和options的参数请查看

http://developer.android.com/guide/developing/tools/monkey.html

这里就不重复造轮子了…

实例:

我们验证程序在随机1000次事件中,能不能正常运行下去

adb shell monkey -p your.package.name -vvv 1000 > monkey1000.txt

 

-v 为 verbose的缩写,就是详细输出事件等级,这个3个v就是输出等级1至3的所有事件,然后再使用管道命令将输出结果放到一个文本里面方便查看.接下来就是看你的程序能不能在这样的折腾下坚持下去了.

以上截个图看看吧

------------------------------以下为折腾星人研究参考资料------------------------------

然后,补充一下官方文档并没有更新的参数…不信你自己对照着来看,如果,你看到时候,官方更新了我说的这个,希望能回复我一下,让我更新一下…

主要多了两个参数:

这里我贴一个,国外有人用本地指定scriptfile成功的使用

 

I am trying to do 2 things with monkey

1. Execute a script with a command like

adb shell monkey -p MY_PACKAGE --setup scriptfile -f /sdcard/ mon_script1.txt 1

where mon_script.txt contains a few touch commands. After I execute this, I see nothing happening on the screen. It even does not give me the "Number of events injected message". I have verified that my touch co-ordinates fall over actual UI elements.

This is the script file I am using

tap 79 29 tap 100 100 tap 200 200 tap 300 300 quit

2. Execute Monkey Network control to type commands individually. I start up monkey to listen to a port and use PuTTY to send commands. I get "OK" return messages, but nothing happens on the screen.

Whenever I use monkey in the random mode, I see interaction on the screen. But I need to get one of the above 2 methods to work. I have seen the sources of monkey and nothing seems to be wrong. Has anyone used monkey in the above described way? If so, please tell me what I am doing wrong.

使用远程monkey 的代码模板

adb –e shell monkey -p your.pakagename --port 1080 & 

 

然后重定向我们的模拟器端口

adb -e forward tcp 1080 tcp 1080

然后telnet 的我们的模拟器

telnet localhost 1080

接着telnet成功以后据说可以这样

tap 150 200

----以上代码来源于Android application Test Guide 书中

然后,就可以看到我们控制UI事件了,可惜的是,我怎么测试都不能成功…

小结:

目前看来,monkey这个程序其实并不完善,有些功能连官方文档都还没更新,不过,作为折腾应用的使用还是足够的,看着自己的程序在模拟器中不断的被折磨…接下来要讲就是Monkey的进化--->MonkeyRunner

MonkeyRunner

如果,把现阶段的monkey比做是幼儿园的小孩,那么monkeyrunner就是一个初中生了…它支持,自己编写插件,控制事件,随时截图,简而言之,任何你在模拟器/设备中能干的事情,MonkeyRunner都能干,而且还可以记录和回放!!!

具体介绍…看官方文档.这里还是不重复造轮子

http://developer.android.com/guide/developing/tools/monkeyrunner_concepts.html

注意:android sdk r14并没有把一个关键的jar包放lib目录中,所以,将无法运行,…然后请将SDK TOOLS 直接更新到最新的R15

下面提供一些常用的脚本,自己看着来改吧..

monkey_recorder.py

monkey_placback.py

help.py

http://115.com/file/e6r0sln9# 
monkeyrunner_py脚本.rar

虽然,少了些东西,但是,并不影响我们大部分的需要.接下来用一段典型的monkeyRunner代码讲解!

注意!如果monkeyrunner脚本文件要使用中文,记得格式保存为utf8,不然会ASCNII(忘了怎么拼写了..)无法支持错误


 
 
  1. #导入我们需要用到的包和类并且起别名  
  2. import sys  
  3. from com.android.monkeyrunner import MonkeyRunner as mr  
  4. from com.android.monkeyrunner import MonkeyDevice as md  
  5. from com.android.monkeyrunner import MonkeyImage as mi  
  6.  
  7. #connect device 连接设备  
  8. #第一个参数为等待连接设备时间  
  9. #第二个参数为具体连接的设备  
  10. device = mr.waitForConnection(1.0,'emulator-5554')  
  11. if not device:  
  12.     print >> sys.stderr,"fail" 
  13.     sys.exit(1)  
  14. #定义要启动的Activity  
  15. componentName='kg.monkey/.MonkeyActivity' 
  16. #启动特定的Activity  
  17. device.startActivity(component=componentName)  
  18. mr.sleep(3.0)  
  19. #do someting 进行我们的操作  
  20. #输入 a s d  
  21. device.type('asd')  
  22. #输入回车  
  23. device.press('KEYCODE_ENTER')  
  24. #return keyboard 点击返回用于取消等下看到截图的下方的白条  
  25. #device.press('KEYCODE_BACK')  
  26. #------  
  27. #takeSnapshot截图  
  28. mr.sleep(3.0)  
  29. result = device.takeSnapshot()  
  30.  
  31. #save to file 保存到文件  
  32. result.writeToFile('takeSnapshot\\result1.png','png'); 

以上代码就是用monkeyrunner 实现操作特定操作以后,并且截图的功能,看上去貌似挺麻烦的…如果你有很多设备要一起测试,你就会发现以上代码是多么爽丫丫的事情.这个脚本的实质就是一个python脚本,懂点,python的朋友,可以利用这个实现非常强悍的功能.这里就打住了,各位想到什么好玩,实用的记得回复一下…大家一起交流.

monkeyRunner 的记录和回放

前面讲的都是一些在命令行上的操作,我可记不住那么多的指令操作,我可不知道,我点击的这个点的坐标是多少,我多么希望,我能够在可视化界面里面讲我的操作记录下来,然后,直接重新播放,就像宏一样,我可以很高兴的告诉你,MonkeyRunner有这个功能实现起来也非常简单,我提供的打包文件中有一个,monkey_recorder.py,直接在命令行中打上:


 
 
  1. monkeyrunner monkey_recorder.py 

例如我们删掉我们刚才的asd字符串它就会记录下我们所有的操作!,就会看到如上截图!!!

接下来运行我们的保存的脚本,然后,你就看到模拟器,进行你刚才一样的操作

 

   
   
  1. monkeyrunner monkey_playback.py monkey_test.mr 

打开我们的文件可以看到其实就是一些monkeyrunner的一些脚本

TOUCH|{'x':329,'y':132,'type':'downAndUp',} 
TOUCH|{'x':100,'y':100,'type':'downAndUp',} 
TOUCH|{'x':296,'y':407,'type':'downAndUp',} 
TOUCH|{'x':296,'y':407,'type':'downAndUp',} 
TOUCH|{'x':296,'y':407,'type':'downAndUp',} 
TOUCH|{'x':296,'y':407,'type':'downAndUp',} 
TOUCH|{'x':351,'y':227,'type':'downAndUp',}

 

当然,有界面为什么不用呢~~~呵呵~

补充一点:如果我们要进行多设备测试怎么办呢?

我们可以打开monkey_playback.py文件


 
 
  1. import sys from com.android.monkeyrunner import MonkeyRunner     
  2. # The format of the file we are parsing is very carfeully constructed.   
  3. # Each line corresponds to a single command.  The line is split into 2   
  4. # parts with a | character.  Text to the left of the pipe denotes   
  5. # which command to run.  The text to the right of the pipe is a python   
  6. # dictionary (it can be evaled into existence) that specifies the   
  7. # arguments for the command.  In most cases, this directly maps to the   
  8. # keyword argument dictionary that could be passed to the underlying   
  9. # command.      
  10. # Lookup table to map command strings to functions that implement that   
  11. # command. CMD_MAP = {     'TOUCH': lambda dev, arg: dev.touch(**arg),       
  12. 'DRAG': lambda dev, arg: dev.drag(**arg),       
  13. 'PRESS': lambda dev, arg: dev.press(**arg),       
  14. 'TYPE': lambda dev, arg: dev.type(**arg),       
  15. 'WAIT': lambda dev, arg: MonkeyRunner.sleep(**arg)     }     
  16. # Process a single file for the specified device. def process_file(fp, device):       
  17. for line in fp:         (cmd, rest) = line.split('|')           
  18. try:               
  19. # Parse the pydict               
  20. rest = eval(rest)           
  21. except:               
  22. print 'unable to parse options'            continue            
  23. if cmd not in CMD_MAP:               
  24. print 'unknown command: ' + cmd             continue            
  25. CMD_MAP[cmd](device, rest)       
  26. def main():     file = sys.argv[1]     fp = open(file, 'r')       
  27. #在这里指定你的设备吧       
  28. device = MonkeyRunner.waitForConnection()           process_file(fp, device)       
  29. fp.close();           
  30. if __name__ == '__main__':       
  31. main() 

小结

至此,monkeyrunner的常用方式就这样完了,这里不打算说怎么编写一个自己的monkeyrunner插件,因为,我觉得我以上介绍的功能在实际开发中基本够用,而且,monkeyrunner估计,在下一个版本中会有一些更新,有兴趣的同学,自己查阅官方文档,当然,也可以联系本人…


本文转自 liam2199 博客,原文链接:   http://blog.51cto.com/youxilua/772666如需转载请自行联系原作者

相关文章
|
3月前
|
数据采集 监控 机器人
浅谈网页端IM技术及相关测试方法实践(包括WebSocket性能测试)
最开始转转的客服系统体系如IM、工单以及机器人等都是使用第三方的产品。但第三方产品对于转转的业务,以及客服的效率等都产生了诸多限制,所以我们决定自研替换第三方系统。下面主要分享一下网页端IM技术及相关测试方法,我们先从了解IM系统和WebSocket开始。
80 4
|
1月前
|
编解码 缓存 Prometheus
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
本期内容为「ximagine」频道《显示器测试流程》的规范及标准,我们主要使用Calman、DisplayCAL、i1Profiler等软件及CA410、Spyder X、i1Pro 2等设备,是我们目前制作内容数据的重要来源,我们深知所做的仍是比较表面的活儿,和工程师、科研人员相比有着不小的差距,测试并不复杂,但是相当繁琐,收集整理测试无不花费大量时间精力,内容不完善或者有错误的地方,希望大佬指出我们好改进!
100 16
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
|
27天前
|
缓存 Java 测试技术
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
165 3
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
|
1月前
|
人工智能 自然语言处理 测试技术
AxBench:斯坦福大学推出评估语言模型控制方法的基准测试框架
AxBench 是由斯坦福大学推出,用于评估语言模型可解释性方法的基准测试框架,支持概念检测和模型转向任务,帮助研究者系统地比较不同控制技术的有效性。
49 5
AxBench:斯坦福大学推出评估语言模型控制方法的基准测试框架
|
5月前
|
测试技术 API 项目管理
API测试方法
【10月更文挑战第18天】API测试方法
109 1
|
5月前
|
安全 测试技术
北大李戈团队提出大模型单测生成新方法,显著提升代码测试覆盖率
【10月更文挑战第1天】北京大学李戈教授团队提出了一种名为“统一生成测试”的创新方法,有效提升了大模型如GPT-2和GPT-3在单一测试中的代码生成覆盖率,分别从56%提升至72%和从61%提升至78%。这种方法结合了模糊测试、变异测试和生成对抗网络等多种技术,克服了传统测试方法的局限性,在大模型测试领域实现了重要突破,有助于提高系统的可靠性和安全性。然而,该方法的实现复杂度较高且实际应用效果仍需进一步验证。论文可从此链接下载:【https://drive.weixin.qq.com/s?k=ACAAewd0AA48Z2kXrJ】
121 1
|
5月前
|
测试技术 UED
软件测试中的“灰盒”方法:一种平衡透明度与效率的策略
在软件开发的复杂世界中,确保产品质量和用户体验至关重要。本文将探讨一种被称为“灰盒测试”的方法,它结合了白盒和黑盒测试的优点,旨在提高测试效率同时保持一定程度的透明度。我们将通过具体案例分析,展示灰盒测试如何在实际工作中发挥作用,并讨论其对现代软件开发流程的影响。
|
2月前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
44 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
4月前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法。本文介绍 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,同时提供 Python 实现示例,强调其在确保项目性能和用户体验方面的关键作用。
88 6
|
4月前
|
JavaScript 安全 编译器
TypeScript 与 Jest 测试框架的结合使用,从 TypeScript 的测试需求出发,介绍了 Jest 的特点及其与 TypeScript 结合的优势,详细讲解了基本测试步骤、常见测试场景及异步操作测试方法
本文深入探讨了 TypeScript 与 Jest 测试框架的结合使用,从 TypeScript 的测试需求出发,介绍了 Jest 的特点及其与 TypeScript 结合的优势,详细讲解了基本测试步骤、常见测试场景及异步操作测试方法,并通过实际案例展示了其在项目中的应用效果,旨在提升代码质量和开发效率。
90 6

热门文章

最新文章