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

作者:李帅

导语

借项目的开发周期,把思考了一段时间的场景化性能测试框架搭建起来,包括 耗电性能测试、内存泄漏测试、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. https://github.com/xiaocong/uiautomator

  2. https://testerhome.com/topics/6938

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

相关阅读

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

 

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

Android 性能测试之方向与框架篇的更多相关文章

  1. 【转】Android性能优化之布局优化篇

     转自:http://blog.csdn.net/feiduclear_up/article/details/46670433 Android性能优化之布局优化篇 分类: andorid 开发2015 ...

  2. 【Bugly干货】Android性能优化典范之多线程篇

    本文涉及的内容有:多线程并发的性能问题,介绍了 AsyncTask,HandlerThread,IntentService 与 ThreadPool 分别适合的使用场景以及各自的使用注意事项,这是一篇 ...

  3. Android 性能测试之内存 --- 追加腾讯性能案例,安卓抓取性能扫盲帖

    内存测试: 思路 目前做的是酒店APP,另下载安装几个个第三方酒店的APP以方便对比(相当于可以做竞品测试) 数据的获取来源是ADB底层命令,而且最好是不需要root权限,因为很多手机root很麻烦或 ...

  4. Android 性能测试之CPU

    接上一篇 CPU跟内存一样,存在一些测试子项,如下清单所示 1.空闲状态下的应用CPU消耗情况 2.中等规格状态下的应用CPU消耗情况 3.满规格状态下的应用CPU消耗情况 4.应用CPU峰值情况 C ...

  5. Android 性能测试之TraceView的使用

    Traceview是android平台配备一个很好的性能分析的工具.它可以通过图形化的方式让我们了解我们要跟踪的程序的性能,并且能具体到method. 在SDK路径\tools目录下. 1.在开始使用 ...

  6. Android性能优化之界面UI篇

    1.使用style.color.string.dimen样式来分离xml布局文件,减少代码的重复使用,增加代码复用率,防止hardcode,下面是一个例子: 在定义layout时候,因为每个View或 ...

  7. Android性能测试之Monkey使用

    内容中包含 base64string 图片造成字符过多,拒绝显示

  8. Android性能监控

    Android性能监控 一.搭建Android性能测试环境,参见<Android性能测试之Monkey使用>中内容. 二.启动Android虚拟机,可以通过eclipse启动,也可以通过命 ...

  9. 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇

    前言 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Andro ...

随机推荐

  1. 第4阶段——制作根文件系统之分析init进程(2)

    本节目标: (1) 了解busybox(init进程和命令都放在busybox中) (2) 创建SI工程,分析busybox源码来知道init进程做了哪些事情 (3)  分析busybox中init进 ...

  2. 使用设置sa用户登录sql server2008

    今天在net项目中添加数据库过程中出现了小问题,就是使用sql server身份验证没登录成功,经过一番调试,终于解决问题. 使用sa账户登录sql server 2008 的方法步骤如下: 1.首先 ...

  3. Automatic Generation of Animated GIFs from Video论文研读及实现

    论文地址:Video2GIF: Automatic Generation of Animated GIFs from Video 视频的结构化分析是视频理解相关工作的关键.虽然本文是生成gif图,但是 ...

  4. 【1414软工助教】团队作业5——测试与发布(Alpha版本) 得分榜

    题目 团队作业5--测试与发布(Alpha版本) 作业提交情况情况 所有团队按时提交. 往期成绩 个人作业1:四则运算控制台 结对项目1:GUI 个人作业2:案例分析 结对项目2:单元测试 团队作业1 ...

  5. 【2017集美大学1412软工实践_助教博客】团队作业10——项目复审与事后分析(Beta版本)

    写在前面的话 转眼轰轰烈烈本学期的软工实践就结束了,这个过程中想必在熬夜敲代码,激烈讨论中留下诸多回忆的同时,也收获了不少.恭喜所有团队完成了本阶段冲刺,此外,由于大家的贡献分给的都很平均,将个人贡献 ...

  6. 201521123051《Java程序设计》第七周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 使用工具:百度脑图 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 ...

  7. 201521123097《Java程序设计》第四周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 在本周的学习中,我知道了在类的定义里,还学习到了抽象类以及抽象方法的使用格式. 2. 书面作 ...

  8. 201521123026《Java程序设计》第2周学习总结

    1. 本章学习收获 1.熟悉了码云的部分功能的使用 2.java编程基础的巩固以及延伸 3.解决了部分PTA编程时所遇到困难并明白了解决困难的方法的原理 4.了解了用package和import管理类 ...

  9. 201521123104 《JAVA程序设计》第二周学习总结

    1. 本周学习总结 认识了JAVA编程中一些类型与变量,了解了一些基本运算符的使用 变量在命名时,不可以使用数字或一些特殊字符作为开头 不可以声明局部变量后未指定任何值给它之前就使用变量 在程序中写下 ...

  10. 201521123106《java程序设计》第二周学习总结

    1. 本周学习总结 学习了java的基础语法.在java中使用浮点型会不精确,改用double行就好.学习了string的类型,string的对象是不可变的,创建之后不能再修改,在string的拼接中 ...