假期结束,你的状态有没有回归?那么,放空脑袋后,先来学习学习,欢迎大家继续关注腾讯云技术社区。

作者:李帅

导语

借项目的开发周期,把思考了一段时间的场景化性能测试框架搭建起来,包括 耗电性能测试、内存泄漏测试、UI流畅度性能测试、后台接口性能测试、app启动速度测试等。方案应用于项目的测试,也发现了产品中的不少问题。 接下来将用七八个篇幅详细记录一下心路历程。为分享轮子或为回忆总结。

简述

性能测试,在通信设备测试界,是一个非常成熟的领域,IETF组织在这个范畴制定了诸多RFC以规范测试行为。但在笔者接触移动测试领域的四年里,性能测试仿佛是一个可有可无的专项;性能问题,在各个项目中,总是停留在“用户报障->开发关注 -> 测试复现”。

显然,如果性能问题,如果也能最大限度的按照“测试发现->问题定位 ->开发修改”的正常流程来走,对产品质量是有非常大贡献的。下文的介绍,目标就在于此:测试过程中,测试工程师识别更多的产品关键场景,通过场景化、工程化、自动化的测试手段,发现更多的性能问题,使得性能BUG收敛于产品发布前。

目标与战法

尝试概括下性能测试:通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。成功的性能测试,会具备以下几个特点:

  1. 提供给开发的信息具有精准性(必备);

  2. 测试方法高效,测试数据稳定可靠(必备);

  3. 使用的分析方法具有高可信度(必备);

  4. 测试熟练使用工具帮助开发定位性能问题(可选)。

提供给开发的信息具有精准性。如果测试或用户告诉开发同学:“你们这个版本性能很差!”、“用着用着手机就开始发烫了,你搞定一下!”开发同学内心肯定是迷茫的。

如果测试将自己的措辞换成:“资讯页面,观看视频过程耗电量高,这个版本比上个版本jiffs高了30%。”,这样开发团队可以根据模块指定跟进人,知道具体的路径,知道耗电量的优化目标(这个版本多出的这30%),那问题的推进必然会更加顺利。

测试方法高效,测试数据稳定可靠。在设计本框架前,团队执行性能测试,包括长板性能测试(亮屏后台耗电及内存)、手工驱动的场景性能测试、基于页面驱动的流畅度测试。

1、 长板性能,场景过于单一,基本只校验了管家后台进程无任何操作下的性能表现;

2、 相比于UI自动化驱动,手工测试无法保证收集到大样本数据(让人反复做一个操作30分钟,这种任务毫无疑问是对员工的摧残);

3、 页面驱动的流畅度测试,经常出现两次对同一版本的测试得出截然不同的测试结果,测试数据不稳定,难以向开发证明其代码有问题。后文介绍流畅度测试时再详述优劣。

使用的分析方法具有高可信度。传统的分析方案中,往往简单地采用均值来评估性能项。笔者认为,合理的选用评估算法,也能让你的测试报告更有说服力。一个存在少量毛刺的数据序列,如下图,由于毛刺偏离严重,将严重拉低平均值。多一个毛刺,少一个毛刺,均值都会有很大不一样,在样本量较少时,往往会出现两次测试获得的性能数据差异大的问题。(如何解决后面详述)。

图一 流畅度样本

测试熟练使用工具帮助开发定位性能问题。测试左移一点,多做一点,开发就可以少花一点精力在缩小问题访问上。在功能测试中,一个BUG从偶然复现到找到必现路径,会让开发减少大量定位问题时间。同样,在性能测试中,如果测试能指明哪个线程是功率消耗大户,哪个对象是内存泄漏祸首,那么开发也能更加迅速地修复问题。同时,测试在定位过程中,不仅仅提升了自身能力,也建立起了自己的技术形象。

性能测试框架设计

如下图,本次设计的性能测试框架,包含有数据收集、数据分析、UI自动化、驱动框架四个模块,各自独立解耦。这样设计能够降低用例接入成本,可扩展性好。

图二 框架设计原理图

数据收集方案

我们需要通过一种或多种数据,直接反应一项性能的好坏。所以如何收集数据样本?收集那些数据样本,是性能测试框架必备的一个模块。

UI驱动方案

移动客户端的性能测试,主要是模拟用户操作来创造类用户使用场景,获取使用过程中的CPU、mem、流畅度等数据,以衡量该使用场景下,被测应用的性能指标。

本框架的UI自动化框架,选择了python 版的uiautomator(GitHub开源代码)。主要有如下几点原因:

  1. 数据收集模块需要使用adb工具,做adb输出结果处理、文本分析,python在这方面有较大优势,代码量低;

  2. Xiaocong封装的开源python版uiautomator,非常轻量级,功能全面,直接使用开源项目,能够节省非常多的框架开发时间;

驱动框架介绍

在本框架中,测试人员能够用如下的命令行直接驱动一个或多个用例的执行,所以设计了类testng逻辑的方案。

  • Python startTest.py -t 3 -c SwitchTabTest

  • Python startTest.py -t 3 -m SwitchTabTest,swipeDownTest

如下图,CaseExecutor类用来驱动和组织各个用例的suite_up(),set_up(),test(),tear_donw(),suite_down()等方法。

图三 类junit的驱动部分

而用例中包含的这些方法,主要作用是:

a) suite_up() : 用于执行初始化环境

b) set_up() : 主要用于拉起相应的性能数据收集线程、使用UI自动化初始化应用到被测场景,如闪屏滑动,进入主页等。

c) test() : UI自动化执行场景的关键逻辑,如:测试“连续播放不同视频”场景的内存泄漏。则用例需要在test()方法中,使用uiautomator实现循环点击不同视频播放的逻辑。

d) tear_down() : 该方法主要用于通知数据收集线程停止数据收集,进行数据归档;

e) suite_down() : 该方法将清空环境,将所有数据汇总到报告中,并使用数据分析算法得到可以直接用于报告的内容。

图四 执行逻辑

如图四,UI自动化在test()中执行相应场景时,性能数据收集线程会持续收集性能数据

注明:上述的五个步骤并不需要在每个case中实现,对应同一专项,除了test(),其他四个方法,都具有相同的逻辑,抽象到父类中实现即可,这样可以做到同一个专项下的不同场景用例,只需要写一个test方法。

数据分析方案

拿到数据后,想要最大化数据的价值。合理合适的数据分析方案显得尤为重要。笔者一开始做性能测试,所能想到的也就是拿到一大堆样本数据,取平均值,再做对比分析。

本框架试图提供除了平均值外,提供其他更为丰富的数据来评估各类性能指标。包括:

a) 中位数:以它在所有标志值中所处的位置确定的全体单位标志值的代表值,不受分布数列的极大或极小值影响,从而在一定程度上提高了中位数对分布数列的代表性。中位数用于评估网络延迟样本,效果明显优于平均值。原因在于,如大部分延迟在20ms时,其中有几个异常样本值2000ms以上,它们会严重拉高均值,导致均值不能完全代表该延迟数据序列。

b) 方差与标准差:结合均值来评估数据序列,可以评估到数据序列的离散程度。

c) 分布图或分布表:分布图或分布表也能比较好的评估一个数据序列的好坏,用它来做流畅度、网络带宽、网络延迟等性能评估,能够比较直观、详细地给出对比结果。

图五 流畅度优化效果示意

d) 曲线图:内存性能的评估,最优解莫过于占用曲线+ 平均值了。

图六 占用内存曲线

f) 平均值:最传统的均值,依然是一柄利器。

g) 极大值、极小值。

必要的说明

框架使用了开源代码:

  1. github.com/xiaocong/ui…

  2. testerhome.com/topics/6938

以上对具体代码的介绍比较少,后续几篇继续阐述下具体逻辑是怎么实现的。

相关阅读

坎坷之下出新招:记一次应用带宽峰值测试的探索历程
网络延迟与带宽性能专项测试
像 google 一样测试系列之四:技术篇

此文已由作者授权腾讯云技术社区发布,转载请注明文章出处
原文链接:https://cloud.tencent.com/community/article/128959

Android 性能测试之方向与框架篇相关推荐

  1. android cpu负载 工具,【专家专栏】Android性能测试之CPU

    原标题:[专家专栏]Android性能测试之CPU ▌Android性能测试 性能测试是手机应用测试中很重要的一个模块. 一般情况下,性能测试主要关注的指标有:CPU.内存占用.电量消耗.GPU.FP ...

  2. Android性能优化之布局优化篇

    2019独角兽企业重金招聘Python工程师标准>>> 怎样才能写出优秀的Android App,是每一个程序员追求的目标.那么怎么才能写出一个优秀的App呢?相信很多初学者也会有这 ...

  3. Android学习笔记之-Android性能测试之DDMS的使用

    转载:http://www.cnblogs.com/zhuque/archive/2013/04/02/2995802.html 安装/配置: 通过另外一个工具也可以测试手机客户端APP的性能,这就是 ...

  4. android 工厂测试内存,Android性能测试之内存

    内存的方式和cpu类似,我们通过多次采集,得出内存值,看内存是否异常. 如何获取内存值 1.adb shell dumpsys meminfo 2.adb shell dumpsys meminfo ...

  5. android服务器 性能,Android性能优化(中)

    Android性能优化 在上一篇中介绍了性能优化的概念.内存泄漏和性能优化方式 Android性能优化(上) 我们继续说说Android性能优化 数据库性能优化 索引 简单的说,索引就像书本的目录,目 ...

  6. Android性能调优篇之探索垃圾回收机制

    开篇废话 如果我们想要进行内存优化的工作,还是需要了解一下,但这一块的知识属于纯理论的,有可能看起来会有点枯燥,我尽量把这一篇的内容按照一定的逻辑来走一遍.首先,我们为什么要学习垃圾回收的机制,我大概 ...

  7. Android 和 H5 交互-框架篇

    Android 和 H5 交互-框架篇 2017-08-01 YouJZ code小生 作者 | YouJZ 地址 | http://www.jianshu.com/p/02afb387b6b4 声明 ...

  8. Android性能:内存篇之内存回收

    Android性能:内存篇之内存回收 在学会内存性能优化之前我们得先了解内存如何回收,在<Android性能:内存篇之虚拟机概论>我们已经了解了虚拟机的概念及JVM结构体系与内存空间,在& ...

  9. Android 性能优化(62)---存检测、卡顿优化、耗电优化、APK瘦身——详解篇

    Android 性能优化,内存检测.卡顿优化.耗电优化.APK瘦身--详解篇 自2008年智能时代开始,Android操作系统一路高歌,10年智能机发展之路,如今 Android 9.0 代号P  都 ...

最新文章

  1. 输入示例,自动生成代码:TensorFlow官方工具TF-Coder已开源
  2. 03-获取 TargetUser 的 Followings 列表
  3. keil c语言 1602时钟代码,带详细注释的单片机1602液晶时钟经典代码+仿真图
  4. Qt Creator指定动态属性
  5. 封装JDBC事务操作,执行存储过程测试
  6. springmvc dao怎么可以不写实现类_SpringMVC(一)细聊ContextLoaderListener 是怎么被加载的...
  7. inputn函数与input函数的区别
  8. 一些关于Viewport与device-width的东西~(转)
  9. python抽荣耀水晶_深度分析抽取荣耀水晶的窍门,不良抽法很好用,平均100RMB一颗...
  10. linux的进程/线程/协程系列3:查看linux内核源码——vim+ctags/find+grep
  11. clob大数据转换为多行数据
  12. android 静态注册wifi广播,Android静态注册广播receiver检测WIFI连接状况变化
  13. 无法加载 Chrome PDF Viewer
  14. 大数据爬虫前奏之Html和Css学习
  15. Android Studio 常用快捷键(MAC)
  16. gdb x 命令详解
  17. timezone_name_from_abbr() 函数
  18. android平板游戏隐藏功能,平板电脑怎么隐藏游戏
  19. 【转载】linux修改文件的所有者权限[root权限更改为用户权限]
  20. win10 启动自动修复失败

热门文章

  1. 使用Spring Boot CLI的Spring Boot Initilizr
  2. java 异常面试问题_Java异常面试问答
  3. 使用Shell和Java驱动程序的MongoDB身份验证配置示例
  4. c语言 ++ --运算符_了解C ++中的删除运算符
  5. 开课吧:C++语言基础以及应用领域有哪些?
  6. Picasso源码阅读笔记六
  7. Java经典设计模式-创建型模式-抽象工厂模式(Abstract Factory)
  8. DNS篇之二DNS记录类型
  9. PPT图片快速编辑技巧
  10. _declspec(dllexport)与_declspec(dllimport)