JMeter常用核心元件及接口测试实战

背景

之前都是使用Postman和Python进行接口测试,JMeter几乎没有用过。对JMeter想深入了解下

项目

实战项目:http://shop-xo.hctestedu.com/
在这里插入图片描述

JMeter接口测试实战

1、新建线程组

在这里插入图片描述

- 线程数:代表请求多少次
- Ramp-up 时间(秒):
	表示设置的线程数在多少秒内启动完毕,即如果线程数设置为5,而此项也设置为5,那么会每隔5/5=1(s)启动一个线程。
- 循环次数:
	Loop Count表示设置的线程数循环的次数,如果选择Infinite(永远)选项,则会一直循环(注意,如果选择了Infinite且调度器配置中设置了持续时间,则会在持续时间到达之后结束循环)

在这里插入图片描述

2、配置元件

1、HTTP请求默认值

有多个请求的时候,如果IP地址和端口都是一样的,那么为每个http取样器都设置一遍比较浪费时间和精力,并且当IP地址和端口变化时,还要每个都去修改,维护起来也很麻烦。
HTTP请求默认值作用:一般用作全局的配置,即有多个请求的时候,如果IP地址和端口都是一样的,那么在添加该组件后填写
IP地址和端口,后续的HTTP请求就不用填写IP地址和端口了,统一管理即可
在这里插入图片描述

在这里插入图片描述

- 协议:http
- 服务器名称或IP:shop-xo.hctestedu.com

2、用户定义的变量

全局变量,对后续所有接口请求有效
在这里插入图片描述
在这里插入图片描述

- USERNAME,zzss220,用户名
- PASSWD,123456,密码

3、HTTP信息头管理器(HTTP Header Manager)

  • 通过JMeter向服务器发送HTTP请求(GET或者POST)的时候,往往后端需要一些验证信息,例如Web服务器需要给后端服务器验证cookie/token之类的信息,一般就是将这些信息放在消息头中。因此对于此类请求,在JMeter中我们可以通过在添加HTTP请求之前,添加一个HTTP消息头管理器,把请求头中的数据以键值对的形式放到HTTP消息头管理器中,如下图所示。这样在向后端发送请求的时候就可以模拟Web携带消息头信息了。

  • 注意
    (1)JMeter支持添加多个消息头管理器。此时多个消息头条目合并成一个消息头列表,跟随HTTP请求一并提交到服务器端。经过实测,当有多个消息头管理器,且不同的管理器内有名称相同的消息头条目存在时,顺序靠前的管理器的消息头条目会覆盖后面的。
    (2)Web程序中用来跟踪用户的整个会话的常用技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。JMeter中有cookie manager和
    cache manager,如果需要模拟客户端的无缓存场景,需要添加组件并选择“每次反复清除Cookies”选项和clear cache each iteration选项

  • 注:HTTP信息头管理器不能全局使用,需要每个HTTP请求按需添加
    在这里插入图片描述在这里插入图片描述

 名称:content-type 
 值:application/json

3、取样器

1、新建一个取样器-> HTTP请求:注册接口

在这里插入图片描述在这里插入图片描述

- HTTP请求:POST
- 路径:index.php?s=/api/user/reg&application=app
- 参数:
- type	username	
- accounts	${USERNAME}	
- pwd	${PASSWD}	

4、后置处理器

1、正则表达式提取器

通过正则表达式提取响应结果中的某个字段,作为后续接口的入参。例如此项目使用token鉴权方式,接口请求需要token。注册成功后,请求体中就会返回token。
在这里插入图片描述在这里插入图片描述

- 要检查的响应字段:主体
- 引用名称:token
- 正则表达式:"token":"(.*?)"
- 模板:$1$
- 匹配数字(0代表随机):0

使用说明:
- 名称(Name):
    根据自身需要,可以写成名称+注释,方便是被目的。
    
- 引用名称(Name of created variable):
    其他地方引用提取值的变量名称。
    
- 正则表达式(Regular Expression)
   它是描述字符串排列的一套规则,用于将需要的数据提取出来(字符串的匹配)。
   
- 模板(Template):
    表示使用提取到的第几个值。如果前面的正则表达式提取了不止一个参数(多个括号括起来),那么这里需要指定参数的组别,格式为$n$,可以是$1$、$2$等,表示解析到的第几个值给引用名称变量。正则表达式的提取模式,值是从1开始的,值为0则对应的是整个匹配的表达式。
    
- 匹配数字(0代表随机)(Match No.(0 for Random)):
    0代表随机取值,-1代表全部取值,其余正整数代表在已提取的内容中,匹配第几个的内容。
    
- 默认值( Default Value):
    如果正则表达式没有查找到值,则使用此默认值。

1、正则表达式字符含义

在这里插入图片描述
注意:* 和?是不一样的,用于正则(.?)(懒惰模式)或者正则(.*)(贪婪模式)。

  • 懒惰模式:也就是非贪婪模式,采用的是就近匹配原则,一旦找到匹配的结尾字符,就停止搜索。
  • 贪婪模式:找到一个匹配的结尾字符后,不会停止,会接着搜索下一个,直到搜索到文本的结尾才会停止。

2、JSON提取器

正则表达式是万能提取器,但是一般用作取值单一数据。用于提取多个键值对的数据时,表达式比较繁多复杂。相较而言,JSON提取器使用JsonPath表达式进行提取,语法简单简洁,也更适用于取值多个键值对数据。
在这里插入图片描述在这里插入图片描述

- Name of created variables:token
    创建的变量名称,用户自定义,用于储存值,可以多个,用分号(;)进行分隔。
    
- JSON Path expressions:$..token
    json path表达式,用户匹配数据,可以填写多个,要求与变量名数量一致,用分号(;)进行分隔。
    
- Match NO.(0 fon Random)1
    为空的默认值是0,(0代表随机、-1代表所有、其它则从1开始,1则代表取值第1个,2则代表取值第2个,类推。。。)
    
- Compute conxatenation var (suffix_ALL):
    该选项如果勾选,则将所有的值用逗号拼接,并保存到一个变量中。注意只有Match NO为 -1 时该功能打钩才有效果。
    
- Defaylt Values:
    默认值,用户自定义,可以多个,注意当变量名为多个时,默认值也要求多个,否则无法接口不运行无法查看结果树。

1、JsonPath语法

  • $ 根节点,表示json整个对象。某种意义上来讲 $. 可以省略,但不建议省略,保证语法完整。
  • .点,表示用来连接父、子节点。格式:key.key
  • [] 下标运算符,根据索引获取元素,也可以用来连接父、子节点。格式key[“key2”]
    一般来说,使用 [] 可以提取多个子节点作为一个子JSON对象。格式$[“key”,“key2”]
  • …递归匹配所有子元素,表示提取所有节点、子节点中符合条件的节点值。格式$…
  • 表示通配,提取所有。
    • $.* 表示提取根节点之下的所有节点(儿子)
    • $. . * 表示提取根节点之下所有子节点(子子孙孙,不限于儿子)

5、禁用JMeter组件

针对注册接口提取token,选择一个提取器即可,右键正则表达式提取器,可以将其禁用。使用JSON提取器。
同样,如果不期望运行某个接口,也可以选择禁用。当需要时,再启用。
在这里插入图片描述

6、监听器

1、察看结果数

通常用来在调试脚本的时候观察请求和响应正确与否,包括请求头、请求内容、响应头和响应内容
在这里插入图片描述在这里插入图片描述

7、登录接口

- HTTP请求:POST
- 路径:index.php?s=/api/user/login&appication=app&application_client_type=weixin

 - 参数:
- accounts     ${USERNAME}
- pwd          ${PASSWD}
- type         username	

在这里插入图片描述

8、加入购物车接口

- HTTP请求:POST
- 路径:index.php?s=/api/cart/save&application=app&application_client_type=weixin&token=${token}

- 消息体数据:
{
	"goods_id": "2",
	"stock": 1
}

在这里插入图片描述在这里插入图片描述

9、断言

1、JSON断言

对响应结果进行断言,判断是否符合预期,是否通过测试
在这里插入图片描述
在这里插入图片描述

- 名称:
	节点的名称,显示在查看结果树中,自己根据实际情况定义。
 
- 注释:
	对该节点进行注释。
 
- 断言存在JSON路径:
	断言JSON元素的路径。
 
- 附加断言值:
	如果要使断言具有某个值,把这个值勾选上。如果写了JSON元素的路径,要把这个值勾选上。
 
- 匹配为正则表达式:
	如果要使用正则表示式,选中该复选框。
 
- 预期值:
	JSON元素路径对应的值。

- 反转断言:
	就是否的意思,即如果符合就失败

2、察看结果树

可以查看所有接口请求结果。加购物车成功。断言成功时,将不会提示
在这里插入图片描述
想要查看断言失败的效果,可以将“加入成功”改成“加入失败”。再次运行可以看到提示断言失败。
在这里插入图片描述

10、参数化

1、用户定义的变量

上面的例子就是使用的用户定义的变量

2、CSV数据文件设置

在这里插入图片描述创建一个.dat文件。例如我的叫csvData.dat,路径:E:/JMeter/csvData.dat,有2组用户信息。对每个用户进行注册登录加入购物车的操作,需要将线程组的线程数改成2。
在这里插入图片描述运行结果:
对2组用户都进行了测试,且测试通过。
在这里插入图片描述

1、CSV数据文件设置配置解析

【文件名】:文件名,保存参数化数据的文件目录,可选择相对或者绝对路径(建议填写相对路径,避免脚本迁移时需要修改路径);

【文件编码】:UTF-8,文件的编码格式,在保存时保存编码格式为UTF-8即可;

【变量名称】(comma-delimited):对应参数文件每列的变量名,类似excel文件的文件头,起到标示作用,同时也是后续引用的标识符;

【分隔符】:参数文件分隔符,用来在“Variable Names”中分隔参数,与参数文件中的分隔符保持一致即可;

【是否允许带引号?】:默认false,选项选为“true”的时候对全角字符的处理出现乱码 ;

【遇到文件结束符再次循环?】:是否循环读取参数文件内容;因为CSV Data Set Config一次读入一行,分割后存入若干变量中交给一个线程,如果线程数超过文本的记录行数,那么可以选择从头再次读入;
△ Ture:为true时,当已读取完参数文件内的测试用例数据,还需继续获取用例数据时,此时会循环读取参数文件数据(即:读取文件到结尾时,再重头读取文件);
△False:为false时,若已至文件末尾,则不再继续读取测试数据;通常在“线程组线程数* 线程组循环次数>参数文件行数”时,选用false(即:读取文件到结尾时,停止读取文件);

【遇到文件结束符停止线程?】:当Recycle on EOF为False时(读取文件到结尾),停止进程,当Recycle on EOF为True时,此项无意义;
△若为ture,则在读取到参数文件行末尾时,终止参数文件读取线程;
△若为false,此时线程继续读取,但会请求错误,因此时读取的数据为EOF;

【线程共享模式】:共享模式,即参数文件的作用域,有以下几种方式:
△All threads:当前测试计划中的所有线程中的所有的线程都有效,默认;
△Current thread group:当前线程组中的线程有效;
△Current thread:当前线程有效;

3、用户参数

这种方式不便于对大批量数据进行测试。大批量数据测试时,推荐CSV数据文件设置的方式。
在这里插入图片描述在这里插入图片描述运行结果:对2组用户都进行了测试,且测试通过。
在这里插入图片描述

11、JDBC驱动及数据断言

1、数据库链接JDBC驱动下载

1.1 查询数据库版本

我使用的是mysql数据库,查询自己数据库版本。

select version();

result:我的是5.6.50-log版本。
在这里插入图片描述

1.2 打开MySQL_JDBC的下载网站

https://downloads.mysql.com/archives/c-j/

1.3 下载jdbc驱动包

选择操作系统:Platform Independent
我的是windows,选择下载.zip文件。
注:我本来选择的版本是5.1.48,结果在后续操作中报错了Response message: java.sql.SQLException: Cannot load JDBC driver class ‘com.mysql.jdbc.Driver’。当我换成8.0.31版本的就解决了。
在这里插入图片描述

1.4 配置JDBC驱动文件

将下载后的包解压后,将下图中的文件放置到JMeter的lib/ext目录下,然后重启JMeter。
在这里插入图片描述

2、添加配置元件JDBC Connection Configuration

在这里插入图片描述在这里插入图片描述

Variable Name for created pool:db1
Database URL:jdbc:mysql://shop-xo.hctestedu.com:3306/shopxo_hctested
JDBC Driver class:com.mysql.jdbc.Driver
Username:api_test

1、核心的配置说明

Variable Name Bound to Pool:
该值在整个测试计划中应该是唯一的,以便JDBC取样器区别不同的连接配置。
测试人员可以在测试计划中添加多个JDBC连接配置,但是它们必须有不同的名字。
另外多个JDBC请求(JDBC Request)可以引用同一个连接池。

Max Number of Connections:
连接池最大允许连接数。默认设置为0,代表每个线程获得自己的连接池。
如果使用共享连接池,将其设置成与线程数相同即可。

Max Wait (ms):
超时时间。如果尝试连接的过程超过了这个时间,则抛出异常并停止连接。

Time Between Eviction Runs (ms):
运行状态下,空闲对象回收线程休眠时间。
如果设为负数,空闲对象回收线程将不会运行。

Auto Commit:
自动提交开关。
True代表开启,一般对UPDATE、INSERT、DELETE操作有效。

Transaction Isolation:
事务隔离,一般使用默认即可。

Test While Idle;
当连接空闲时是否进行测试。

Soft Min Evictable Idle Time(ms):连接可以在连接池中处于空闲状态的最短时间。超过这个时间的空闲连接才会被回收。

Validation Query;
用于确定数据库是否仍在响应的简单查询。

Database URL:
数据库URL格式,例如jdbc:mysql://localhost:3306/sys。

2、常用数据库和驱动的URL格式

在这里插入图片描述

3、添加取样器-JDBC Request

在这里插入图片描述在这里插入图片描述

Variable Name of pool declared in JDBC Connection Configuration:ad1

Query Type: Select Statement

Query: 因为上述账号添加购物车,添加的商品goods_id是2SELECT goods_id FROM sxo_cart WHERE user_id = ${id}

因为要使用用户id,因此在注册接口的JSON提取器多提取一个id
在这里插入图片描述

1、配置说明

(1)Variable Name of Pool declared in JDBC Connection Configuration:
数据库连接池的名字,需要与JDBC的Variable Name Bound to Pool中填写的名字保持一致。

(2)Query Type测试一般就选Select StateMent表示执行的SQL语句是SELECT。
(3)Query 此处填写具体的SQL语句。
(4)Variable names,此处可以填写由用户自定义的变量名称,用来存储SELECT语句查询的结果。
拓展知识:核心的配置说明
(1)Query Type常用的选项如下。
Select StateMent表示执行的SQL语句是SELECT。
Update StateMent表示执行的SQL操作是增删改类的。关键字为UPDATE、INSERT、DELETE、CREATE和DROP等。
PrePared Select StateMent表示执行的SQL语句是SELECT,但是允许在SQL语句中通过“?”来实现传参(SQL层面的传参,不是JMeter传参)。PrePared Update StateMent类似于UpdateStateMent,表示执行的SQL操作是增删改类的。但是允许在SQL语句中通过“?”来实现传参(SQL层面的传参,不是JMeter传参)。
(2)PrePared类型的专属选项如下。
Parameter values处填写的就是需要传递给带“?”的SQL的参数值。参数值的数量、顺序和SQL语句中的问号保持一致,参数值之间使用逗号分隔,如35,male。
Parameter types处填写的是参数的类型。参数类型数量、顺序和Parameter values保持一致,且要求大写,参数类型之间使用逗号分隔,如INTEGER,VARCHAR。
(3)其他参数如下。
Query,此处填写具体的SQL语句。
Variable names,此处可以填写由用户自定义的变量名称,用来存储SELECT语句查询的结果。变量名称可以有多个,使用逗号分隔。变量是按照顺序去存储查询结果,一个变量存储一列值,即第N个变量存储结果中的第N列值。存储方式采用的是数组方式,下标是从1开始,即下标1表示当列的第一个值,下标N表示第N个值。并且每一个变量都会有一个隐藏的参数Vname_#=N,用来存储值的个数。
Result variable name表示创建一个对象变量,保存所有返回的结果。
Query timeout表示查询超时时间。
Handle ResultSet定义如何处理由callable statements语句返回的结果。
注意
(1)在使用select进行数据库查询的时候,如果JDBC请求里面的SQL语句包含了中文,JMeter会识别不了,需要对它进行编码才可以查询成功,也就是在JDBC的连接中增加useUnicode=true&characterEncoding=utf8。
(2)如果出现类似Response message:java.sql.SQLException:Cannot load JDBC driver class'com.mysql.jdbc.Driver'的错误,下载MySQL JDBC驱动包导入/lib/ext目录下即可。另外,驱动包的版本一定要与使用的数据库的版本匹配,驱动版本低于MySQL版本有可能会导致连接失败报错。

4、添加BeanShell断言

上面将数据库查询到的值定义为变量addCartGoods,在下面的断言中,需要将变量后面加_1才行。因为添加的商品是2,因此结果也应该是2。如果不是2将断言失败。

if (${addCartGoods_1}==2){
    Failure=false;  //表示断言成功
}
else{
    Failure=true;  //断言失败
    FailureMessage="断言失败";
}

在这里插入图片描述

运行结果:断言成功
在这里插入图片描述

12、调试后置处理器

在这里插入图片描述
在这里插入图片描述添加此后置处理器后,将它放置线程组的根目录,那么所有执行的接口都会多一个Debug结果。如果只将它放置某个接口下,那么将只对此接口起作用。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Summer@123

不积跬步无以至千里,感谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值