软件性能测试的本质

为什么80%的码农都做不了架构师?>>>   hot3.png

  淘宝网每年的双11活动都是对其服务器性能的挑战。因为在这一天所有商品半价,购物的用户量剧增。做为淘宝网的高层更多的关心在线用户数,用户交易量,总交易金额等,做为一名技术人员,我们可能更关心当天系统的吞吐量、每秒钟点击率以及系统资源的消耗情况等,对!这就是系统的性能。那么性能的本质是什么呢?我试抓住一些点来解释。
   基于用户体验的性能测试
   但对于一个用户来说,他可以不关心上面这些(系统的性能参数),大约有一部分的消费者会因为网站过于技术化或者性能问题而选择了离开。换言之,如果你的网站速度太慢客户就会离去。这是所有的互联网用户都熟知的道理。这时你的第一想法不是“哎呀,不知道站点的吞吐量怎样”,而是“简直太慢了!我可没有时间在这里等,到别处去吧”。现在想想,人们离开你的站点是否因为性能问题?所以,在做性能测试的时候除关注吞吐量、点击率这些参数外,我们更需要站在用户的角度来测试实际的性能感受。如果你经过测试声称网站可以承受更多的用户同时访问,但实际的用户体验性非常差,那么做你的性能测试又有什么意义呢? 
   现在市场上有大量的书讨论如何设计良好的性能,还有更多的书把重点放在如何使得站点更加直观、生动和易于炒作上。关于速度的好处也讨论过,但如何真正并优化系统来提高用户体验呢?那就是直接的用户体验测试了。有两点方法可以做一这点。一是可以把站点直接投入到能够进行数据采集和系统调优的生产环境中,并祈祷你的网站不会太慢或崩溃。另一个种明智的选择是模拟真实的用户活动,进行重复的测试和调优,最后再投入到生产环境。 
   “明确”的性能需求 
   当测试人员进行性能测试工作时,真正让他们感到困难的不是测试工具如何使用,也不是如何对测试数据进行分析与系统调优(对于一个经验丰富有性能工程师来说,这真的不难)。让他们感到困惑的是如何得到准确的量化的需求,比如: 
   A.网站可以支撑多少在线用户数 
   B.网站可以支持多少用户同时交易 
   C.电子邮件系统每秒种可以处理多少封邮件 
   D.可以支持多少人同时浏览网页 
   类似于这样的数据会出现客户对系统的性能需求中,好吧,有了这些需求,我就开始性能工作了,这些需求真的很明确么? 
   我们来看下面的例子,一个购买汽车的用户想知道: 
   这辆汽车开100公里的耗油是多少升。(对,就是他坐在里面试驾的那辆车) 
   如果你是一个严谨的汽车销售,不会马上会说这辆车每公里的耗油是多少。而是在大脑中快速的列出的汽车驾驶环境: 
   1、车上坐几个人? 
   2、车上带多重的物品? 
   3、路况如何,是高速还是拥挤的市区? 
   4、天气如何,温度如何,要开空调码? 
   5、驾驶时间是白天还是晚上(如果是晚上要开车灯)? 
   6、驾驶习惯是怎样的? 
   你唯一能做的就是继续向客户确认更明确的需求,很多时候其实客户也无法给出精确的需求。这个时候你就要多参考常规的情况下,参考同类产品,或尽量引导用户去明确具体的需求,尽量与客户达到统一的共识。 
   “假设”的测试环境 
   现在是不是觉得性能测试有太多的前置条件,它们或大或小的影响着测试的结果。 
   关于这些前置条件,或者我们称之为假设(assumption),我把一些做法归纳为三个阶段。 
   一:做了假设却不知道自己做了假设
   比如前面提到的那个耗油的问题,有人的做法是我就开100公里看看,得出来是多少就是多少,比如9L。然后就告诉别人这个车的100公里耗油是9L。 
   问题是这样的结果对你是OK,因为你有切身的的体验,知道遇到的状况,可是测试的报告是要给别人,甚至你都无法直接面对或者沟通的人参考。这就会很容易误导别人,即便这不是你的本意,而且你自已也确定你是真实的记录了结果。这里的问题在于你并不清楚自己所做的假设,因为我们一直在做这样的假设。 
   二:做过多的假设
   “当路面平坦,无任何红绿灯,风速5km/h只有一名70kg的乘客,时速稳定在70km/h,良好驾驶习惯,....的情况下,耗油是7.1L/100km。” 
   这样可能很严谨,但是对你的报告的读者而言,这样的数据有多大意义,因为他们没有你这么幸运,有这么良好的环境。 
   三:做必要和合理的假设
   生活有时候是需要一些妥协和折衷,如果这些折衷是必要的和合理的。因为跳出来看,我们的测试需要提供有价值的信息,所以为了这样有价值的信息,做出必要和合理的假设是可以接受的。 
   好吧,也许这不是你想要的答案,但它是我目前给自己的解释和安慰。 
   性能测试环境需要在严格独立监控下管理,尽量保持与真实生产环境的一致性能。 
   “精确”的测试数据
   对于一个严谨的测试员,我们的测试结果的描述也相当精确,如:用户每个用户的访问时间为2.8729秒,10分钟系统处理请求8634个。我以前一直认为,只要我把测试环境描述的很详细,我的测试结果就是精确的。 
   实际上功能测试很容易得到测试结果,而性能测试很难得到精确的量化结果,我买了一辆汽车,开车去上班,去时车的各个功能非常正常,回来的时候车的功能也非常正常。我们通过功能测试很容易得出,这个车的功能没有问题。 
   那么性能测试呢?再来看耗油情况,我去时上耗油3.29升,回来时耗油3.42升,同样的一条路,同样的人开同样的车,那么是不一样的耗油结果?如果我再试一遍,可能情况还会有变化。所以,我们很难得到精确的数据,但是这丝毫不影响我们测试结果的参考价值。 
   “宏观/围观”的性能测试
   这也是一个有趣的对立。在做性能测试,特别是整个产品的性能测试的时候,我们看到的是产品的核心功能和主要的大的功能模块,比如数据库、web服务器、核心的daemon等等。在脑海里,我们有一个架构图,哪怕你没有把它画出来。所以有时候,我们会想,性能测试对于产品的视角是宏观的,看大的组件,而不是具体的细节的东西。果真是如此吗?看看下面的例子: 
   1.把daemon的log级别改为debug(log_level从2改到5)之后,性能下降了差不多一半。 
   2.关掉一个cache选项 
   3.打开keepalive选项 
   4.打开DNS反向查询 
   ..... 
   上面都是些细枝末节的设置,一个配置项而已,藏在DB的某张表或者某个ini里面。但是改变之后,得到的性能结果可能大不相同。这些都是否改变了我们以往的看法。 
   Scott Barber(性能测试方面的专家)在他的一篇文章里讨论了这个话题。 
   “Macro-and Micro-tests,macro strategies and micro-plans,macro-level application usage and micro-level usage implementation details,macro-level result summaries for executives and micro-level test results for developers...it sounds like a day in the life of a performance tester to me.” 
   摘自他为Software Test &Performance杂志写的一个系列文章,叫做Peak Performance,其中的2006年9月的一期,文章名是Macro to Micro And Back Again Macro to Micro And Back Again,嗯,很好的诠释。
   亚里士多德说世上的道理不是被讲一遍两遍而是成千上万遍,是的,因为Weinberg也讲了一遍,就在上面提到的那本书里面。请原谅我再次引用他的话,粉丝嘛。“Although it's necessary to have an overview of the problem,the big picture often turns on one critical detail.” 
   critical detail,对,就是这个term。其实不光是这里说的测试,工作和生活中的很多事情都是一样,不是要不要关心细节,而是它是否critical。 
   那么,怎么区分一个细节是不是critical或者怎样找到critical的detail呢? 
   嗯...,这是个好问题,不过不好意思这个不是这里要讨论的范畴。 
   所以,你还认为性能测试只是学习如何使用性能工具么?它需要一个长期的个技术的积累,我们的路还很长。也许,我讲的不够本质,但性能测试这个领域,看到太多的新手在整天问工具的使用,学会了工具的使用就大言“我会(精通)性能测试!”。太多的公司叫新手的做性能测试,环境神马的也不提供,你找个工具对软件加压一下吧!哎~!这未免是太贬低“软件性能测试”了。


本文选自:http://www.spasvo.com/news/html/20141217174341.html

转载于:https://my.oschina.net/spasvo/blog/357938

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264020.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql周报内容范文_Mysql各种报表查询含实例,日报,周报,月报,时间差自动计算...

public List retrieve(IReport report) {List list new ArrayList();Map map new HashMap();// 设置结束日期if (null ! report.getEndTime()) {map.put(ReportMeta.PROP_ENDTIME, report.getEndTime());// 设置名称if (null ! report.getName()) {map.put(ReportMeta.PROP_N…

路由器01---k2刷Pandora

1.固件 固件(Firmware)就是写入EPROM(可擦写可编程只读存储器)或EEPROM(电可擦可编程只读存储器)中的程序。 对于独立可操作的电子产品,固件一般指它的操作系统(“担任着一个数码产品最基础、最底层工作的软件才可以称之为固件”&…

python中squeeze函数_详解pytorch中squeeze()和unsqueeze()函数介绍

squeeze的用法主要就是对数据的维度进行压缩或者解压。先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的数去掉第一个维数为一的维度之后就变成(3)行。squeeze(a)就是…

新闻网大数据实时分析可视化系统项目——7、Kafka分布式集群部署

Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用。目前越来越多的开源分布式处理系统如Cloudera、Apache Storm、Spark都支持与Kafka集成。 1.下载Kafka并安装 1)下载Apache版本的Kafka。 …

关于Excel导入的问题记录

当Excel导入成为需要时,之前的导出Excel为html方式的方法就受阻了,于是,需要开始新的百度与google来解决问题。 前提为OLEDBExcel。 根据需求,多数是对于表的数据的导入。于是产生这么一个需求过程: 1。准备一个空的标…

AIX-vi操作-提示Unknown terminal type的问题解决方法

AIX-vi操作-提示Unknown terminal type的问题解决方法AIX Version 5.3$ vi /etc/profilelinux: Unknown terminal type[Hit return to continue] :q!I dont know what kind of terminal you are on - all I have is linux.[Using open mode]……临时办法,下次启动失…

Java性能调优工具

2019独角兽企业重金招聘Python工程师标准>>> 1、JDK命令行工具 1.1、jps命令 jps用于列出Java的进程,jps可以增加参数,-m用于输出传递给Java进程的参数,…

python3将字符串unicode转换为中文

在我们的python使用过程中,可能会遇到这样的情况: 我们得到的中文数据是unicode编码类型的,这在python中是没有问题的,可以直接打印显示为中文。 但是,如果我们需要和其它语言或前端进行交互或需要存到数据库中的时候&…

连接SQL Server文件集锦

在新建SqlConnection对象,连接资料库时连接失败,出现“常规网络错误。请检查您的网络文档。” DataSource直接写IP的话,通信协议是按照TCP/IP协议连接的,如果服务器端TCP/IP服务没有开启,则会报错“不允许远程连接” A…

python 波形发生_事件与信号

事件 Event所有的GUI程序都是事件驱动的。事件主要由用户触发,但也可能有其他触发方式:例如网络连接、window manager或定时器。当我们调用QApplication的exec_()方法时会使程序进入主循环。主循环会获取并分发事件。在事件模型中,有三个参与…

数据结构与算法6—树

树 树的表示方式有 树形图表示法:逻辑结构描述直观 嵌套集合表示法(文氏图表示法) 凹入表示法 广义表表示法 二叉树 二叉树是另一种重要的树形结构,是度为2的有序树,它的特点是每个结点至多有两棵子树。 二叉树的递归定义 二叉树…

LNMP一键安装包在安装完成后的一些安全设置

2019独角兽企业重金招聘Python工程师标准>>> 1.修改php.ini中的 base_dir 设定为:open_basedir/home/wwwroot/:/tmp/, 这样,脚本只能在wwwroot和tmp下读取。 2.设定权限,防止跨目录列表。 chown root:root wwwroot c…

docker基础应用

环境: centos 7 docker 19.03.0-beta3 192.168.10.10 关于如何安装docker请参考:https://www.cnblogs.com/caesar-id/p/10857312.html 1、查找合适的版本 [rootlocalhost ~]# docker search centos 2、下载centos镜像 [rootlocalhost ~]#docker pull c…

java 简单数据类型_java基本数据类型

基本数据类型JAVA中一共有八种基本数据类型,他们分别是byte、short、int、long、float、double、char、boolean类型型别字节取值范围byte整型1byte-27 ~ 27-1short整型2byte-215 ~ 215-1int整型4byte-231 ~ 231-1long整型8byte-263 ~ 263-1float浮点型4byte3.402823…

Win7中IIS7.0安装及ASP环境配置

打开控制面板中“程序”: “程序”中“打开或关闭Windows功能”: 如图,安装IIS7时需要选择要使用的功能模块: IIS7安装完成之后可以在开始菜单的所有程序中看到“管理工具”,其中有一个“Internet信息服务管理器”,如果没有可以按以下步骤…

java 3number_java 数据Number、Math

一个初出茅庐的小子与大家共享一些关于Number和Math的使用,因水平有限,难免有写的不完善的地方,嘻嘻。看完之后,希望可以留下你珍贵的指导意见。The Numbers Classes在写代码的时候,也许会使用到java各种的基本数据类型…

HOG(方向梯度直方图)

结合这周看的论文,我对这周研究的Histogram of oriented gradients(HOG)谈谈自己的理解: HOG descriptors 是应用在计算机视觉和图像处理领域,用于目标检測的特征描写叙述器。这项技术是用来计算局部图像梯度的方向信息的统计值。这样的方法跟边缘方向直…

保留数据给硬盘增加分区

我的块硬盘只有一个分区,里面还有数据,但是想再划分一个区,在win10系统下是这样操作的 首先,我的硬盘的文件系统是fat32,先通过命令提示符把文件系统转换成NTFS,转换前“压缩卷”是灰色的 convert c: /fs:n…

c# 简单序列化

序列化:是将对象状态转换为可保持或传输的格式的过程,原因有两个,第一是想永久的保存这些数据,以便将来可以重建这些数据。第二是想把数据从一个应用程序域发送到另外一个应用程序域中去。反序列化:就是把存储介质中的…

windows mobile开发循序渐进(6)windows mobile device center 使用问题

由于个人中邪,在经历一次windows 7安装失败之后,贼心不死,于昨天又重新安装了windows 7,终于成功。 回到windows mobile的开发上来呢,首先是配置环境,按照之前的经验,比较顺利的安装了virtual p…