JMeter介绍
JMeter 是 Apache 组织使用 Java 开发的一款测试工具:
1、可以用于对服务器、网络或对象模拟巨大的负载
2、通过创建带有断言的脚本来验证程序是否能返回期望的结果
优点:
- 开源、免费 2. 跨平台 3. 支持多协议 4. 小巧 5. 功能强大
缺点:
- 不支持IP欺骗 2. 使用JMeter无法验证JS程序,也无法验证页面UI,所以要和Selenium配合来完成Web2.0应用的测试
下载安装查看 【超详细】Jmeter安装配置详细教程_jmeter安装教程以及jdk环境配置-CSDN博客
JMeter基本使用
这里查询我的博客系统的接口。
添加线程组

添加HTTP请求


添加结果树


线程组相关设置
进 程: 正在运行的程序
线 程: 是进程中的执行单元
线程组: 进程中有许多线程,为了方便管理,可以对线程按照性质分组,分组的结果就是线程组
三者关系:一个进程可以包含多个线程组,一个线程组可以包含多个线程


特殊线程组

**setUP线程组:**最先执行的线程。
**tearDown线程组:**最后执行的线程组(要勾选主线程结束后运行它)
这两个线程组在任何情况下都是一个最先,一个最后。
**开发模型线程组:**在设计自定义负载模式时将非常有用,而无需计算线程的数量。表达式中的函数有助于生成动态工作负载模型。使用这个线程组,不需要计算测试所需线程的确切数量,只要负载生成器足够强大,可以生成负载模式。
常用配置元件
JMeter配置元件可以用来初始化默认值和变量,读取文件数据,设置公共请求参数,赋予变量值等,以便后续采样器使用。将在其作用域的初始化阶段处理。配置元件(Config Element)提供对静态数据配置的支持,可以为取样器设置默认值和变量。
详见Jmeter(八) - 从入门到精通 - JMeter配置元件(详解教程) - 北京-宏哥 - 博客园 (cnblogs.com)

HTTP请求默认值
http请求默认值:被复用的内容的封装。比如IP,端口等这些信息都是重复的,可以提取到这里,后续就不用写了。

信息头管理器
支持用户添加或者重写HTTP请求头。JMeter支持多个信息头管理器。多个信息头条目合并成一个信息头列表,跟随http请求一并提交到服务端。这里我们只添加字符集和信息内容为json

用户自定义变量
对于一些常见的变量,我们可以提取到这里。

CSV数据文件设置



使用

JDBC连接数据库
现在我们想要把数据库中的内容查询出来,并在百度中查询。
下载jar包
在maven仓库中下载所需的数据库jdbc的jar包。Maven Repository: Search/Browse/Explore (mvnrepository.com)


添加jar包

添加元件


添加JDBC取样器



查看结果

添加调试取样器


添加HTTP请求取样器
这个取样器来调百度的接口。


函数
下面将介绍几个常见的函数。
counter计数器函数


然后复制生产的函数使用即可。

true和false的使用

问题已找到,版本匹配错误。

random随机数函数


time函数


前置处理器
Jmeter的前置处理器可以用来在取样器执行前做一些数据准备操作,也需要注意使用的作用域问题。常用的前置处理器有:用户参数、BeanShell预处理器。
用户参数
使用用户参数传参的方法通常不使用,更多的还是用CSV文件传参,因为它把脚本和数据分开了。


使用还是和CSV数据文件一样。
BeanShell预处理器
当线程组B 想要使用线程组A中的结果数值时,就可以用到该处理器。在同一个线程组中可以用后置处理器。
设置全局变量

把生成的代码放到BeanShell取样器中


获取全局变量

哪里需要这个变量就把代码复制到哪里。
对应关系如下:

结果如下

后置处理器
XPath提取器
先用一个http请求到知乎的官网, 然后拿到它的title放到百度中搜索.



正则表达式提取器
如果从标签文档提取数据建议使用 XPath 提取器,如果从非标签文档提取数据建议使用正则表达式提取器。
现在准备把之前博客列表中的标题拿出来放到百度中搜索。

同上添加正则表达式提取器。


断言使用
断言:让程序代替人工判断响应结果是否符合预期
分类:
响应断言 = 断言状态码和响应体
大小断言 = 判断响应内容的字节长度
断言持续时间 = 判断响应时间(发送结果到得到响应之间的时间)
响应断言






大小断言

同响应断言,只不过比较的是长度。
断言持续时间



逻辑控制器
逻辑控制器可以控制采样器(samplers)的执行顺序。由此可知,控制器需要和采样器一起使用,否则控制器就没有什么意义了。放在控制器下面的所有的采样器都会当做一个整体,执行时也会一起被执行。JMeter逻辑控制器可以对元件的执行逻辑进行控制,除仅一次控制器外,其他可以嵌套别的种类的逻辑控制器。
if逻辑控制器
场景如下: 当用户自定义变量 if_key = value时, 访问百度官网.




ForEach控制器
在百度中一次所有 java c++ python.


循环逻辑控制器
线程1访问百度官网5次, 线程2访问bing官网10次.
循环控制器比在线程组中控制循环次数要灵活的多.


性能测试

模拟各种正常的、峰值的测试环境,检测程序的各项性能指标是否能够达标。
高并发场景设置
JMeter 中内置了 定时器,可以实现时间模式相关的性能测试
需求:同一时刻 100 个同学去访问博客系统的博客列表,统计高并发情况下平均响应时间以及错误率(高并发)
添加同步定时器
首先添加一个线程组线程数量为100。


添加聚合报告

查看结果

高频率场景设置
一个用户以 20QPS的频率访问博客系统的博客列表,持续15秒,统计服务器的平均响应时间
QPS: Query per Seconds 每秒查询数(查询率),每秒访问多少次服务器
循环次数 = 访问频率 * 持续时间
每分钟访问次数 = 访问频率 * 60

添加常数吞吐量定时器


添加聚合报告
同上。
观察结果

上面只是对接口的测试,并没有获取其他资源。若想模拟浏览器操作,获取dom元素,查看该博客操作即可。jmeter压测学习11-模拟浏览器访问web页面 - 上海-悠悠 - 博客园 (cnblogs.com)
图形化报告制作
在 JMeter 中可以以图形化(饼状图、柱状图...)的方式显示脚本运行结果,相比聚合报告或查看结果树更直观,用户体验更友好。
图表信息详解:
Jmeter测试报告图表说明 - 大九~ - 博客园 (cnblogs.com)
对于上述的第二个场景设置我们使用图形化展示。
- 进入bin目录下的cmd
- 输入命令:jmeter -n -t 脚本文件 -l 日志文件 -e -o 目录
-n 无图形化运行
-t 被运行的脚本
-l 将运行信息写入日志文件(文件要么不存在自动创建,要么里面是空的)
-e 生成测试报告
-o 指定报告输出目录(目录要么不存在自动创建,要么里面是空的) - 查看结果
bash
jmeter -n -t D:\code\test\blog\博客测试计划.jmx -l D:\code\test\blog\log\test.txt -e -o D:\code\test\blog\graph
接口功能测试
测试博客系统的添加博客功能。由于该功能必须得登录才能操作,所以这里
准备工作
添加cookie管理器
由于登录是需要图形验证码的,我们这里直接手动登录复制cookie。操作见下面的博客:
Jmeter入门18 Jmeter添加cookie的两种方式 - dinghanhua - 博客园 (cnblogs.com)

添加信息头管理器

添加http请求默认值

准备测试用例
这里只是简单写了个测试用例
id,title,content 其中id可以为空,其他的都不能为空

测试接口
CSV数据文件设置


表单传值
对照结果
根据HTTP请求结果对照。