Android Monkey压力测试

发表于:2017-11-02 14:19

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:JJQ3    来源:51Testing软件测试网采编

  作为一个客户端开发者选手来说,了解熟悉一些测试技巧还是很有必要的。最近这段时间特意去钻研了下当下比较流行的一些测试框架。这一篇先来讲讲Monkey以及与之相关的MonkeyRunner。
  那么Monkey到底有什么用处呢?来看官方解释:
  The Monkey is a program that runs on your emulator or device and 
  generates pseudo-random streams of user events such as clicks,
   touches, or gestures, as well as a number of system-level
   events. You can use the Monkey to stress-test applications that 
  you are developing, in a random yet repeatable manner.
  Monkey就是一个跑在你的设备或者虚拟机上的一段程序,生成一些类似点击,触摸或者手势相关的用户事件的事件流,以及许多的系统级事件。可以使用Monkey来随机且重复的形式对正在开发的应用进行压力测试
  压力测试的意义其实大家都知道,为了程序的健壮性跟稳定性,这些虚的东西就不多说了。
  先来看Monkey的基础用法:
  adb shell monkey [options] <event-count>
  如果不指定任何options,默认会对Android模拟器或者你连接的真机设备进行Monkey测试,event-count也就是压力测试随机事件随机事件的次数。 下面是给制定的应用进行压力测试的命令:
  adb shell monkey -p your.package.name -v 500
  当然这个命令的事件也都是随机事件。
  除此以外,Monkey还有很多其他用法。
  adb shell monkey -s <seed> <event-count>
  seed命令的意义何在呢?ok,来讲这么一个场景。测试人员对应用进行随机事件的压力测试,测试过程中发现了一个bug。然后交给开发人员,开发人员对这个bug进行修复,修复完了测试要进行检验。那么因为之前是随机事件的压测,所以测试人员根本不知道怎么去复现出来对吧,这个时候seed参数就有用处了。。压力测试的时候制定seed多少,同一个seed参数,压力测试的过程是一样的。所以,当出现上述情况的时候,测试人员只要制定相同的seed就可以复现之前的测试过程了。
  实际操作中,Monkey这里有一个很人性化的设计,我走了一遍流程发现即使你第一次压力测试忘记制定seed了,但是应用crash了,monkey会把这次命令的seed值返回给你,测试人员记下这个seed就可以了。这个命令在实际开发过程中是最基本的。
  adb shell monkey --throttle <milliseconds>
  这个命令的意义就是在两个事件之间插入一个时间间隔。开发者可以使用这个命令去减缓事件的操作速度。 这里就讲这两个主要命令,其他命令基本上都是指定相对应的随机事件的比例,比如触摸事件和菜单上的键位比例等。。。我觉得实际开发中不太用得到,也比较简单感兴趣的可以看下官网,所有命令都有罗列: https://developer.android.com/studio/test/monkey.html
  ok,上面讲的都是随机事件的操作。接下来看固定事件的压力测试,也就是写一个Monkey脚本,然后模拟器或者真机去不断的去执行这个脚本。
  adb shell monkey -f <scriptfile> <event-count> 
  这里的scriptfile也就是我们要写的Monkey脚本文件,那么这个脚本文件应该怎么来写呢?下面来看MonkeyScript相对应的命令API:
  WX20170831-151537.png
  接下来对MonkeyScript讲一个简单的小例子:
  typ=user
  count=10
  speed=1.0
  start data >> 
  LaunchActivity(com.jjq.example, .MainActivity)
  UserWait(2000)
  DispatchPointer(........)
  UserWait(2000)
  前面四行在写的时候直接copy就可以了,接下来启动app,最后在每次操作期间都给一定时间缓冲。然后就可以做很多其他操作了,点击啊,输入啊什么的。。。。就是上面的各个API的操作,很简单就不详述了。
  ok,讲完Monkey脚本之后,再来讲MonkeyRunner,为什么要有MonkeyRunner这个东西呢?其实MonkeyRunner就是一个功能更强大,API更完整的Monkey脚本。比如截图功能,MonkeyScript就是不支持的。官方文档可以看这里:https://developer.android.com/studio/test/monkeyrunner/MonkeyDevice.html
  MonkeyRunner分为三种: MonkeyDevice:MonkeyDevice 主要针对的是一些UI事件,安装和删除应用程序,运行应用程序等。 MonkeyImage:MonkeyImage用来保存设备或者模拟器屏幕的图像。该类下的方法允许开发者将图像转换成任何存储格式,将图像写入文件,复制图像,并将此对象与其他的MonkeyImage进行比较 MonkeyRunner:MonkeyRunner包含了一些弹窗啊,输入啊休眠等方法。
  具体每个类下的api方法直接进官网看吧,官网把所有api全部都罗列出来了而且介绍的很详细,这里我就直接举个MonkeyRunner的测试脚本的例子: 我写了一个很简单的一个加法demo(样式什么的不要在意这种细节。。)点击add按钮,textView显示结果,点击clear按钮清除,就对这些整个的操作进行功能性测试写一套MonkeyRunner的Python脚本好了。看下界面:
  WX20170831-111019@2x.png
  先来捋一下整个页面的操作流程: 1、点击edittext1获取焦点 2、输入1 3、点击back退出小键盘 4、点击edittext2获取焦点 5、输入2 6、点击back退出小键盘 7、点击add按钮 8、截图保存 9、点击clear按钮
  流程就是这么简单,接下来的任务就是把这个流程转换为python脚本语句了。
  #!/usr/bin/python
  # -*- coding: utf-8 -*-
  from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
  #连接设备
  device = MonkeyRunner.waitForConnection(3, "192.168.56.101:5555")
  #启动App
  device.startActivity("com.jjq.add/.MainActivity")
  MonkeyRunner.sleep(2)
  #点击输入框1
  device.touch(172, 390, "DOWN_AND_UP")
  MonkeyRunner.sleep(1)
  device.type("1")
  MonkeyRunner.sleep(1)
  #点击back
  device.press("KEYCODE_BACK", "DOWN_AND_UP")
  MonkeyRunner.sleep(1)
  #点击输入框2
  device.touch(262, 651, "DOWN_AND_UP")
  MonkeyRunner.sleep(1)
  device.type("2")
  MonkeyRunner.sleep(1)
  #点击back
  device.press("KEYCODE_BACK", "DOWN_AND_UP")
  MonkeyRunner.sleep(1)
  #点击ADD按钮
  device.touch(253, 924, "DOWN_AND_UP")
  MonkeyRunner.sleep(2)
  #截图
  image = device.takeSnapshot()
  image.writeToFile('./test.png', 'png')
  #点击clear按钮
  device.touch(220, 1195, "DOWN_AND_UP")
  MonkeyRunner.sleep(2)
  tips:如果你要获取点击的屏幕坐标,你可以去设备开发者选项中打开指针位置选项(屏幕叠加层显示当前触摸数据)。
  前面两句话一定不要忘,忘了会报Non-ASCII character in file错误。
  至于设备地址,可以通过adb devices来获取,我这里是用的genymotion。
  最后打开iTerm,输入:
  monkeyrunner monkey.py
  当然在这之前你需要先给monkeyrunner配置下环境变量,monkeyrunner在你adb目录下的tools文件夹里。。
  最后来看下保存下来的截图:
  test.png
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号