Android App响应时间测试方法研究
![](https://img.haomeiwen.com/i1026266/0e8e13b9dde649d8.jpg)
@作者 彭海波 转载请注明出处
前言
启动时间和响应时间是App带给用户的最直观的性能体验。因此,无论是何种类型的App,我们都不能忽视响应时间的测试。本文结合Monkeyrunner和Appium自动化工具,研究了几种响应时间的测试方案。
测试场景分析
我们通常所说的App卡、慢通常就是由于启动时间或者页面响应时间过长导致的。我们从这两个方面,结合实际的用户场景,给出了几种常用的测试场景。
测试场景 | 说明 |
---|---|
App首次启动时间 | 从App启动到出现第一个可操作的页面的时间间隔 |
App非首次启动的时间 | 同上 |
App启动到首页加载出来的时间 | 从App启动到首页完全加载出来的时间间隔 |
无网络请求的页面响应时间 | 一般指从发起跳转,到页面完全加载出来的时间间隔 |
有网络请求的页面响应时间 | 同上 |
这些测试场景,目前业内也没有成熟的测试方法。我们传统的测试方法是掐秒表或者在代码里面打日志。但这样误差大,操作成本高,非常有必要改进。下面我们就来讨论一下我们的改进思路。
测试方案研究
对于测试方法的衡量,通常从两个维度:准确性和效率。而带来这两方面提升的方法一般是通过自动化的手段来进行。对于启动时间和响应时间的测试,我们只做到了半自动化,但已经从很大程度上提高了准确度和效率。
一、启动时间的测试(方案一)
方案背景:每个Activity的状态是由它在Activity栈(是一个后进先出LIFO,包含所有正在运行Activity的队列)中的位置决定的。当一个新的Activity启动时,当前的活动的Activity将会移到Activity栈的顶部。
实现思路:一般app的启动页面与首页都不是同一个activity,当启动结束的时候,启动activity都会被移除栈顶。因此,我们可以通过adb命令dump出当前的栈顶activity,然后分析栈顶activity是否是启动activity来判断是否app是否启动完成。
![](https://img.haomeiwen.com/i1026266/4448b67b545bc608.png)
环境依赖:
- Android SDK platform-tools
- Android SDK tools
- Python运行环境
参考代码:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os,sys
import random,time
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice
import thread
def getlaunchtime(startActivity):
#获取App包名和启动activity
#cmd = './tools/aapt %s | grep package' % apkpath
#pkginfo = output.split("name=/'")[1].split("/' ")[0]
#print pkginfo
#等待主机与android设备连接
device = MonkeyRunner.waitForConnection()
MonkeyRunner.sleep(1)
#杀掉待测程序,通常用于排除干扰
cmd = 'am force-stop %s' % startActivity.split('/')[0]
device.shell(cmd)
running = True
starttime = time.time()
#print starttime
endtime = time.time()
#device.startActivity(component='com.pafinancialtech.shundebank/com.pingan.fstandard.activity.SplashActivity')
device.startActivity(component=startActivity)
#print out
while running:
out = device.shell('dumpsys activity activities | grep mFocusedActivity')
#print out
if (out.find("SplashActivity") == -1):
running = False
endtime = time.time()
#print endtime
print "App launch time is : %s" %(endtime-starttime)
if __name__ == "__main__":
getlaunchtime(sys.argv[1])
二、启动时间的测试(方案二)
方案背景:Monkeyrunner提供一个图片相似度对比分析的接口,可以按规定的相似度比较两张图片,如果相似则返回true。
实现思路:截取一张App启动后首页的屏幕截图,作为对比标准,然后从App启动开始,一直截图,同时与标准图片进行比较,如果达到相似度,则表示启动成功,记录时间差作为启动时间。
![](https://img.haomeiwen.com/i1026266/9b31c8fa72075eee.png)
环境依赖:
- Android SDK platform-tools
- Android SDK tools
- Python运行环境
参考代码:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import random,time
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,MonkeyImage
def getlaunchtime(screenshot,startActivity):
#等待主机与android设备连接
device = MonkeyRunner.waitForConnection()
#获取初始页面截图,作为对比标准
result = MonkeyRunner.loadImageFromFile(screenshot)
#杀掉待测程序,通常用于排除干扰
device.shell('am force-stop %s' % startActivity.split('/')[0])
#启动待测程序的主activity
device.startActivity(component=startActivity)
#等待app启动完成
#MonkeyRunner.sleep(15)
starttime=time.time()
while 1:
current=time.time()
mainPageImage=device.takeSnapshot()
#print time.time()-current
if(result.sameAs(mainPageImage,0.6)):
launchtime=current-starttime
print launchtime
break
if __name__ == "__main__":
getlaunchtime(sys.argv[1],sys.argv[2])
三、页面响应时间的测试
方案背景:
Appium执行自动化测试的时候,一般先定位页面元素,然后再执行操作。因此,我们可以通过判断页面的某个元素(一般是布局或者标志性的元素)是否存在来判断页面是否加载完成。记录这其中的时间差,就可以得到页面响应时间。
实现思路:
我们在要记录页面响应时间的测试步骤后插入一个步骤,用于判断某个页面元素是否存在。然后点击某个切换页面的操作步骤的时间作为开始时间,通过Appium本身的元素查找功能,一直查找到元素,查找成功设置结束时间。
![](https://img.haomeiwen.com/i1026266/6f5e936099d2ba95.png)
依赖工具:
测试结果示例:
如下图所示,计算出来的各个页面的响应时间如下:
![](https://img.haomeiwen.com/i1026266/697a82410b597e29.png)
总结
第一种测试方案是针对App启动时间的测试;第二个方案是针对App启动到首页加载的测试;同时也可扩展于页面响应时间的测试;第三钟方案主要用于页面响应时间的测试。另外,以上测试方案主要是针对启动时间和响应时间自动化测试的一种尝试,由于工具本身的一些耗时,计算可能会有一些误差。本解决方案只是作者的一个初步尝试,作为抛砖引玉,希望大家有更好的思路抛出来一起研究。