回顾Jmeter压力测试(三)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 准备一个springBoot项目,或者找一个可以访问的接口,当然最好不要访问一些外网IP,容易误认为攻击封IP

GUI实战部分


通过菜单了解Jmeter大致的内容之后,我们依靠实战来更深入的理解各种功能


线程组的基本使用:


准备部分:


  1. 准备一个springBoot项目,或者找一个可以访问的接口,当然最好不要访问一些外网IP,容易误认为攻击封IP
  2. 比如个人写了一个简单的DEMO:


@RestController
@RequestMapping("/jmeter")
public class JmeterTest {
    @RequestMapping("/runTest1")
    public Object testThread(){
        return "hello-world";
    }
}


1 添加->threads->线程组(控制总体并发)


案例:如下图所示,添加一个20个线程,循环1次的线程组,在2秒内完成


image.png


  • 线程数:虚拟用户数。一个虚拟用户占用一个进程或线程
  • 准备时长(Ramp-Up Period(in seconds)):全部线程启动的时长,比如100个线程,20秒,则表示20秒内100个线程都要启动完成,每秒启动5个线程
  • 循环次数:每个线程发送的次数,假如值为5,100个线程,则会发送500次请求,可以勾选永远循环


2 线程组 -> 添加-> Sampler(采样器) -> Http请求


image.png


一个线程组下面可以增加几个Sampler


  • 名称:采样器名称
  • 注释:对这个采样器的描述
  • web服务器:
  • 默认协议是http
  • 默认端口是80
  • 服务器名称或IP :请求的目标服务器名称或IP地址
  • 路径:服务器URL
  • Use multipart/from-data for HTTP POST :当发送POST请求时,使用`Use multipart/from-data方法发送,默认不选中。


吐槽:感觉中间的选框太小了


3 请求-查看测试结果


image.png


如之前介绍菜单所说,还需要增加一个监听器,收集请求的最终结果。


操作如下:线程组->添加->监听器->察看结果树


如上图所示,最终的测试结果都是正确,两秒内开启20个线程并发访问,压力还是比较小的。


断言的基本使用


上面的案例是一个最简单的线程组的使用,有点类似postMan请求接口。下面了解一下断言是如何使用的。


1.增加断言: 线程组 -> 添加 -> 断言 -> 响应断言


image.png


下面增加一个相应的断言,响应断言里面的选择内容如下:


测试字段:根据测试字段匹配结果,


中间:apply to(应用范围): Main sample only: 仅当前父取样器 进行断言,一般一个请求,如果发一个请求会触发多个,否则就使用sub sample(比较少用)


匹配规则:一些逻辑的匹配规则,比如包含,匹配,相等


这一块的组合形式比较丰富,下面简单举几个例子:


  • 响应文本:即响应的数据,比如json等文本
  • 响应代码:http的响应状态码,比如200,302,404这些
  • 响应信息:http响应代码对应的响应信息,例如:OK, Found
  • Response Header: 响应头


模式匹配规则:


  • 包括:包含在里面就成功
  • 匹配:响应内容完全匹配,不区分大小写
  • equals:完全匹配,区分大小写


断言结果监听器: 线程组-> 添加 -> 监听器 -> 断言结果


里面的内容是sampler采样器的名称 断言失败,查看结果树任务结果颜色标红(通过结果数里面双击不通过的记录,可以看到错误信息)


2、响应断言案例:


给出一个请求的信息内容:


Thread Name:20线程2秒内容完成 1-1
Sample Start:2021-01-09 19:57:43 CST
Load time:1
Connect Time:0
Latency:1
Size in bytes:173
Sent bytes:134
Headers size in bytes:162
Body size in bytes:11
Sample Count:1
Error Count:0
Data type ("text"|"bin"|""):text
Response code:200
Response message:

下面创建一个响应断言:


我们指定响应文本为:Hello-world,测试字段为响应文本,在下方输入hello-world用于增加断言的信息。


image.png


在查看結果树里面就可以看到对应的信息内容了


image.png


大小断言:可以断言响应请求里面的size大小,单位为Byte


断言的功能相对比较简单,这里仅仅列出了一些简单案例


聚合报告分析


操作方式:新增聚合报告:线程组->添加->监听器->聚合报告(Aggregate Report)


image.png


介绍一下英文版的内容对应列的含义


  • lable: sampler的名称
  • Samples: 一共发出去多少请求,例如10个用户,循环10次,则是 100
  • Average: 平均响应时间
  • Median: 中位数,也就是 50% 用户的响应时间
  • 90% Line : 90% 用户的响应不会超过该时间 (90% of the samples took no more than this time. The remaining samples at least as long as this)
  • 95% Line : 95% 用户的响应不会超过该时间
  • 99% Line : 99% 用户的响应不会超过该时间
  • min : 最小响应时间
  • max : 最大响应时间
  • Error%:错误的请求的数量/请求的总数
  • Throughput: 吞吐量——默认情况下表示每秒完成的请求数(Request per Second) 可类比为qps KB/Sec: 每秒接收数据量


新增聚合报告之后,就可以在聚合报告里面看到对应的结果,注意聚合报告的内容都是累加的


用户自定义变量


如果想要设置一些常用的变量配置放到当前的线程组里面,可以使用如下的方式


作用:


很多变量在全局中都有使用,或者测试数据更改,可以在一处定义,四处使用(比如服务器地址)


操作方法:


image.png


线程组->add -> Config Element(配置原件)-> User Definde Variable(用户定义的变量)


如上图配置完成之后,引用方式如下:${XXX},在接口中变量中使用,如下所示:


image.png


CSV可变参数


image.png


1、线程组->add -> Config Element(配置原件)-> CSV data set config (CSV数据文件设置)


我们在电脑的任意位置配置txt文件,配置方式如下:


新建一个txt文件,同时注意使用utf-8的编码进行保存。


2、在读取的配置文件里面,同时使用多个自定义参数


username,password,gender
zhangsan,test001,1
lisi,test002,2
wanglaowu,test003,2
laoliu,test004,1

image.png


接着我们可以唉csv可变参数里面按照要求进行配置:


  • 文件名:csv文件的名字
  • 文件编码:当前文件的编码格式
  • 变量名称:对应标头,用逗号分隔
  • 忽略首行:蛀牙要设置变量名称的时候才会生效
  • 分隔符:默认分隔符为逗号
  • 是否带有引号:(未验证)
  • 遇到文件结束符之后再次循环:意味着是否需要重复的读取文件的内容
  • 遇到文件结束符终止线程:只读一遍文件
  • 线程共享模式:默认应用当前所有线程组


JDBC request压测Mysql


简单应用入门:


在正式进行使用之前,需要随意建立一个数据库或表。


CREATE TABLE `admin`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `account` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `password` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `power` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 52 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;


使用Jdbc进行压力测试,需要依赖jar包实现,不同的版本jar包压测的结果可能会有出入


Thre1.ad Group -> add -> sampler -> jdbc request


这时候进行请求是肯定无效的,我们只是建立的一个采样器:


2.jar包添加  mysql-connector-java-5.1.30.jar


我们需要在配置元件里面,对于个人的JDBC进行配置


image.png


3.JDBC connection Configuration 配置


image.png


Max number of connections:最大连接数


Time-between-eviction-runs-millis:指定空闲连接检查、废弃连接清理、空闲连接池大小调整之间的操作时间间隔


variable name for created pool:创建池的变量名


Auto commit:是否自动提交


Transaction Isolation:事务隔离级别(注意Mysql默认级别为读已提交)


Preinit Pool:预初始化池


Test while idle:空闲线程测试


Soft Min Evictable Idle Time:软最小可收回空闲时间


Validation Query:验证查询


最下面的部分为JDBC连接,最后一项是连接的参数配置。


DataBase URL : 数据库连接地址 jdbc:mysql://127.0.0.1:3306/blog JDBC Driver Class : 数据库驱动,选择对应的mysql username:数据库用户名 password:数据库密码


4.将mysql-connector-java.xxx.jar拷贝到jmeter的classpath目录:(核心步骤)


image.png


5.注意一下配置一定要准确,否则请求会抛出错误,请求失败也不要慌,多看看返回的提示信息,个人在实验的过程中也不是一次成功的:


image.png


6.发起测试请求:


image.png


下面的数据为随便录入的一些数据,可以参考自己的测试结果


image.png


查询参数:


GUI在查询参数这一部分不是十分好,下面说下如果需要使用?这一类形式替换要如何处理


如果使用占位符,在jmeter的GUI界面,需要使用括号进行替换,(1)代表取第一个参数。


image.png


image.png


下面为填入的内容介绍:


**Variable name:**这里写入数据库连接池的名字(和JDBC Connection Configuration名字保持一致 ) **Query:**里面填入查询数据库数据的SQL语句(填写的SQL语句末尾不要加“;”) **parameter valus:**数据的参数值 **parameter types:**数据的参数类型 **cariable names:**保存SQL语句返回结果的变量名 **result cariable name:**创建一个对象变量,保存所有返回结果 **query timeout:**查询超时时间 **handle result set:**定义如何处理由callable statements语句返回的结果


分布式压测


官网教程: jmeter.apache.org/usermanual/…


  • 普通压测:单台机可以对目标机器产生的压力比较小,受限因素包括CPU,网络,IO等
  • 分布式压测:利用多台机器向目标机器产生压力,模拟几万用户并发访问


由于分布式的压测一般对于服务器的配置要求较高,个人一个弱鸡服务器就不献丑了,这里推荐一篇分布式压测文章推荐:


简书文章:www.jianshu.com/p/5c04792c3…


官方文档:jmeter.apache.org/usermanual/…


Jmeter分布式压测原理(了解)


1、总控机器的节点master,其他产生压力的机器叫“肉鸡” server


2、master会把压测脚本发送到 server上面


3、执行的时候,server上只需要把jmeter-server打开就可以了,不用启动jmeter


4、结束后,server会把压测数据回传给master,然后master汇总输出报告

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
Java 测试技术 Apache
用JMeter做接口压力测试
JMeter是Apache组织开发的基于Java的压力测试工具,它是用 Java 语言编写的
59 0
|
5月前
|
测试技术
JMeter压力测试简单例子
JMeter压力测试简单例子
67 0
|
JSON 网络协议 Java
图文详解压力测试工具JMeter的安装与使用
压力测试是目前大型网站系统的设计和开发中不可或缺的环节,通常会和容量预估等工作结合在一起,穿插在系统开发的不同方案。压力测试可以帮助我们及时发现系统的性能短板和瓶颈问题,在这个基础在上再进行针对性的性能优化,也可以帮助我们预估系统的承载能力,使我们能根据其做出一些应对措施。
858 0
图文详解压力测试工具JMeter的安装与使用
JMeter接口测试及接口登陆压力测试
了解JMeter接口测试及接口登陆压力测试。
373 0
JMeter接口测试及接口登陆压力测试
|
5月前
|
Java 测试技术 Apache
JMeter压力测试总结
JMeter压力测试总结
41 0
|
5月前
|
JSON Java 测试技术
Jmeter压力测试
Jmeter压力测试
|
11月前
|
XML Java 测试技术
回顾Jmeter压力测试(四)
在加载测试期间不要使用“查看结果树”或“查看结果”表监听器,只能在脚本阶段使用它们来调试脚本。
181 0
|
11月前
|
网络协议 Java 测试技术
回顾Jmeter压力测试(二)
setUp Thread Group:一种特殊类型的ThreadGroup的,可用于执行预测试操作。这些线程的行为完全像一个正常的线程组元件。不同的是,这些类型的线程执行测试前进行定期线程组的执行。
68 0
|
11月前
|
网络协议 JavaScript Java
回顾jmeter压力测试(一)
顾名思义:压力测试,就是 被测试的系统,在一定的访问压力下,看程序运行是否稳定/服务器运行是否稳定(资源占用情况)
114 0
|
Web App开发 Java 测试技术
JMeter进行WebSocket压力测试
之前两篇内容介绍了一下 WebSocket 和 SocketIO 的基础内容。之后用 Netty-SocketIO 开发了一个简单的服务端,支持服务端主动向客户端发送消息,同时也支持客户端请求,服务端响应方式。本文主要想了解一下服务端的性能怎么样,选择使用 JMeter 对 WebSocket 应用进行性能测试。