Android App响应时间测试方法研究

前言

启动时间和响应时间是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是否启动完成。


流程

环境依赖

  • 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启动开始,一直截图,同时与标准图片进行比较,如果达到相似度,则表示启动成功,记录时间差作为启动时间。


流程二

环境依赖

  • 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本身的元素查找功能,一直查找到元素,查找成功设置结束时间。


页面响应时间

依赖工具

测试结果示例
如下图所示,计算出来的各个页面的响应时间如下:


响应时间

总结

第一种测试方案是针对App启动时间的测试;第二个方案是针对App启动到首页加载的测试;同时也可扩展于页面响应时间的测试;第三钟方案主要用于页面响应时间的测试。另外,以上测试方案主要是针对启动时间和响应时间自动化测试的一种尝试,由于工具本身的一些耗时,计算可能会有一些误差。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值