转发一篇写得比较好的文章http://yukinami.github.io/2015/11/26/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E6%8C%87%E5%8D%97/
性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。
性能测试监控指标主要分为:资源指标和系统指标,资源指标与硬件资源消耗直接相关,而系统指标则与用户场景及需求直接相关
重要参数
一般来说,一个系统的性能受到这两个条件的约束,缺一不可。比如,我的系统可以顶得住一百万的并发,但是系统的延迟是2分钟以上,那么,这个一百万的负载毫无意义。系统延迟很短,但是吞吐量很低,同样没有意义。所以,一个好的系统的性能测试必然受到这两个条件的同时作用。
下面的两个概念对比系统吞吐量是更为针对性的定义,虽然和吞吐量的计量单位不同,但基本是成正比的
每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。
它们之间的关系,Throughput(TPS/QPS) = 并发数/平均响应时间
NOTE: 负载测试的目的就是找出这个Throughput(TPS/QPS)的最大值
找出系统吞吐量的极限后,我们需要估算我们实际对系统吞吐量的需求值,看前者是否能够满足后者。
日PV对于一个网站,很容易就统计出来。 日PV和TPS之间如何对应?公式就是80%的日PV,发生在T小时内。则公式为:
1
|
TPS = 日PV *
80% /
24 *
60 *
60 * (T/
24)
|
Jmeter工具和其他性能工具在原理上完全一致,工具包含4个部分:
对于Jmeter这些组件可以这样理解。 配置测试计划就是通过代码来实现对服务器的访问,代码除了提供了语法级别的循环遍历,条件判断等等,还提供了各种函数库来供我们使用。Jmeter的这些组件其实就是实现了一些语法功能以及包括了各种功能的函数,不同的组件类型对函数的不能功能进行了分组。 另外除了函数,还提供了一些配置文件来控制这些函数的行为,这类组件(Config Element)通常作为子组件配置配置。
台服务器性能测试是通过工具和脚本模出真实用户的请求,通过并发的方式来放大流量测试后台服务器的性能,并记录测试结果数据。所以如何获取和通过工具模拟出单个用户的行为是一个必须首先完成的工作。
通过Charles、fiddler等抓包工具,分析用户的一个行为具体有哪些接口请求
接下来需要在性能测试工具中模拟模拟出这样的请求。基于棘突的协议类型和工具提供的用法,常见的有两种方式,一是在工具中配置请求,二是通过代码的方法。Jmeter主要是第一种方法,对于HTTP请求可以直接配置各种参数,同时Jmeter还提供了录制的功能。
Jmeter脚本的录制需要使用HTTP(S) Test Script Recorder
,它属于非测试逻辑单元,添加需要在工作台才能进行。
Target Controller 指的是作为脚本录制结果的Contorller保存到哪,可以直接保存到测试计划下,也可以保存到HTTP(S) Test Script Recorder
下。个人建议先临时保存到HTTP(S) Test Script Recorder
下,重新修改组织后,再将最终的Contorlller移动的测试计划下。
Content-type filter
和URL Patterns to Include
都可以用来过滤需要录制的请求,去除一些不关心的内容。这里需要的是如果请求域名没有指定端口,那么URL Pattern里也需要明确指定80端口,否则无法正确过滤。
如果直接执行录制下来的脚本有一个很大的问题。在于真实用户和脚本的不同。脚本如果是基于前面的方法录制的,两个请求的执行时间之间是没有任何的其他的停顿的,其间隔只是依赖于上一个服务的响应时间和测试机发起请求所需的时间。但是显然真实的用户不是机器,他们在做上面每一个步骤的时候都有一个思考的时间,这也是Think Time这个词的意义来源。
Think Time在Jmeter可以通Constant Timer
来实现。
上面介绍的获取和模拟的是单个用户的行为,通过工具放大后其实代表了行为一致的一类用户。但是对于个真实的被测系统,通常有很多种使用方式,并不是每个用户做的步骤都一样,如果想看系统整体的性能,那就需要同时模拟多类不同的用户,这里我们称之为虚拟用户组。
在Jmeter中虚拟用户组通过,线程组来实现。不同的线程组定义不同的用户行为。