Android 性能测试之方向与框架篇

导语

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

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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏钱塘大数据

干货丨10款非常实用的网站数据实时分析工具

1. Google Analytics 这是一个使用最广泛的访问统计分析工具,几周前,Google Analytics 推出了一项新功能,可以提供实时报告。你可...

3527
来自专栏程序你好

什么是数据质量?

数据一直是组织的核心。它是组织日常业务顺利进行和实施新战略的基石。分析数据和做出数据驱动决策的能力变得越来越重要。

1051
来自专栏尜尜人物的专栏

Java工程师知识图谱

http://note.youdao.com/noteshare?id=615da94eb39d054ca96694af890b28bd&sub=wcp1532...

2154
来自专栏AI研习社

数据工程师必看:分析数据时常见的 7 类统计陷阱

我们会发生各种极有可能出现的混淆,数据抽取之后“迷恋”于数字,脑子里没有分析的目标,自己的局限影响指标选择......当分析数据的时候我们都很容易犯错。不过,用...

793
来自专栏云计算D1net

AWS扩展的艺术:DevOps文化和云原生应用设计

在亚马逊Web服务的世界中经常会听到两个短语:DevOps文化和云原生应用。但是它们到底意味着什么呢?如何在现实世界中实现呢?一家初创公司已经结合了这两个概念,...

2913
来自专栏开源优测

[大数据测试]ETL测试工具和面试常见的问题及答案

概述 商业信息和数据对于任何一个企业而言都是至关重要的。现在很多公司都投入了大量的人力、资金和时间对这些信息、数据进行分析和整理。 数据的分析...

4276
来自专栏phodal

全栈的另外一种可能性:写在《全栈应用开发》出版一周年

1332
来自专栏腾讯大讲堂的专栏

以体验为中心的性能优化

首先,这不是一篇讲述关于产品设计与用户体验,而是如何进行产品性能优化的文章。如果你具有一定技术背景,并且对互联网产品性能优化感兴趣,这篇文章将以QQ音乐的性能优...

1988
来自专栏非著名程序员

在 Github 上找「好东西」的方法

? 你是不是有以下困惑? 身边总有神奇的同事,总是能分享一些很赞的资源,不好意思问他从哪里知道的。 打算学习一门新技术,怎么最快找到优质的资源(工具,第三方...

2317
来自专栏灯塔大数据

干货|非常实用的10款网站数据实时分析工具

网络分析工具可以帮助你收集、预估和分析网站的访问记录,对于网站优化、市场研究来说,是个非常实用的工具。每一个网站开发者和所有者,想知道他的网站的完整的状态和访...

2877

扫码关注云+社区