移动性能测试 Android 性能测试_Monkey 实践

Stepthen · 2015年10月19日 · 最后由 局限处女座 回复于 2015年10月26日 · 2508 次阅读

前端时间一直在搞移动端的 UI 自动化回归测试,测试过程中发现 APP 的性能不是很好;问了一下领导才知道,公司目前并没有人在做 APP 性能测试,想自己尝试把性能这块实践起来,找出更多的 bug 来引起领导们对性能的重视。首先从简单的 Monkey 入手,在此抛砖引玉,望高手们多多指导。

参考资料:

  1. Monkey 测试策略:https://testerhome.com/topics/597
  2. Android Monkey 测试详细介绍:http://www.jikexueyuan.com/course/1619.html
  3. Monkey 总结:https://testerhome.com/topics/3517

测试步骤

思路

  1. 目前做的是银行 APP,另下载安装 3 个第三方手机银行的 APP 以方便对比
  2. 将四个 APP 的包名添加到白名单,同时测试这四个 APP
  3. 运行 Monkey,将日志记录到手机中
  4. 测试过程中记录 APP 占用内存和 CPU 的变化
  5. 测试完毕后查看 Monkey 日志,将内存和 CPU 数据用图表来分析。

疑问:

  1. 此 APP 是需要登录的,测试过程中退出账号后无法再进入程序内部,不知道其他公司是如何避免的?
    答:经咨询,目前常用两种做法:1. 让开发将退出按键给屏蔽掉 2.点击登录不检测账号和密码

  2. 针对不同 APP 都有什么策略还不是很清楚,比如延时、事件数量、事件比例 等设置成多少合适?

一、运行 Monkey

  1. 将白名单 push 到手机 ``` adb push E:\01_AutomationTest\01_Monkey\05_NbBank\whitelist.txt data/local/tmp/
2. 运行Monkey

adb shell
monkey --pkg-whitelist-file /data/local/tmp/whitelist.txt --throttle 500 -s 100 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 15000 > /mnt/sdcard/monkey_test.txt &

根据sandman的建议,优化命令:

adb shell
monkey --pkg-whitelist-file /data/local/tmp/whitelist.txt --throttle 500 -s 100 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 15000 1> /mnt/sdcard/monkey_test.txt 2>&1 &

 2>&1的语法参考Linux的解释:[http://blog.csdn.net/ithomer/article/details/9288353](http://blog.csdn.net/ithomer/article/details/9288353)

### 二、内存检测
内存检测用批处理脚本记录,约5秒记录一次:

@echo off &color 0a&setlocal enabledelayedexpansion&title %~n0
::@mode con lines=18 cols=50

set package1=com.nbbank
set package2=cn.com.spdb.mobilebank.per
set package3=com.chinamworld.bocmbci
set package4=com.cmbchina.ccd.pluto.cmbActivity

adb shell dumpsys meminfo %package1% | findstr "Pss" > ./meminfo_1.txt
adb shell dumpsys meminfo %package1% | findstr "Pss" > ./meminfo_2.txt
adb shell dumpsys meminfo %package1% | findstr "Pss" > ./meminfo_3.txt
adb shell dumpsys meminfo %package1% | findstr "Pss" > ./meminfo_4.txt

:start
adb shell dumpsys meminfo %package1% | findstr "TOTAL" >> ./meminfo_1.txt
adb shell dumpsys meminfo %package2% | findstr "TOTAL" >> ./meminfo_2.txt
adb shell dumpsys meminfo %package3% | findstr "TOTAL" >> ./meminfo_3.txt
adb shell dumpsys meminfo %package4% | findstr "TOTAL" >> ./meminfo_4.txt

echo.
echo.
ping -n 5 127.1>nul
goto start

### 三、记录CPU百分比

@echo off &color 0a&setlocal enabledelayedexpansion&title %~n0
::@mode con lines=18 cols=50

set package1=com.nbbank
set package2=cn.com.spdb.mobilebank.per
set package3=com.chinamworld.bocmbci
set package4=com.cmbchina.ccd.pluto.cmbActivity

adb shell top -n 1 | findstr "PID" > ./cupInfo_1.txt
adb shell top -n 1 | findstr "PID" > ./cupInfo_2.txt
adb shell top -n 1 | findstr "PID" > ./cupInfo_3.txt
adb shell top -n 1 | findstr "PID" > ./cupInfo_4.txt
:start
adb shell top -n 1 | findstr %package1% >> ./cupInfo_1.txt
adb shell top -n 1 | findstr %package2% >> ./cupInfo_2.txt
adb shell top -n 1 | findstr %package3% >> ./cupInfo_3.txt
adb shell top -n 1 | findstr %package4% >> ./cupInfo_4.txt

echo.
echo.
ping -n 5 127.1>nul
goto start

**注意:**
命令adb shell top -n 1 | findstr %package1%  返回三行信息,暂未处理:

C:\Users\Stphen>adb shell top -n 1 | findstr com.nbbank
25353 0 1% S 23 543128K 66260K bg u0_a193 com.nbbank
25385 1 0% S 3 11480K 1368K fg u0_a193 com.nbbank
25383 0 0% S 3 11692K 4180K fg u0_a193 com.nbbank


### 四、结果分析

-  Crash、ANR、Force close暂时没发现,以后补上

-  将记录的内存数据插到Excel表中对比查看

![](/photo/2015/0679d74126b420f2a952e6eec6f322e6.png)


-  将记录的CPU数据插到Excel表中对比查看

![](/photo/2015/60191dfa6989d24a4f023f0e04d3b11f.png)

**暂时就这么多了,后期有什么没考虑到的再补上,欢迎大家来吐槽,请大神多多指导!!!**
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 18 条回复 时间 点赞

暂时是用批处理脚本将数据写入到 txt 中,然后手动将 txt 中的数据插入到 Excel 中的;也可用 Excel 做个模板,模板中做好折线图,然后用 python 脚本将数据插入对应列,见之前同事这样做过,回头我也试试。

monkey 的 log 对 ANR 和 crash 的输出在 2 输出流,结果重定向最好 1> /mnt/sdcard/monkey_test.txt 2>&1 &; 这样在 monkey_test.txt 就可以筛查到 ANR 和 crash,并且知道异常前的操作

#3 楼 @sandman ,很不错的建议,非常感谢! 另想请教下,对于需要登录帐号的 APP,如何避免其退出登录?

#4 楼 @happystone 昨天在测试之道公开课上咨询了一下金阳光老师,建议让开发将 “退出” 按键屏蔽,另有同学说把登录检测去掉。但都需要开发配合,目前只是个人尝试,也只能先放放了。

#5 楼 @happystone 这是最容易的方法。还有就是改 monkey 源码。这个成本就高了

#4 楼 @happystone 数据可视化可以用 highcharts 框架,python 处理数据,我的监控方案及很多数据展示的需求都是这么做的。本来我也计划着要写下 shell 控制 monkey 执行配合监控抓取数据,轮询筛查 log 精简 log 量,最终脚本筛查统计 log 便于进一步分析,写完再发。对于需要 monkey 保持特定场景执行,简单的做法就是 shell 中做控制及当前状态判定。保持登录状态不好控制,但处于未登录状态初始化重新登录时可行的。

#5 楼 @happystone 比如你所说的保持登录状态,后台轮询脚本可以判定 app 显示状态,如果是退出框则点取消,如果这样还被退,就在判定账号退出后,执行初始化重新登录。

#7 楼 @sandman ,highcharts 未接触过,我抽时间学一下。用 shell 监控比较好一些,这样不用一直与电脑连着,期待你的帖子。

#8 楼 @sandman ,我又有有两个疑问:

  1. “判断 app 的显示状态” 是用什么方法,是怎么判断账号已经退出了?
  2. “执行初始化重新登录” 是怎么操作的?是要先杀掉 monkey 再重新运行 monkey 吗,不然你登录时 monkey 乱点也无法登陆成功。

让按钮不可用也许只用改布局文件。

登录可以参考这个UiAutomator 与 Shell 结合的力量,或者其他 UI 自动化工具都可以。

看看会不会把登录状态写在 sqlite 或者 SharedPreference 里。

#11 楼 @sanlengjingvv ,非常感谢,登录用简单的 shell 命令即可实现,问题是 monkey 在乱点时会对登录有影响;关于登录状态我会留意一下你说的。

#10 楼 @happystone
#10 楼 @happystone
1.两个方式,一个是判定是否有退出的确定框弹出,有的话就取消。再一个是 uiautomator dump 取布局的 xml 分析
dumpsys SurfaceFlinger|grep "|....|" 可以取到当前显示的情况,可以取到是否有确定弹出框的布局。
uiautomator dump /sdcard/check.xml 出的 xml,busybox sed -i 's/<node/\n<node/g' /sdcard/check.xml node 前加回车就很好分析了。而且对于很多 apk 会把设置状态保存在/data/data/包名 下会有对应的 xml,可以查下你要测试的又没有,取文件判定登陆状态也是个思路
2.初始化其实就是可以用 shell 控制在哪也操作,monkey 就负责点就是了,配下操作事件类型和比例。shell 控制当前操作的 activity。跑乱了就听掉 monkey,不退 app 直接从当前状态切换回登陆状态。
这个实现思路可以用 case 语句,对每种情况绑定恢复初始状态的操作,这样不论需要初始化时状态是什么都可以恢复初始页面。

图形 横纵坐标 分别是什么值

#13 楼 @sandman ,非常感谢提供这么好的思路,对我帮助很大!

#14 楼 @xxliud ,第一个图形记录的是整个测试过程中 app 所耗内存的变化,纵坐标是 app 耗用内存 pss 值,横坐标是记录的次数 (目前是 5 秒取一次);第二个图形是 CPU 占用百分比的变化。

#16 楼 @happystone 好的 就是横坐标没看懂,原来是次数....谢谢了

这个方法不错 需要试试自己的应用

用 python 做的 excel?

18楼 已删除
19楼 已删除
20楼 已删除
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册