测试开发技术(二)——压力测试

测试开发技术(二)——压力测试,第1张

一个压力测试的流程:

1、明确测试目标

2、制定测试计划

3、实施测试,收集参数

4、分析测试结果

5、给出优化方案

一 、明确测试目标:如果是客户的需求,那需要向客户确认,有清楚的性能指标参数,测试时就是保证系统达到该指标并能良好运转,即压力测试。如果是自己的系统需要有一个评估,那就需要完整的得到该系统的几个临界点,拿到完整的性能曲线,从而来分析部署情况,即为性能测试。不管是哪个,知道了需求,才能制定计划。

性能测试的目标是发现重大的系统瓶颈。你可以想象一个系统由一系列的瓶颈组成;发现并改善一个瓶颈往往会在其他地方产生一个新的瓶颈。例如,我曾为一运行微软Windows CE的器件部门工作。我们发现的第一大性能问题体现在某一具体硬件环境下的内存管理中。我们把问题分离出来,改善了内存分配的效率。尔后再次运行我们的测试,又找到了一个新的瓶颈,这次体现在网络吞吐量上(throughput)。解决了这个问题后,我们接着又为下一个瓶颈改善而工作,然后再下一个,直到整个系统都达到了性能目标。要记住的是:关键在于要尽早订立性能目标,否则你可能不知道什么时候该停止性能测试。

二、制定测试计划:确定使用什么工具,着重哪些参数,设置线程数,方法执行次数,执行时间,是否多个接口同时进行测试等等。

三、实施测试,收集参数:选一个施压工具,来向部署好的服务发起高并发请求,同时关注和收集性能参数。这个是我们花费时间最多的地方。通常该阶段需要反复执行,来得到想要的数据。通常来说,我们可以使用JMeter LR AB 自己写多线程等各种方式,之后介绍一下JMeter。

四、分析测试结果:即根据上一节的参数介绍来进行参数分析。

五、给出优化方案:如果是代码逻辑耗费cpu,就优化算法;如果是redis等数据库耗时,就增加节点,减少读取,读写分离,使用内存等;如果是外在条件限制,则与外部们沟通问题,共同优化等等。

以下面请求为例

协议 :向目标服务器发送>

下载并安装WAST;

1.设置并行连接数;

2.设置持续时间;

3.其余设置;

注:所有以上的选项可以根据自己的需要进行设置。

设置完成后就可以进行压力测试。测试的步骤如下:

第一步,点击工具栏上的“New Script”按钮,在打开的面板中点击“Nanual”按钮创建一个新的测试项目。在打开的窗口中对它进行设置,在主选项中的Server中填写要测试的服务器的IP地址。这里我们填写192168120。在下方选择测试的Web连接方式,这里的方式Verb选择get。Path选择要测试的Web页面路径,这里填写/Indexasp即动网的首页文件,WAST可以设置更多的Path。

第二步,在“Settings”功能设置中将Stress Level (Threads)线程数设置为1000。然后点工具中的灰色三角按钮即可进行测试。测试过程中我们可以从服务器的任务管理器中看到CPU使用率已经达到100%,损耗率达到最大。在CMD窗口中使用命令netstat -an,可以看到客户端的IP地址在服务器上的80端口进行了非常多的连接,而且Web网站已经打不开了,提示过多用户连接。

本文分上下两个部分,上半部分主要介绍:

一、什么是性能测试

二、术语

三、性能测试类型
下半部分主要介绍:

四、性能测试流程

五、性能测试执行(三分钟教会你用Jmeter进行性能压测)

六、结果查看及分析
    通篇的风格以寓教于乐为主,介绍知识为辅。希望大家能在快乐中学习,在开心中成长。时间仓促,错误纰漏在所难免,还请“大神”不惜指正!
一、什么是性能测试
     性能测试 是通过对系统进行性能需求分析,在合理评估的性能测试环境上,通过测试工具模拟正常、峰值、以及异常负载条件对系统各项性能指标进行测试,旨在发现性能缺陷、进行能力验证、验证规划能力和性能调优,并针对测试结果进行分析总结定位的测试过程。( 引自专家测试团队《性能测试白皮书》)

解释

   通俗点说,就是使用用各种“酒具”(jmeter、LoadRunner、Power平台)配合着各种“红、白、啤酒”(入参数据+并发数)来让你达到“正常嗨(正常)、非常嗨(峰值)、嗨过头(异常负载)”的状态,并在这期间通过“心电图”(JMC-- Java Mission Control)或者把你放到“提前定制化的座椅”(RSMS、Dolphin)来持续对你进行观察、监控,从而记录下你在不同剂量下的反应。并根据观察结果来分析“红酒您能喝几瓶”、“白酒能喝几瓶”、“啤酒能喝几瓶”(能力验证);强化了身体素质(系统性能优化)之后又能喝几瓶;甚至是规划一下“有蒙古大汉自远方来不亦喝乎”时,你能不能喝翻他(容量规划)等等……,这些过程,就是“性能测试”!

二、术语

    在继续介绍性能测试之前,我们有必要先解释一下经常用的一些术语。否则我瞎逼逼半天,您一脸懵逼,大家就真的在尬聊了……

1并发用户数

    同一时刻 *** 作某个页面或某个功能的用户数,描述系统能够承受的并发性能。它是一个时间段内发生的事情,它意在表达“并发”的可能性,是压力的一种度量。计算公式:C=nl/t

 n :  业务在线的总用户数量

 l :  业务产生的平均时间长度

 t :  考察的时间段总长度

解释
  我们假想出一个很长很长的水泥管道,管道入口处站了1000个高矮胖瘦一致的人,其中有400人想要通过这个管道。每个人走过这个管道平均需要1个小时,前面的人没走完时入口不放行下一组进入,且入口处每天只有8小时可以放行让人进入。那么,这时“预期”的并发用户数就是4001/8=50,也就是说,只有管道宽的可以装下50人并排走,才能在一天之内让400人都通过。

    为什么说是“预期”呢?那是因为可能您胆子小,假想的时候没敢想太大,就只想出了一个允许2人通行的小水管。那8小时肯定走不完所有人啊,所以你需要继续想、使劲努力YY出一个巨大的管子(性能优化)!当然,不排除您跟我一样天赋异禀,一开始就构想出能同时并排200人的巨管。这意味着,就并发用户数这一项,您的系统性能指标完爆当前既定业务量。

  

2响应时间

   用户发起请求到响应返回的时间,描述交易执行快慢程度。(计算规则:响应时间=网络传输时间+系统响应时间)

90%Percent:每个事务90%用户的响应时间在该值以下

Minimum:每个事务所有用户中最小的响应时间

Average:每个事务所有用户的响应时间算数平均值

Maximum:每个事务所有用户中最大的响应时间

解释

    还是继续走管道……我们给每个人发一个秒表,人们并排进入管道的同时每个人按下秒表。每个人行走的速度不同,虽然是并排进入,但并不是一同出来。每一个人走出管道的同时,再次按下秒表……这时,秒表记录的时间就是这个人(请求)开始到结束的响应时间。

90%Percent:我们把同时走管道的一波人看做一个队伍,队伍中90%的人是在这个时间以内就走出了管道;

Minimum:走的最快的那个人所用的时间;

Average:所有人花费时间的平均值(在这个例子中为1小时);

Maximum:走的最慢的那个人所用的时间。

  

 3TPS

 指每秒处理的事务数,TPS=总事务数/总的时间,描述了服务器的处理能力。

 解释

    一句话,就是每秒钟通过管道的人。这里肯定有人觉得这个概念看着眼熟,很像最开始的并发用户数,对么?仔细看一下他们的区别:并发用户数是指同时进入管道的“肩并肩”的人,吞吐量是指每秒钟那些肩并肩进入管道的人中,平均多少人走了出来。所以,在这里“TPS = 并发数/平均响应时间”

    

4二八法则

   80%的业务请求在20%的业务时间里面产生。

   如:xyk客服系统中"客户信息查询功能”年使用量为4800万次,系统服务时间为724小时。每秒请求数:

   4800000080%/36524360020%=38400000/6307200=6次/秒

 解释

 这个有毛用呢?试想一下,如果我们要压这个xyk客服系统,是不是真的需要724小时不停压一年凑够4800万个请求呢?用脚趾头也能想明白,肯定不用啊!那如何在减少工作量的情况下尽可能的模拟真实场景呢?这个时候二八法则就出场了!(别问我为什么不是三七、四六、五五法则,你当是在分赃吗?)
5 2-5-8原则

    WEB系统性能测试中的2-5-8原则描述如下:

用户在2秒以内得到响应时,系统的响应很快,用户对系统的体验较优;

用户在2-5秒之间得到响应时,系统的响应速度还可以,用户对系统的体验一般;

用户在5-8秒以内得到响应时,系统的响应速度较慢但还在接受范围,用户对系统的体验较慢;

用户在超过8秒后仍然无法得到响应时,通常会认为系统已经失去响应,选择离开或者发起第二次请求,用户对系统的体验很糟糕。

翻译

这个没啥好解释的,就是个“业界”非标准化的一个标准……所以,以后在项目中没有明确要求某功能or页面的响应时间时,就拿这个当标准来考量吧!另外需要补充的一点是,我们用jmeter一般是压接口,我们得出的响应时间一般会小于直接压页面,为什么呢?这里影响响应时间的除了网络传输时间+系统响应时间,还有个前端页面渲染的时间。所以如果我们想web用户体验较好(3秒内),压接口的响应时间最好就要低于3秒,这给页面渲染留出一定的冗余时间。
三、性能测试类型

    终于要开始介绍性能测试的干货(Fuck foods)了。
1、基准测试

测试系统是否存在线程安全性问题,并得到一定测试条件下的系统的性能基线数据。目的是得到系统的性能基线数据,并对响应时间、TPS和其他与时间相关的需求进行评估。

翻译

俗话说的好,“凡事都有个第一次,再丑的媳妇也要见公婆”。这个类型就是针对之前没有做过性能测试,或者是根据新需求而刚刚开发完成的新系统来说的。这时,您就需要来一份“基准测试”啦!先给自己留个底儿,有了性能基线,我们才能继续后面的“调优”不是?

对比测试

对比不同测试条件下的性能差距,常用于系统优化,技术选型,通过相同的用例对比性能数据。测试方式和负载测试类似。

翻译

多说无益,我们“举几个比方,打几个栗子”:

我们对系统的某功能进行了优化,需要验证该功能在优化前后的性能对比数据时,可以进行对比测试;

老板让我说出两种系统架构或者实现方法下,哪一种更好,可以进行对比测试;

老板让我说出这两款设备,哪一款更优秀,可以进行对比测试。

说白了,就是各种比较,没有对比就没有伤害;不对比你怎么能知道你有多胖呢,对不对?!(观众:扔砖头!!!)
2、容量规划

测试系统在软硬件上的扩展能力,常用于测试软件扩容,硬件扩容。容量规划也是对比测试的一种。

翻译

就如定义中所说,容量规划也是对比测试的一种。这个类型主要使用场景有:

软件扩容:我们用多线程来代替原有的单线程处理请求;

硬件扩容:我们增加了两台redis,加大了weblogic server的内存或者直接增加了4台服务器。

在这里也要额外说一点:我们扩容,特别是硬件扩容,是不能按照倍数来放大扩容效果的。例如,我们2台server时TPS为100,我们增加到4台同样配置的server时,TPS并不是增加到200了。有可能是160、170、180……这其中并没有一个线性的关系,这点很重要需要知悉。所以,很多时候项目组找到我们做性能测试,说我们生产环境与测试环境配置相同,只是数量不同,是否能直接换算性能指标呢?答案是否定的!我们只能说,你在测试环境中如果满足了预期性能指标,那生产环境理论上是没有问题的,no more!
3、稳定性测试

采用系统稳定运行情况下能够支持的最大并发用户数,或者日常运行用户数,持续运行一段时间。目标是检测系统能否持续稳定工作。

解释

其实,我们在用Jmeter压测的时候,至少都要持续10~15min以上,为什么呢?我们要让TPS稳定下来,这时采集的数据才有效;当然,并不是说15分钟就一定够了,某些情况下需要更长时间的压测才能发现性能问题。

稳定性测试多用于对“系统稳定性”有“强需求”的系统,比如金融类的银行、证券等等。如系统要求324小时运行,测试当系统在一定的压力情况下(如CPU资源使用率维持在50%左右),选取复合场景的案例,持续运行3x24小时,观测系统的稳定性状态数据。

还有一种是:测试人员发现,系统在短时间(1个小时、8个小时甚至1天)内都是正常的,但一超过一定时间后就会CPU利用率徒增,或者内存持续增高(疑似内存泄露),这也需要来一场轰轰烈烈的稳定性测试……
4、负载测试

负载测试是通过逐渐增加用户量来观察在不同的负载下系统的指标,以检验系统的行为和特性,以发现系统可能存在的性能问题,并可以检测系统的伸缩性。

也可以确定在什么负载条件下系统性能处于失效状态,目标是获得系统能提供的最大服务级别。

解释

负载测试是大家平时做性能测试使用最多的一种类型,甚至有些时候大家嘴里所说的性能测试,就是指的负载测试。说的直白点,就是你写好脚本跑个100并发,发现对于系统来说“洒洒水啦”,监控显示内存和CPU指标都懒得波动一下。那我们加到400试试,加到500呢,1000……?所以,这就是一个“试”的过程,直到系统“失效”!这里的“失效”不一定是指系统宕机,监控显示CPU、Memory利用率超过80%了也叫失效,系统响应时间超过预期的3秒了也叫失效,就看哪个条件先被打破了……

使用LR对数据库进行性能测试,实际上有多种办法,包括通过现有的数据库协议进行CS模式的先录制后执行的模式,以及通过socket方式向服务器发包方式的测试方式。这些是常规书籍上介绍的比较简单上手的测试方法,但是不具备通用性,受已有协议或socket编程方式的限制,所以需要更为通用的测试方法。
用Java user的协议进行所有数据库性能的测试工作:
Java user 不需要录制,把所有的 *** 作通过java语言进行实现,通过lr调用java的class进行加压批量 *** 作,这样可以不关心被测系统是哪个数据库,只要能够通过jdbc进行访问,就能实现性能测试。
一、测试环境准备
1 被测服务器准备,根据测试目的,搭建需要的数据库服务器,确保数据库能够正常访问,正常 *** 作;
2 Java代码的准备,无论使用哪种IDE,只要能够编写访问数据库的class就可以,形式可以是j2se,也可以是j2ee,因为在 *** 作时只使用class的部分方法,所以j2ee就可以了;
3 LR的脚本调试,把java的class导入到脚本调试模式,根据需要添加事务以及其他 *** 作。
二、编写数据库访问
1 使用myeclipse,创建web project,创建如下图的包目录:
Java文件中包含各种访问数据库的方法。
需要注意的是,class中的方法必须是public static,否则LR中无法调用。由于创建的是j2ee程序,所以不用main函数,在web中就可以进行功能验证。
确认class中的方法编写完成,创建一个webjsp文件,如下:
导入class
声明类,并实例化,直接调用刚才编写的3个方法,因为这3个方法是直接对数据库进行 *** 作,不需要实参,也没有返回值,所以直接实现即可。
此时启动web服务,在浏览器中输入jsp的地址,直接刷新页面,就可以调用这3个方法,如果正确,就会对相应的表进行 *** 作,如果不正确,则需要修改相应的代码。
2 LR脚本准备:
LR脚本实际上就是对访问代码的调用,关键在于需要根据测试场景划分不同的脚本布局。
例如:在myEclipse里,我们只编写了一个class,其中包含三个方法,如果在执行性能测试时,这三个方法相互独立,互不干涉,则最简单的划分方法是,创建三个java user,每个java user中包含一个方法,做三份脚本,场景执行时分别进行调用。如果三个方法之间有相互关系,则需要根据实际情况,把有关联的方法放在一起,具体情况可按实际灵活分配。
因为已经将class文件进行编译发布了,所以可以在“java2postgres\WebRoot\WEB-INF\classes\com\lr\test”目录中找到对应的class文件,
复制这个文件,找到LR的目录:HP\LoadRunner\classes\com\lr\test\ 如果没有文件夹,按相同的内容创建。
在LR脚本中进行引包 *** 作:
将需要执行的java类以及方法,放在action中,可根据实际测试情况和所需要验证的内容,具体调试代码。
在这里可以像编写普通LR脚本一样,添加事务或集合点等内容。
由于是通过JDBC对数据库进行访问,因此要在java user中加载jdbc驱动。
运行时设置中,增加jdbc驱动,需要注意的是java user使用的本地jdk,需要至多16版本,若使用17版本,回放会有错误,这是jdk版本的问题。
*** 作完成之后,按F5或点击运行,进行脚本回放,实际此时也对数据库进行了 *** 作,可以直接查询对应的表,检查功能是否正确。
三、执行性能测试
已经有了java user的脚本,和普通web性能测试一样,设计场景、执行测试、收集报告、分析性能瓶颈即可。

1.负载测试
在这里,负载测试指的是最常见的验证一般性能需求而进行的性能测试,在上面我们提到了用户最常见的性能需求就是“既要马儿跑,又要马儿少吃草”。因此负载测试主要是考察软件系统在既定负载下的性能表现。我们对负载测试可以有如下理解:
(1)负载测试是站在用户的角度去观察在一定条件下软件系统的性能表现。
(2)负载测试的预期结果是用户的性能需求得到满足。此指标一般体现为响应时间、交易容量、并发容量、资源使用率等。
2.压力测试
压力测试是为了考察系统在极端条件下的表现,极端条件可以是超负荷的交易量和并发用户数。注意,这个极端条件并不一定是用户的性能需求,可能要远远高于用户的性能需求。可以这样理解,压力测试和负载测试不同的是,压力测试的预期结果就是系统出现问题,而我们要考察的是系统处理问题的方式。比如说,我们期待一个系统在面临压力的情况下能够保持稳定,处理速度可以变慢,但不能系统崩溃。因此,压力测试是能让我们识别系统的弱点和在极限负载下程序将如何运行。
例子:负载测试关心的是用户规则和需求,压力测试关心的是软件系统本身。对于它们的区别,我们可以用华山论剑的例子来更加形象地描述一下。如果把郭靖看做被测试对象,那么压力测试就像是郭靖和已经走火入魔的欧阳峰过招,欧阳锋蛮打乱来,毫无套路,尽可能地去打倒对方。郭靖要能应对住,并且不能丢进小命。而常规性能测试就好比郭靖和黄药师、洪七公三人约定,只要郭靖能分别接两位高手一百招,郭靖就算胜。至于三百招后哪怕郭靖会输掉那也不用管了。他只要能做到接下一百招,就算通过。
思考
我们在做软件压力测试时,往往要增加比负载测试更多的并发用户和交易,这是为什么?
3.并发测试
验证系统的并发处理能力。一般是和服务器端建立大量的并发连接,通过客户端的响应时间和服务器端的性能监测情况来判断系统是否达到了既定的并发能力指标。负载测试往往就会使用并发来创造负载,之所以把并发测试单独提出来,是因为并发测试往往涉及服务器的并发容量,以及多进程/多线程协调同步可能带来的问题。这是要特别注意,必须测试的。
4.基准测试
当软件系统中增加一个新的模块的时候,需要做基准测试,以判断新模块对整个软件系统的性能影响。按照基准测试的方法,需要打开/关闭新模块至少各做一次测试。关闭模块之前的系统各个性能指标记下来作为基准(Benchmark),然后与打开模块状态下的系统性能指标作比较,以判断模块对系统性能的影响。
5.稳定性测试
“路遥知马力”,在这里我们要说的是和性能测试有关的稳定性测试,即测试系统在一定负载下运行长时间后是否会发生问题。软件系统的有些问题是不能一下子就暴露出来的,或者说是需要时间积累才能达到能够度量的程度。为什么会需要这样的测试呢?因为有些软件的问题只有在运行一天或一个星期甚至更长的时间才会暴露。这种问题一般是程序占用资源却不能及时释放而引起的。比如,内存泄漏问题就是经过一段时间积累才会慢慢变得显著,在运行初期却很难检测出来;还有客户端和服务器在负载运行一段时间后,建立了大量的连接通路,却不能有效地复用或及时释放。
6.可恢复测试
测试系统能否快速地从错误状态中恢复到正常状态。比如,在一个配有负载均衡的系统中,主机承受了压力无法正常工作后,备份机是否能够快速地接管负载。可恢复测试通常结合压力测试一起来做。
提示:每种测试有其存在的空间和目的。当我们接手一个软件项目后,在有限的资源条件下,选择去做哪一种测试,这应该根据当前软件过程阶段和项目的本身特点来做选择。比如,在集成测试的时候要做基准测试,在软件产品每个发布点要做性能测试。

1、首先确定打印机能正常使用,然后将usb数据线连接电脑和打印机。

2、在电脑主界面点击“开始”(图中1),然后点击“控制面板”(图中2)。

3、进入控制面板后,在选项中选择“硬件和声音”(图中方框所示),点击进入。

4、然后在d出的对话框中选择“设备和打印机”(图中方框所示),点击进入。

5、点击进入设备和打印机设置页面后,点击“添加打印机”(图中方框所示)。

6、在d出的界面中选择“添加本地打印机”(图中方框所示),然后点击进入。

7、选择打印机的端口类型(图中1)一般说明书上有,然后点击“下一步”(图中2)。

8、在选项列表内先选打印机的厂商(图中1)和打印机型号(图中2),如果打印机的品牌和对应的型号都能选择,选择完后可以直接下一步进行安装。如果打印机品牌或者型号在里面找不到,(图中3)或者本身带有驱动或者使用光盘安装的点击“从磁盘安装”。

9、使用“从磁盘安装”的点击后在d出的对话框中选择“浏览”(图中方框所示)。

10、然后从磁盘中找到打印机的驱动选中(图中1),然后点击打开(图中2)。

11、然后会返回之前的界面,在界面中点击“下一步”(图中方框所示)。

12、然后输入打印机的名称(图中1),书好后点击“下一步”(图中2)。

13、安装完成,会有一个共享设置。如果需要共享就按下一步设置,不需要共享给其他人使用的直接按取消就可以完成安装。

14、可以通过打印测试纸来测试连接的打印机是否正常。如果失败可以检查打印机电源是否打开,与主机连接的线路是否连接好,打印机的驱动安装有没有安装错型号等。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/10546908.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-09
下一篇 2023-05-09

发表评论

登录后才能评论

评论列表(0条)

保存