首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【 Android 场景化性能测试专栏】方向与框架篇

【 Android 场景化性能测试专栏】方向与框架篇

原创
作者头像
腾讯移动品质中心TMQ
修改于 2017-10-25 08:06:06
修改于 2017-10-25 08:06:06
1.5K0
举报

作者:陈帅 团队:腾讯移动品质中心TMQ

一、简述

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

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

二、目标与战法

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

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

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

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

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

提供给开发的信息具有精准性。

如果测试或用户告诉开发同学:

“你们这个版本性能很差!”

“我们APP用着用着手机就开始发烫了,你搞定一下!”

开发同学内心肯定是迷茫的。

如果测试将自己的措辞换成:“我们APP资讯页面,观看视频过程耗电量高,这个版本比上个版本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的驱动部分

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

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

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

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

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

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

图四执行逻辑

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

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

七、数据分析方案

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

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

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

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

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

图五流畅度优化效果示意

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

图六占用内存曲线

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

极大值、极小值。

八、必要的说明

框架使用了开源代码:

https://github.com/xiaocong/uiautomator

https://testerhome.com/topics/6938

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

搜索微信公众号:腾讯移动品质中心TMQ,获取更多测试干货!

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深度学习中的数学(二)——线性代数
线性可分的定义:线性可分就是说可以用一个线性函数把两类样本分开,比如二维空间中的直线、三维空间中的平面以及高维空间中的超平面。(所谓可分指可以没有误差地分开;线性不可分指有部分样本用线性分类面划分时会产生分类误差的情况。)
润森
2022/09/22
9630
深度学习中的数学(二)——线性代数
深度学习-数学基础
目前主要有两种度量模型深度的方式。第一种方式是基于评估架构所需执行的顺序指令的数目。假设我们将模型表示为给定输入后,计算对应输出的流程图,则可以将这张流程图中的最长路径视为模型的深度。另一种是在深度概率模型中使用的方法,它不是将计算图的深度视为模型深度,而是将描述概念彼此如何关联的图的深度视为模型深度。在这种情况下,计算每个概念表示的计算流程图的深度可能比概念本身的图更深。这是因为系统对较简单概念的理解在给出更复杂概念的信息后可以进一步精细化
范中豪
2019/09/10
8880
深度学习-数学基础
深度学习系列笔记(二)
我们定义一个包含向量中元素索引的集合,然后将集合写在脚标处,表示索引向量中的元素。比如,指定 x_1、x_3、x_6​​ ​,我们定义集合S={1,3,6}​ ,然后写作 x_S​ 。
Marigold
2022/06/17
1.4K0
深度学习系列笔记(二)
【机器学习基础】机器学习的数学基础
  作为一门以数据及其模型为研究对象的学科,优化模型、分析模型性能等都需要数学手段的帮助。和其他学科一样,数学可以帮我们更清晰地描述和理解机器学习算法,也可以从理论上证明算法的有效性,是机器学习中必不可少的一环。本文将会介绍机器学习中常用的数学工具,为后面的学习打下基础。
Francek Chen
2025/01/23
2440
【机器学习基础】机器学习的数学基础
《deep learning》学习笔记(2)——线性代数
http://blog.csdn.net/u011239443/article/details/77942575
小爷毛毛_卓寿杰
2019/02/13
5430
《deep learning》学习笔记(2)——线性代数
机器学习数学基础--线性代数
换种表达方式,线性无关是说:其中任意一个向量都不在其他向量张成空间中,也就是对所有的
Ai学习的老章
2019/05/10
1.2K0
机器学习数学基础--线性代数
呆在家无聊?何不抓住这个机会好好学习!
本公众号一向坚持的理念是数据分析工具要从基础开始学习,按部就班,才能深入理解并准确利用这些工具。鼠年第一篇原创推送比较长,将从基础的线性代数开始。线性代数大家都学过,但可能因为联系不到实用情况,都还给了曾经的老师。线性代数是数理统计尤其是各种排序分析的基础,今天我将以全新的角度基于R语言介绍线性代数,并手动完成PCA分析,从而强化关于线性代数和实际数据分析的联系。
SYSU星空
2022/05/05
8420
呆在家无聊?何不抓住这个机会好好学习!
万字长文带你复习线性代数!
课程主页:http://speech.ee.ntu.edu.tw/~tlkagk/courses_LA16.html
石晓文
2018/12/25
1.7K0
万字长文带你复习线性代数!
【读书笔记】之矩阵知识梳理
这篇笔记,主要记录花书第二章关于线性代数知识的回顾。希望把常用的概念和公式都记录下来,同时标记编号(为了方便,标记序号与书中一致),在后续公式推导过程中可以直接关联使用。 梳理成文章,主要
用户1594945
2018/07/20
9240
我的机器学习线性代数篇观点向量矩阵行列式矩阵的初等变换向量组线性方程组特征值和特征向量几个特殊矩阵QR 分解(正交三角分解)奇异值分解向量的导数
前言: 线代知识点多,有点抽象,写的时候尽量把这些知识点串起来,如果不行,那就两串。其包含的几大对象为:向量,行列式,矩阵,方程组。 观点 核心问题是求多元方程组的解,核心知识:内积、秩、矩阵求逆,应用:求解线性回归、最小二乘法用QR分解,奇异值分解SVD,主成分分析(PCA)运用可对角化矩阵 向量 基础 向量:是指具有n个互相独立的性质(维度)的对象的表示,向量常 使用字母+箭头的形式进行表示,也可以使用几何坐标来表示向量。 单位向量:向量的模、模为一的向量为单位向量 内积又叫数量积
DC童生
2018/04/27
1.9K0
我的机器学习线性代数篇观点向量矩阵行列式矩阵的初等变换向量组线性方程组特征值和特征向量几个特殊矩阵QR 分解(正交三角分解)奇异值分解向量的导数
「Deep Learning」读书系列分享第二章:线性代数 | 分享总结
「Deep Learning」这本书是机器学习领域的重磅书籍,三位作者分别是机器学习界名人、GAN 的提出者、谷歌大脑研究科学家 Ian Goodfellow,神经网络领域创始三位创始人之一的蒙特利尔大学教授 Yoshua Bengio(也是 Ian Goodfellow 的老师)、同在蒙特利尔大学的神经网络与数据挖掘教授 Aaron Courville。只看作者阵容就知道这本书肯定能够从深度学习的基础知识和原理一直讲到最新的方法,而且在技术的应用方面也有许多具体介绍。这本书面向的对象也不仅是学习相关专业的
AI研习社
2018/03/19
1.1K0
「Deep Learning」读书系列分享第二章:线性代数 | 分享总结
博客 | MIT—线性代数(上)
在中国不知所以的《线性代数》教材的目录排版下,当前大多数本土毕业生均能熟练使用公式计算行列式或求解线性方程组,却丝毫不能体会线性代数真正内涵的精髓所在。包括我在内,在学习机器学习那满篇的矩阵表示更是让人头痛欲裂,这让我事实上感受到了线性代数才是机器学习中最重要的数学工具,因此不得不静下心来按照网易名校公开课—“MIT线性代数”重学一遍,受到的启发超乎想象,线性代数新世界的大门似乎也对我缓缓打开,遂有了这两篇学习笔记,供自己或有兴趣的小伙伴后续参考。
AI研习社
2018/12/28
2.7K1
博客 | MIT—线性代数(上)
MADlib——基于SQL的数据挖掘解决方案(4)——数据类型之矩阵
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/78904700
用户1148526
2019/05/25
2.1K0
Deep Learning Chapter01:机器学习中线性代数
好久不见,大家好,我是北山啦。机器学习当中需要用到许多的数学知识,如今博主又要继续踏上深度学习的路程,所以现在在网上总结了相关的考研数学和机器学习中常见相关知识如下,希望对大家有所帮助。
北山啦
2022/10/31
5220
Deep Learning Chapter01:机器学习中线性代数
线性代数之行列式、矩阵和向量组
2、如何判断 向量 b或向量组 B是否可由向量组A 线性表示?如果能,写出表达式。 解法:以向量组A以及向量b或向量组B:为列向量构成矩阵,并对其进行初等行变换化为简化阶梯型矩阵,最终断定。 3、方法 向量组的线性相关性 判别向量组的线性相关、线性无关的常用方法需要记住:
用户11315985
2024/10/16
1920
线性代数之行列式、矩阵和向量组
博客 | MIT—线性代数(下)
1、 投影矩阵与最小二乘:向量子空间投影在机器学习中的应用最为广泛。就拿最小二乘的线性拟合来说,首先根据抽样特征维度假设线性方程形式,即假设函数。
AI研习社
2018/12/28
1.5K0
博客 | MIT—线性代数(下)
线性代数(持续更新中)
当 a\times d-b\times c=0 时 A 没有定义,A^{-1}不存在,则 A 是奇异矩阵。
浪漫主义狗
2023/09/04
3620
线性代数(持续更新中)
【机器学习】在向量的流光中,揽数理星河为衣,以线性代数为钥,轻启机器学习黎明的瑰丽诗章
在正式踏入机器学习的实战领域前,我们需要为自己筑起一座坚实的数学地基。 对于零基础的学习者而言,数学听起来也许陌生甚至有点“吓人”。然而,不必惧怕:本篇文章将带你从最直观的概念出发,帮助你理解和掌握线性代数这门支撑机器学习大厦的重要支柱。
半截诗
2025/01/09
2250
开发者必读:计算机科学中的线性代数(附论文)
来源:机器之心 作者:Petros Drineas、Michael W. Mahoney 本文共3994字,建议阅读6分钟。 本文为你分享一篇来自普渡大学与UC Berkeley两位教授的概述论文中的线性代数知识。 矩阵计算在计算机科学中占有举足轻重的地位,是每个开发者都需要掌握的数学知识。近日,来自普渡大学的 Petros Drineas 与 UC Berkeley 的 Michael Mahoney 提交了一篇概述论文《Lectures on Randomized Numerical Linear
数据派THU
2018/01/29
2.4K0
开发者必读:计算机科学中的线性代数(附论文)
线性代数(持续更新中)
当 a\times d-b\times c=0 时 A 没有定义,A^{-1}不存在,则 A 是奇异矩阵。
浪漫主义狗
2022/09/28
9340
线性代数(持续更新中)
推荐阅读
相关推荐
深度学习中的数学(二)——线性代数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档