JMeter : 用于接口测试,简单接口自动化测试,也可做性能测试,主要用于服务端系统的性能测试
个人认为:要做自动化测试,最好使用代码来做,更加的灵活;
而使用JMeter来做一些性能测试相对合适
名词
测试计划:可理解为一个容器,存放所有的线程组,及存放的所有的测试内容,你的测试内容都基于测试计划
线程组:
常规线程组:常用的线程组,在线程组内实现主要的测试任务。
setUp线程组:在执行常规线程组(Thread Group)之前执行一些必要的操作,它会在常规线程组执行之前被触发。主要的应用场景有:
- 测试数据库时,可以用来执行数据链接等操作
- 获取前置数据,如依赖的token和cookies
teraDown线程组:用于在常规线程组完成后执行一些必要的操作,它会在常规线程组执行之后被触发。主要应用场景:
- 如果关闭数据库连接
- 处理其他善后操作
与unittest自动化框架的前后置操作类似。
- 线程属性
- 线程数:并发用户数量,可以理解为虚拟用户数量;线程之间是互不影响的,线程A中修改的变量值,不会影响到线程B。
Ramp-Up时间(秒)
:设置启动所有线程所需要的时间。如,线程数设置为5,启动所有线程所需要的时间设置为1,意思为所有的线程要在1秒内启动完成。- 循环次数(不要勾选永远):设置线程组内个线程执行的次数。如果线程数设置为5,循环次数设置为2,那么线程组内的每个线程都会执行2次,所有线程执行了10次。
- 永远:勾选该选项,测试计划就会一直执行下去。
same user on each iteration
,每次迭代使用相同的线程,即线程复用,默认勾选即可。- 延时创建线程直到需要:勾选后,只有需要线程了才会创建。
- 调度器,搭配永远选项使用,有的时候,要长时间对系统进行压测,那么就要勾选永远选项,并且为永远选项添加配置:
- 持续时间(秒):如要对系统持续压测1小时,那么就要在此填写3600,在3600秒后结束执行。
- 启动延迟(秒):设置线程启动延时时间,是指多少秒后才开始启动所有线程,但并不是说每个线程都延迟多少秒启动。
作用域:
在jmeter中,各个元件(如察看结果树),所处的位置不同,它其作用的范围也不同,常见的作用域:
- 取样器作用域:元件位于指定取样器下,它只作用于该取样器,应用场景:
- 特定请求需要携带特殊的请求头的情况。
- 线程组作用域,元件位于某个线程组内,跟取样器平台,它作用于当前线程组,应用场景:
- 一个线程组内多个取样器依赖同样的请求头或者某一个参数,如token。
- 测试计划作用域:元件位于测试计划下,跟线程组平级,那该元件的作用范围是所有线程组,应用场景:
- 查看所有线程组的请求结果
HTTP请求默认值
将HTTP请求的一些公共变量提取出来,便于复用,简化参数配置
常用断言
- 响应断言
- 大小断言
- json断言
- beanshell断言
响应断言
参数说明:
Field to Test,断言的内容来自于:
Test Response
响应体Response Code
响应状态码Response Message
响应信息Response Headers
响应头Request Headers
请求头Request Data
请求体URL Sampled
请求的URL
Patterns Matching Rules,断言(匹配)规则:
Container
:响应文本中是否包含某个字段值,支持正则Matches
:响应文本是否完全匹配预期值,支持正则Equals
:响应文本是否完全匹配预期值,不支持正则Substring
:响应文本中是否包含某个字段值,不支持正则
Patterns to Test,编写你的断言
Custom failure message,自定义的断言失败信息
大小断言
根据响应返回有字节数进行大小比较来断言
json断言
根据json路径及值的判断,示例$.xx.xx
beanshell断言
写一些简单的判断来进行断言
参数化
jmeter内置了很多函数来供我们使用,比如:
- 随机数函数系列
- 加密
- 时间戳函数
- UUID
使用函数助手生成函数,在需要的地方进行引用
前后置处理器
处理请求发送之前响应之后要做的处理
前置处理器
- 用户参数
后置处理器
- json提取器
- 正则表达式提取器
- beanshell处理器
前置处理器(Pre Processors)常用来在请求之前提前作一些处理,常见的前置处理器有:
- 在请求中,携带一些参数
- HTML链接解析器
- HTTP URL重写修饰符
- JDBC预处理程序,链接数据库
- BeanShell预处理程序,可以通过编写脚本来说处理更为复杂的操作。
在前置处理器中,最常用的是JDBC和BeanShell两个处理器
后置处理器常用来从响应中提取数据用作它用,主要包括:
- json提取器:当响应体的数据类型是json时,用json提取器相当方便。
- 正则表达式提取器:正则表达式提取器比json提取器更加的灵活、强大,适用于各种复杂的场景中。
- beanshell处理程序:暂时理解为我们可以他通过编写脚本来完成更加复杂的操作。
逻辑控制
JMeter中的逻辑控制器大体分为两类:
- 控制测试计划执行过程中线程执行的顺序,如循环控制器、if控制器等。
- 对测试计划中的脚本进行分组,方便jmeter统计执行结果以及进行脚本的运行控制等,如简单控制器、吞吐量控制器、事务控制器等。
相当于编程中的分支、循环、判断…
聚合报告
“聚合报告”展示了一次执行的所有的接口请求信息,并且还展示事务的执行情况,细心如你一定发现了,事务的结果在某些选项上来自于其内的接口的值的和。各参数的意思如下:
- label展示了被压测的接口。
- 样本(Samples):表示总请求数,也就是在单位时间内,一共发出了多少个请求。
- 平均响应时间(Average):平均响应时间。
- 中位数,表示响应时间取中间值。
- 90%百分位:表示90%的接口响应时间低于某个值。
- 95%百分位:表示95%的接口响应时间低于某个值。
- 99%百分位:表示99%的接口响应时间低于某个值。
- 最小值(Min):最小响应时间。
- 最大值(Max):最大响应时间。
- 异常(error):错误率,计算公式是
错误的请求数量 / 请求总数
。 - 吞吐量(throughput):默认情况下,表示每秒完成的请求数(request per second),在jmeter中吞吐量等于tps。
- 接收KB/sec:每秒从服务端接收的数据量。
- 发送KB/sec:每秒向服务端发送的数据量。
- 保存表格数据:将数据以csv形式保存到本地
定时器
在默认情况下,jmeter发送每个请求的间隔极短,如果线程数足够大,瞬间就会将服务器压死
在jmeter中,定时器组件提供了系列不同类型的延时控制。合理使用定时器组件,能让你的性能测试更接近真实,更能挖掘出系统的瓶颈和评估系统的性能指标。
基本规则:在每个采样器(sampler)之前去执行,也就是定时器的作用域:
- 定时器是在每个采样器(sampler)之前执行的,而不是之后(无论定时器位置在采样器(sampler)之前还是下面)。
- 当执行一个采样器(sampler)之前时,所有当前作用域内的定时器都会被执行。
- 如果希望定时器仅应用于其中一个采样器(sampler),则把定时器作为子节点加入
同步定时器
使用同步定时器来测试并发场景
集合点用于同步虚拟用户恰好在某一时刻执行任务,确保用户更准确、集中的进行某个指定操作,达到更理想的负载模拟效果,更有针对性地对某个可能存在性能问题的模糊或子系统施压,以便找到性能瓶颈
“同步定时器”的作用域:
- 如果它位于线程组内,跟其他请求同级,则所有的请求都会受此影响。
- 如果它位于指定的请求内,则只作用于该请求,不影响线程组内的其他请求
常见性能测试场景
1.弱压力测试
有时间范围限制,设置Ramp-Up时间;添加聚合报告查看性能分析报告
2.高并发
模拟各种正常的,峰值的测试环境,检测程序的各项性能指标是否能够达标
添加同步定时器, 多少用户在线程数里去设置,然后对同步定时器里模拟的用户组数量进行设置,来表明每组多少人,超时时间不要为0;添加聚合报告查看性能分析报告
3.高频率
QPS:每秒查询数
循环次数 = 访问频率 * 持续时间
有频率的访问,添加常量吞吐量定时器,多少用户在线程数里去设置,设置目标吞吐量每分钟多少次,根据QPS或其他时间以及执行次数计算设置循环次数;添加聚合报告查看性能分析报告