Android技术博客

Android 自动化测试相关研究

做android开发也很长时间了,一直没有对自动化测试做过研究,这段时间不是很忙, 就先对想用的几个框架做下简单了解,日后在项目中逐步的去实践一下 。

稳定性测试利器 —— Monkey

Android自动测试之Monkey工具
Monkey信息自动收集脚本
Android命令Monkey压力测试,详解
Android Monkey Test:monkey各个命令解释的很详细

要想发布一个新版本,得先通过稳定性测试。理想情况是找个上幼儿园的弟弟妹妹,打开应用把手机交给他,让他胡乱的玩,看你的程序能不能接受这样的折腾。但是我们身边不可能都有正太和萝莉,也不能保证他们拿到手机后不是测试软件的健壮性,反而测试你的手机经不经摔,这与我们的期望差太远了…
Google公司考虑到我们的需要,开发出了Monkey这个工具。但在很多人的印象中,Monkey测试就是让设备随机的乱点,事件都是随机产生的,不带任何人的主观性。很少有人知道,其实Monkey也可以用来做简单的自动化测试工作。


Monkey测试是Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕、滑动Trackball、按键等操作来对设备上的程序进行压力测试,检测程序多久的时间会发生异常。


Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。monkey主要应用在压力和可靠性测试上,运行该命令可以随机地向目标程序发送各种模拟键盘事件流,并且可以自己定义发送的次数,以此观察被测应用程序的稳定性和可靠性,应用起来也比较简单,记住那几个命令就行了


  • Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar;
  • Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/system/bin/monkey;

这样就可以通过在CMD窗口中执行: adb shell monkey {+命令参数}来进行Monkey测试了。

简单使用
连上设备,执行adb shell ——> ls data/data ,查看可测试的应用程序包列表 ,然后执行monkey测试命令

1
adb shell monkey -p com.android.calculator2 -v 500

对几个常用命令做下解释:

常规命令

  • -help 列出简单用法

    1
    adb shell monkey -help
  • –v 用于指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别,分别对应的参数如下表所示:

    • 日志级别 Level0
      示例 adb shellmonkey -p com.htc.Weather –v 100
      说明 缺省值,仅提供启动提示、测试完成和最终结果等少量信息
    • 日志级别 Level 1
      示例 adb shellmonkey -p com.htc.Weather –v -v 100
      说明 提供较为详细的日志,包括每个发送到Activity的事件信息
    • 日志级别 Level 2
      示例 adb shellmonkey -p com.htc.Weather –v -v –v 100
      说明 最详细的日志,包括了测试中选中/未选中的Activity信息

事件

  • 参数 -s 用于指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的。
    示例:
     Monkey测试1:adb shell monkey -p com.htc.Weather –s 10 100
    Monkey 测试2:adb shell monkey -p com.htc.Weather–s 10 100
    两次测试的效果是相同的,因为模拟的用户操作序列(每次操作按照一定的先后顺序所组成的一系列操作,即一个序列)是一样的。操作序列虽 然是随机生成的,但是只要我们指定了相同的Seed值,就可以保证两次测试产生的随机操作序列是完全相同的,所以这个操作序列伪随机的。
  • –throttle
    在事件之间插入固定的时间(毫秒)延迟,你可以使用这个设置来减缓Monkey的运行速度,如果你不指定这个参数,则事件之间将没有延迟,事件将以最快的速度生成。
    1
    adb shell monkey --throttle 300 -v 10

注:常用参数,一般设置为300毫秒,原因是实际用户操作的最快300毫秒左右一个动作事件,所以此处一般设置为300毫秒。

约束条件

  • 其中-p用于约束限制,用此参数指定一个或多个包(Package,即App)。指定包之后,Monkey将只允许系统启动指定的APP ,允许访问这些包中的Activity。如果不指定包,Monkey将允许系统启动设备中的所有APP。

    • 指定一个包: adb shell monkey -p com.htc.Weather 100
      说明:com.htc.Weather为包名,100是事件计数(即让Monkey程序模拟100次随机用户事件)。
    • 指定多个包:adb shell monkey -p com.htc.Weather –p com.htc.pdfreader -p com.htc.photo.widgets 100
  • 其他配置项

1
--ignore-crashes

作用:通常,应用发生崩溃或异常时Monkey会停止运行。如果设置此项,Monkey将继续发送事件给系统,直到事件计数完成。

1
--ignore-security-exception

作用:通常,当程序发生许可错误(例如启动一些需要许可的Activity)导致的异常时,Monkey将停止运行。设置此项,Monkey将继续发送事件给系统,直到事件计数完成。

  • 记录测试日志
1
adb shell monkey -p com.ihongqiqu --throttle 300 -v -v -v 500 > monkeytest.txt

monkey测试运行过程中,Emulator中的应用程序在不断地切换画面。
按照选定的不同级别的反馈信息,在Monkey中还可以看到其执行过程报告和生成的事件。

关于Monkey测试的停止条件
Monkey Test执行过程中在下列三种情况下会自动停止:

  1. 如果限定了Monkey运行在一个或几个特定的包上,那么它会监测试图转到其它包的操作,并对其进行阻止。
  2. 如果应用程序崩溃或接收到任何失控异常,Monkey将停止并报错。
  3. 如果应用程序产生了应用程序不响应(application not responding)的错误,Monkey将会停止并报错。
    通过多次并且不同设定下的Monkey测试才算它是一个稳定性足够的程序。

使用脚本

先简单介绍下Monkey的API,若有需要详细了解的小伙伴,可自行百度或谷歌一下查阅哈。

  • 轨迹球事件:DispatchTrackball(参数1~参数12)
  • 输入字符串事件:DispatchString(String text)
  • 点击事件:DispatchPointer(参数1~参数12)
  • 启动应用:LaunchActivity(String pkg_name, String class_name)
  • 等待事件:UserWait(long sleeptime)
  • 按下键值:DispatchPress(int keyCode)
  • 长按键值:LongPress(int keyCode)
  • 发送键值:DispatchKey(参数1~参数8)
  • 打开软键盘:DispatchFlip(Boolean keyboardOpen)
    了解完常用API后,我们来看一下Monkey脚本的编写规范。Monkey Script是按照一定的语法规则编写的有序的用户事件流,使用于Monkey命令工具的脚本。Monkey脚本一般以如下4条语句开头:
    1
    2
    3
    4
    5
    # Start Script
    type = user #指明脚本类型
    count = 10 #脚本执行次数
    speed = 1.0 #命令执行速率
    start data >> #用户脚本入口,下面是用户自己编写的脚本

编写完脚本之后,放到手机sd卡,执行以下命令

1
adb shell monkey -v -f /mnt/sdcard/HelloMonkey 1

脚本后面的数字1表示运行该脚本的次数

如何分析测试结果

Monkey测试的og分析,我们可以通过几个关键词来判断测试是否通过。

  1. Monkey finished
    打开LOG,查看log的最下端,是否有类似以下字段:
    1
    2
    ## Network stats: elapsed time=5123ms (5123ms mobile, 0ms wifi, 0ms not connected)
    // Monkey finished

这个字段表明本次的Monkey没有异常,测试通过。

  1. CRASH
    同样,在得到LOG后,搜索”CRASH”字段,如果搜索到有结果,则表明有进程出现问题,测试不通过。

    1
    // CRASH: com.onekchi.downloadmanager (pid 12919)
  2. ANR
    在Log中搜素该字段,如果有搜索有结果,则表示测试过程中,测试对象出现了无响应的现象,因此测试不通过。–throttle <毫秒>值建议为500

Monkey总结

Monkey可以编写脚本做简单的自动化测试,但局限性非常大,例如无法进行截屏操作,不能简单的支持插件的编写,没有好的办法控制事件流,不支持录制回放等。我们在平时的使用中,关注较多的是利用好Monkey的优势,如不需源码,不需编译就可以直接运行。

Monkey之子 —— MonkeyRunner

Monkey虽然能实现部分的自动化测试任务,但本身有很多的局限性,例如不支持截屏,点击事件是基于坐标的,不支持录制回放等。我们在实际应用中,尽量关注利用好Monkey测试的优势。若平时的工作中遇到Monkey工具无法满足的,这里给大家推荐另一款工具MonkeyRunner。


monkeyrunner是android SDK中自带的工具之一,提供了API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器。通过monkeyrunner,您可以写出一个Python程序去安装一个Android应用程序或测试包,运行它,向它发送模拟击键,截取它的用户界面图片,并将截图存储于工作站上。monkeyrunner工具的主要设计目的是用于测试功能/框架水平上的应用程序和设备,或用于运行单元测试套件,但您当然也可以将其用于其它目的。

优点:操作最为简单,可以录制测试脚本,可视化操作;
缺点:主要生成坐标的自动化操作,移植性不强,功能最为局限;脚本用Python来写,对测试人员来说要求较高,有比较大的学习成本。
和上面的monkey对比

  • Monkey工具直接运行在设备或模拟器的adb shell中,生成用户或系统的伪随机事件流。
  • monkeyrunner工具则是在工作站上通过API定义的特定命令和事件控制设备或模拟器。

monkeyrunner,它主要可应用于功能测试,回归测试,并且可以自定义测试扩展,灵活性较强,并且测试人员可以完全控制。


先简单的介绍下MonkeyRunner的API,这里重点介绍能够实现上文Monkey脚本的API,其余的API感兴趣的小伙伴可以自行查阅。

  • 等待设备连接:waitForConnection()
  • 安装apk应用:installPackage(String path)
  • 启动应用:startActivity(String packageName+activityName)
  • 点击事件:touch(int xPos, int yPos, dictionary type)
  • 输入事件:type(String text)
  • 等待:sleep(int second)
  • 截图:takeSnapshot()
  • 发送键值:press(String name, dictionary type)

总结

MonkeyRunner有很多强大并好用的API,并且支持录制回放和截图操作。同样它也不需源码,不需编译就可以直接运行。但MonkeyRunner和Monkey类似,也是基于控件坐标进行定位的,在实际项目中,控件坐标往往是最不稳定的,随时都有可能因为程序员对控件位置的调整而导致脚本运行失败。

Rubotium

要针对某一个APK进行自动化测试,APK可以有源码,也可以没有源码,功能强大;缺点是针对APK操作,而且需要对APK重新签名(有工具),因此操作相对复杂;

Espresso

Espresso 官方文档
Android Espresso 测试框架介绍

Espresso 是一个提供了简单 API 的用于 android app UI 测试的测试框架。


是Google的开源自动化测试框架。相对于Robotium和UIAutomator,它的特点是规模更小、更简洁,API更加精确,编写测试代码简单,容易快速上手。因为是基于Instrumentation的,所以不能跨App。

终极自动化测试框架 —— UI Automator

在Android 4.1发布的时候包含了一种新的测试工具–[uiautomator]
优点:可以对所有操作进行自动化,操作简单;
缺点:Android版本需要高于4.0,无法根据控件ID操作,相对来说功能较为局限,但也够用了


也是基于Instrumentation的测试框架,目前国内外用的比较多,资料比较多,社区也比较活跃。缺点是对测试人员来说要有一定的Java基础,了解Android基本组件,不能跨App。

Athrun

Athrun是淘宝出的一个移动测试框架平台,同时支持iOS和Android。Android部分也是基于Instrumentation,在Android原有的ActivityInstrumentationTestCase2类基础上进行了扩展,提供一整套面向对象的API。这里**有详细介绍。作者:Li7tleMK链接:https://www.zhihu.com/question/19716849/answer/42525356来源:知乎著作权归作者所有,转载请联系作者获得授权。

参考文档

你应该知道的5个Android自动测试工具
世界级的Android测试开发流程(二)
5小时搞定谷歌原生自动化框架UiAutomator1.0
手把手教你Android标准App的四大自动化测试法宝