稳定性测试 | 可定制模块级的内核稳定性工具
joggerhe
8年前
<h2>背景介绍</h2> <p>稳定的产品质量是留住用户的第一道阀门,所以稳定性测试是常规测试中必不可少的。这周我们介绍百度应用比较广泛的两款稳定性工具: <strong> 系统级稳定性测试工具 SmartMonkey </strong> 和 <strong> 可定制模块级别的内核稳定性工具 </strong> 。</p> <p>无论原生monkey,还是智能优化后的UI遍历的smartmonkey测试,都是一种系统集成级别的稳定性测试,下面介绍一种模块级别的稳定性测试方法。</p> <p>稳定性测试是移动端产品专线测试中的重要一项测试,是移动端产品保证稳定性的重要手段,也是移动端产品发版上线的一个重要质量标准。 Android 系统一般使用系统自带的 monkey 工具来做稳定性测试。</p> <h2>原生Monkey工具缺点</h2> <p>原生 monkey 工具是一种随机 UI 事件流,用来测试长时间随机操作是否会导致应用出现异常。因为原生 monkey 操作的随机性,所以在实际使用过程中,原生 monkey 会暴露出以下一些缺点:</p> <p>1)原生 monkey 的测试对象是针对整个 Android 系统或者某个应用,但是无法针对应用里的某个模块或者界面。这样在产品迭代过程中存在的一个局限是:每个迭代时做的稳定性测试都重新做一遍,而无法针对该迭代新增的功能模块做单独的稳定性测试(或者叫做增量稳定性测试)。</p> <p>以百度云这个应用为例,在某个迭代中集成了“百度钱包”这个新模块,使用原生的 monkey 工具可能出现的现象是大部分操作可能都落在了百度云的其他模块,而没有操作到“百度钱包”这个模块。</p> <p>所以,我们期望的稳定性测试能够从系统和应用级范围转移到模块或者 activity 级别的范围。</p> <p><img src="https://simg.open-open.com/show/7c98f6012f4ffe51fedb883a54ac6d56.jpg"></p> <p>2)原生 monkey 工具的操作是随机的,这样可能导致一些用户路径操作不到或者操作时间过短;以百度直达号的支付业务为例,所有的支付操作必须是基于百度账号登录的前提下才能进行,这样在支付时就必须经历登录百度账号这个用户路径。那么问题来了,原生 monkey 因为是随机的,无法输入指定的用户名 / 密码来登录百度账户。</p> <h2>实现业务化配置</h2> <p>1.支持特定模块或者Activity</p> <p>实现思路</p> <p>一般进入一个模块会有一个固定的入口,而退出这个模块,也会退回到这个固定入口界面。在使用时,每次操作之后都去检查当前的界面是否为该界面,如果是,则去点击这个入口控件,就回到了这个模块,继续测试;这样即可保证稳定性测试一直保持在这个模块中进行。</p> <p>检测到当前界面为关注的 activity 时,通过与手机上的 ViewServer 通信,获取该 activiy 的控件信息,得到指定的控件的坐标信息;再对这个坐标做一个点击的操作,即回到了指定的模块界面。</p> <p>使用方法</p> <p>在执行 monkey 命令时扩展一个 sa 参数,参数格式是 package/activity/item ,通过该参数可指定入口界面元素;同时再扩展一个 ea 参数,参数格式也是 package/activity/item ,通过该参数指定出口界面元素,当碰到出口界面元素时再次主动进入入口界面。</p> <p>2.配置业务操作及比例</p> <p>实现思路</p> <p>大家知道,执行 monkey 命令时需要配置各个事件的比例,而该优化点的思路就是将业务操作写成自动化脚本,然后将该脚本抽象成一个 monkey 事件,并且可以配置执行比例。</p> <p>使用方法</p> <p>在执行 monkey 命令时扩展一个 m 参数,参数格式是 脚本路径 --pct-custom 业务比例</p> <p>例如,测试百度浏览器时定期去打开百度首页:</p> <ul> <li> <p>将脚本 browser_test.shpush 到 /data/local/tmp/ 目录下 ( 需要保证 browser_test.sh 有可执行权限 )</p> </li> <li> <p>monkey 命令参数配置 -m /data/local/tmp/browser_test.sh --pct-custom 5</p> </li> </ul> <h2>工具使用环境配置</h2> <p>从以上介绍可知,原生monkey测试技术的改进需要扩展monkey命令参数,为了实现这点,需要对Android官方自带的monkey.jar包进行源码修改,然后重新编译生成一个新的monkey jar包。下面的介绍是针对新monkey jar生成以后用户的配置步骤,而对于android各平台的monkey jar的下载地址可参考附录。</p> <ol> <li> <p>根据 android 平台版本,将对应平台的 monkey.jar push 到 /data/local/tmp/monkey.jar</p> </li> <li> <p>生成以下可执行文件 /data/local/tmp/monkey</p> </li> </ol> <p># Script to start"monkey" on the device, which has a very rudimentary</p> <p># shell.</p> <p>#</p> <p>base=/data/local/tmp</p> <p>exportCLASSPATH=$base/monkey.jar</p> <p>trap ""HUP</p> <p>exec app_process/system/bin com.android.commands.monkey.Monkey $*</p> <ol> <li> <p>对 data/local/tmp/monkey 增加执行权限</p> </li> <li> <p>使用该扩展功能的 monkey 运行命令类似:</p> </li> </ol> <p>adb -d shell/data/local/tmp/monkey -s 0 -p packagename --throttle 2000 --pct-touch 15--kill-process-after-error --pct-nav 25 --pct-majornav 15 --pct-appswitch 2--pct-anyevent 16 --monitor-native-crashes -a package/activity/itemname/[index]-v -v 100</p> <p>-a 参数即指定需要关注的 activity ,以及入口控件名称,格式为:</p> <p>-apackage/activity/itemname/[index]</p> <p>其中, package/activity 可通过 HierarchyViewer 来查看,如下图</p> <p><img src="https://simg.open-open.com/show/0aa405f24e4855bbac91e5fc6b443eb8.jpg"></p> <p>itemname 也可通过 HierarchyViewer 来查看,如下图</p> <p><img src="https://simg.open-open.com/show/ec319d701ece6552dfed030fec75f3fc.jpg"></p> <p>index 是指这个 item 名称在这个界面上出现的位置,使用 hierarchyviewer 从上面开始数从左到右,从上到下。例如,关注的 item 名称为 TextView ,需要从 hierarchyviewer 上看,从左到右,从上到下数所有出现的 TextView ,找到关注的 TextView 的 index 。</p> <p>Index 是一个可选字段,如果不填则默认为 0 , index 用于在同一个 activity 上有多个相同名称的 item 时,指定特定的 item 。</p> <h2>使用备注</h2> <p>Android出于安全考虑,当系统属性ro.secure=0且ro.debuggable=1时才允许开启viewServer服务,所以只有满足这个条件的手机才能使用本文所述的-a参数扩展功能。如果需要更改系统属性ro.secure=0 且ro.debuggable=1,可以通过先root手机,再修改boot.img的方法来实现。</p> <p> </p> <p>来自:http://qa.baidu.com/academy/detail/article/119</p> <p> </p>