目录
【本文简介看之前请详细的看完介绍】
本文是全网首发的【全栈接口测试进阶系列教程】jmeter接口测试工具从入门到入职,
接口系列包含
接口测试系列包含所有的接口测试工具入门到入职,如果你喜欢的话可以给博主分享的博文的话来一个点赞评论关注三连,你们的三连是博主更新的最大动力,
一:JMeter 安装及配置环境变量
1、什么是JMeter?
2、安装准备
3、配置环境变量
配置JAVA JDK环境变量
配置JMeter环境变量:
二:jmeter目录详解以及全局配置文件jmeter.propties
一.【目录详解】
一、目录
二、jMeter 的脚本生成
三、jmeter的组件:
四、jmeter的脚本增强:选项→函数助手对话框(可以自定义)
三:jmeter常用的10大组件以及组件的执行顺序和作用域
一、Jmeter重要组件:
1)配置元件---Config Element:
2)前置处理器--- Pre Processors:
3) 计时器---Timer:
4) 采样器---sampler:
5)后置处理器---Post Processors:
6)断言---Assertions:
7)监听器---Listener:
8) 逻辑控制器---Controller:
二、组件执行顺序:
三、组件作用域:
四、特殊说明:
四:jmeter进行接口测试的步骤详解
运行
JMeter进行接口测试流程
1.测试计划,
2.线程组,在测试计划上鼠标右击 – 添加 – 线程(用户)- 线程组。
3.HTTP请求默认值,线程组上鼠标右击 – 添加 – 配置元件 – HTTP请求默认值
4.HTTP信息头管理,线程组上鼠标右击 – 添加 – 配置元件 – HTTP信息头管理
5.HTTP请求,线程组上鼠标右击 – 添加 – 取样器 – HTTP请求
6.断言,
五:jmeter执行接口测试实战之不同请求方式,不同参数类型,(键值对,json,文件上传)接口请求
一.不同请求方式
2.不同参数类型
一、用户定义变量
二、用户参数
三、user.properties文件
四、txt/csv 文件参数化
五、从数据库中获取
六、BeanShell参数化
三.(键值对,json,文件上传)接口请求boby类型
普通的以key-value传参的get请求
六:执行接口测试实战之接口测试业务闭环
Jmeter的接口测试详细步骤并实现业务闭环
一、首先是了解Jmeter接口测试用到的组件
二、详细流程
1、配置元件→用户定义的变量:定义全局变量
2、配置元件→HTTP Cookie管理器
3、配置元件→HTTP请求默认值
4、监听器→查看结果树展示请求的结果
5、右键添加线程组
6、接下来先是登陆接口的测试
七:jmeter执行接口测试之接口管理处理(正则表达式和jsonpath)
jmeter实现接口关联的两种方式(正则表达式提取器和json提取器)
一、前言
二、使用正则表达式提取器实现接口关联
1、在需要获得数据的请求“1.获取access_token” 上右击添加一个后置处理器-->正则表达式提取器
2.在后面的接口中使用${ access_token}引用
3.使用调试取样器检查是否提取成功
三、使用json提取器实现接口关联
json提取器的使用步骤
1.在需要获得数据的请求“1.获取access_token” 上右击添加一个后置处理器-->JSON提取器
2.替换变量为${ 变量名}
3.使用 调试取样器 检查是否提取到了
四、扩展:返回复杂json数据的提取
八:jmeter接口测试实战之动态参数处理
JMeter动态参数的定义和调用
一.动态参数使用的条件
二.JMeter和Postman定义动态参数的区别
JMeter的动态参数
Postman的动态参数
三.JMeter定义动态参数
四.JMeter调用动态参数
九:jmeter接口测试实战之断言(响应断言,json断言,beanshell断言)
十:jmeter接口测试实战之接口调试(调试取样器以及结合fiddler调试)
1、jmeter设置http请求-高级-代理服务器-fiddler 的ip和端口
2、fiddler 设置断点
3、设置过滤-只过滤测试服务器请求
4、jmeter请求后,fiddler 可修改接口参数,再继续请求
十一:jmeter接口测试实战之csv数据驱动文件处理
一、前言
二、Jmeter 中 CSV 如何参数化测试数据并实现自动断言
三、Jmeter实现数据驱动测试
1、说明:
2、项目实例:
十二:jmeter接口测试实战之带请求头的接口测试实战
一、HTTP request(请求)详解
通过工作经验总结,我们可以得到以下几点:
请求头详解
二、HTTP response 详解
响应头详解
十三:jmeter接口加密(md5,base64等)
jmeter通过base64加解密&MD5加密
准备jar包#
通过jmeter函数进行base64加解密#
加密#
解密#
通过beanshell进行base64加解密#
通过jmeter函数digest进行MD5加密#
JSR223 实现python加解密#
JSR 简介#
Jmeter JSR223 Sampler#
Jmeter 扩展Python语言支持#
Jmeter 配置JSR223 Sampler#
Base64加解密#
十四:jmeter接口测试实战之beanshell内置变量和语法规则
一、什么是beanshell
二、BeanShell常用的内置变量
十五:beanshell调用java和class文件
一、于是想到通过引入jar包的方式,通过beanshell脚本来调用,获取变量值。步骤:1、使用ide ,新建一个maven工程2、新建类,编写方法,读取excel文件,并根据变量获取相应的值
测试通过后,生成Jar包
编辑二、生成完jar包后,可双击检测及通过解压工具确定是否正常 ,jar包内的文件是否可正常 展示,通过cmd命令,运行一下jar包,查看是否能正常使用
三、在jmeter中调用 jar包,将jar包入到apache-jmeter-5.5\lib\ext 中,此方法不需要在测试计划中添加jar包引入。添加BeanShell Sampler:如下图:import 语句:包名+类名调用方法直接使用:类名.方法名
十六:jmeter接口测试实战之jdbc数据库查询
1、数据库 的IP+端口+ 登录的账号和密码
2、数据库jdbc连接jar包
开始操作了!!!!!**3、复制jar包所在路径,黏贴到jmeter的测试计划的 library
4、右键线程组添加配置元件。 连接数据库,填写IP+端口+库名 ——+登录账户与密码
5、右键线程组添加jdbc请求
6、使用sql查询语句查询数据库数据
编辑7、如果报错“Cannot load JDBC driver class ‘com.mysql.jdbc.Driver’”没有找到jdbc连接驱动。则手动添加jar包到jmeter安装目录的lib目录里,再在 测试计划,点击 “浏览”添加该jdbc连接jar包
8、运行命令——从数据库成功查询出结果+编辑
9、使用 正则表达式提取数据传给下个接口使用
十七:jmeter接口测试实战之beanshell实现数据库查询断言
一、总体思路概述
二、jmeter发起接口请求
三、针对接口请求添加json提取器
1.添加json提取器
2.设置json提取器
四、配置数据库发起数据库请求
1、配置数据库连接元件
2、数据库请求,请注意该请求需要放在查询接口请求之前
五、脚本调试
1.添加调试取样器,用来查看各个变量的值是否正确
2.添加察看结果树,用来查看请求结果
3.执行测试,查看各个变量的值是否正确
六、使用Beanshell 断言完成接口结果和数据库结果的校验
十八 :jmeter代理服务器实现脚本录制
1、打开Jmeter,选择【测试计划】,鼠标右击,依次【添加】->【Treads(Users)】->【线程组】,添加一个线程组。
编辑2、选择【工作台】,鼠标右击,依次【添加】->【非测试元件】->【HTTP代理服务器】,即可以添加上HTTP代理服务器。
3、对“HTTP代理服务器”进行设置,分别设置端口(如:8899),目标控制器(如:测试计划->线程组),以及分组(如:Put each group in a new transaction controller),其他为默认值。
十九:执行基于微服务架构的dubbo协议接口测试实战
方法一:启用telnet,Telnet(用的较少) 配置Telnet
方法二:python借助dubbo进行接口调用 (常用)
二十:非gui方式运行以及jmeter+ant+jenkins接口自动化持续集成
一、简介
二、集成环境搭建
3、安装Ant:
4、安装Jenkins
三、Python开发http接口(这个可以不关注)
四、Jmeter设计接口测试的脚本以及用例场景
五、连接ant和jmeter配置(注意点)
六、build文件配置
七、创建job构建脚本
1、创建配置如下:
2、构建
重点:600G的学习资料,懂的都懂
Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。JMeter还可以做接口测试和性能测试。
JMeter 官方下载地址:Apache JMeter - Download Apache JMeter
Java JDK 1.8 官方下载地址:Java Downloads | Oracle
Jmeter 与JDKL下载完成后直接安装即可。安装完成后就可以配置JDK的环境变量
1、在环境变量中新建一个系统变量,变量名为JAVA_HOME,变量值:C:\Program Files\Java\jdk1.8.0_341,该地址为自己本地安装JDK的路径。
2、在系统变量中新建一个系统变量。
变量名:CLASSPATH
变量值:%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jara;
如果系统变量中存在该变量可直接将变量值添加在该变量中就可以,注意要用‘;’ 分隔。
3、在系统变量Path中新增俩个变量值,分别是%JAVA_HOME%\bin 和 %JAVA_HOME%\jre\bin
4、验证 java jdk的环境变量是否配置成功,打开cmd命令窗口输入java -version ,回车后展示java 版本号即可
1、在环境变量中新建一个系统变量。变量名:JMETER_HOME,变量值:D:\JMeter\apache-jmeter-5.4.1 (JMeter的安装目录)。
2、在系统变量中选择CLASSPATH变量编辑,在变量值后面添加上 %JMETER_HOME%\lib\jorphan.jar; 然后保存即可。
3、在系统变量Path 中新建一个,将%JMETER_HOME%\bin添加在里面,然后保存即可。
4、验证JMeter的环境变量是否配置成功,打开cmd命令窗口输入jmeter ,回车可打开jmeter即可。
jmeter的目录结构和重要文件讲解
(一)bin目录
1、ApacheJmeter.jar
2、jmeter.bat
3、jmeter.properties(配置文件) 改参数
4、jmeter-server.bat
(二)docs
1、api(二次开发有关)
(三)extras
(四)lib目录
1、该目录是jmeter启动时的默认的claspath。这就意味着在使用jmeter进行测试的过程种,是需要import操作的。(报错:xx class not found)的类都不洗达成jar包放入lib目录。
2、ps:lib目录改变,不许重启jmter才会生效
3、ext 目录(存放jmeter第三方组件和插件)
(五)printable_docs(帮助文档)
(一)借助第三方工具录制生成:
1、badboy
2、blazemeter
(二)使用自带的http代理服务器方式生成:
1、第一步:添加线程--线程组
2、第二步:添加配置元件 --http cookie 管理器
3、第三步:添加非测试元件 --http 代理服务器 (老版本在工作台
4、第四步:配置http代理服务器并启动
(1)端口:由用户指定,在jmeter所在机器中未被占用即可。和被测试的服务器端口没有任何关系。
(2)目标控制器:是用来指定用于存放脚本的组件,建议选择测试计划--线程组
(3)过滤器
5、第五步:在客户端进行设置,使得客户端的请求通过代理。
(1)internet--连接--局域网设置
· 地址: 填写jmeter 代理服务器所在机器的ip地址。
· 端口: 填写jmeter 代理服务器所设置的端口。
(2)排除模式: .*www\.baidu\.com.*
(三)抓包手写
1、熟悉协议
2、熟悉抓包工具
3、熟悉接口测试工具
jmeter 的脚本是由不同的组件构成的;同一种类型的组件的图标是相同的
(一)测试计划:自带组件,jmeter所有的其他类型组件都是必须位于该组件下
(二)线程组(接口测试不需要做区分,性能测试需要做区分):必选组件,jmeter是通过该组件来控制线程的数量(执行脚本的线程),循环次数`
(三)逻辑控制器:可选组件,是用来控制脚本的一些执行逻辑
(四)取样器:Sampler,即请求,属于必加组件。我们要去实现接口测试,则需要根据接口类型选择取样器
(五)其他组件:配置元件,定时器,前置处理器,后置处理器,断言,监听器,这六大类组件都是辅助组件,都是用来服务取样器组件的
1、①配置元件:是用来完成一些基础配置工作的。
②http cookie 管理器:是用来实现cookie管理功能
③http 信息头管理器:是用来添加http的信息头
2、定时器:和时间控制有关的组件
3、前置处理器:处理在请求之前的一些组件
4、后置处理器:运行在请求之后的组件
5、断言:是用来实现检查点、断言的组件
6、监听器:日志组件,用来管理日志
(六)作用域: 是 jmeter中,六大辅助组件对于取样器组件的生效规则。 定义:辅助组件对于其父级组件,所有同级组件,所有同级组件的子组件有效
1、其中:定时器、前置处理器是运行在作用域内的每一个请求之前,和组件的先后无关,运行次数等于请求的次数
2、后置处理器、断言是运行在作用域内的每一个请求会后,和组件的先后无关,运行次数等于请求的次数
3、模块控制器,交替控制器(接口测试),随机控制器(性能测试)
(一)参数化
1、实现方式:函数方式,文件方式
2、参数调用格式:统一格式:${参数名}
(二)自动跳转首页:①HTTP信息头管理器 ②正则表达式提取器 正则表达式: 引用名称:verify ( RegExp Tester → Regular expression) 正则表达式:var ='(.*?)' ,var modeing 模板:$1$ 匹配数字(0代表随机):1
(三)测试计划→ Debug Sampler
(四)查看结果树→ 仅错误日志
(五)汇总报告 ,聚合报告
(六)事务控制器的顺序不能改变
(七)检查点
1、检查点的作用
2、响应断言的使用
(八)同步定时器
二.全局配置文件jmeter.propties
在%JMETER_HOME%\bin(or $JMETER_HOME/bin)目录下存在多个配置文件:
jmeter.properties
system.properties
update.properties
user.properties
reportgenerator.properties
saveservice.properties
log4j2.xml
其中最重要的是jmeter.properties.下面对其常用的一些配置项的设置进行总结与说明.
1 GUI语言
#language=en
language=zh_CN #简体中文
功能:设置JMeter GUI界面的显示语言
说明:若没有设置,则使用JVM(Java虚拟机)设置的locale语言.
在Linux中可以设置JVM的locale:
[root@localhost ~]# locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
[root@localhost ~]# vi /etc/sysconfig/i18n
[root@localhost ~]# cat !$
cat /etc/sysconfig/i18n
LANG="zh_CN.UTF-8"
[root@localhost ~]#
注意:此配置项只能在jmeter.properties中设置才有效.
2 GUI图标放大比例设置
JMeter GUI界面布局
当JMeter以GUI模式运行时,窗口主要由三部分构成:
1)功能区
上方菜单栏,下方工具栏。菜单栏展示了JMeter提供的功能菜单,而工具栏中的图标
是常见功能的快捷方式。
2)视图区
以树状结构呈现JMeter元素,其中“Test Plane”是树的根节点,每一个节点就是一个JMeter元素。
在此区域可以添加、删除节点或者通过拖曳调整节点的位置。
3)内容区
当在视图区选中一个JMeter元素节点时,内容区则会相应地显示该元素的内容。
这时可以对其内容进行查看、设置等操作。
GUI图标放大比例设置
jmeter.hidpi.mode=true #开启视网膜模式
jmeter.hidpi.scale.factor=1.2 #将图标放大1.2倍
3 功能区工具栏图标大小设置
#工具栏图标默认size: 22x22
#可用size: 22x22, 32x32, 48x48
jmeter.toolbar.icons.size=32x32
4 视图区目录树图标大小设置
#目录树图标默认size: 19x19
#可用size: 19x19, 24x24, 32x32, 48x48
jmeter.tree.icons.size=24x24
5 内容区编辑字体设置
#调整JMeter内容区的编辑字体
jsyntaxtextarea.font.family=consolas #默认Hack,太难看,使用经典的consolas
jsyntaxtextarea.font.size=18 #这两个配置项必须同时设置才有效
6 响应数据编码设置
#响应数据编码默认为ISO-8859-1(即Latin-1)
sampleresult.default.encoding=UTF-8 #设置为UTF-8,避免出现乱码
7 添加JMeter元素快捷键设置
#配置添加JMeter元素时使用的快捷键,最多支持10个.
#在windows上可以使用 Ctrl+0 Ctrl+1 ... Ctrl+9
#在macOS上可以使用 Command+0 Command+1 ... Command+9
gui.quick_0=ThreadGroupGui #新增线程组
gui.quick_1=HttpTestSampleGui #新增HTTP取样器
gui.quick_2=RegexExtractorGui #新增正则表达式提取器
gui.quick_3=AssertionGui #新增响应断言
gui.quick_4=ConstantTimerGui #新增常量定时器
gui.quick_5=TestActionGui #新增测试活动
gui.quick_6=JSR223PostProcessor #新增JSR223 后置处理程序
gui.quick_7=JSR223PreProcessor #新增JSR223 预处理程序
gui.quick_8=DebugSampler #新增调试取样器
gui.quick_9=ViewResultsFullVisualizer #新增察看结果树
8 HTTP Request Post Content-Type设置
# Should JMeter add to POST request content-type header if missing:
# Content-Type: application/x-www-form-urlencoded
# Was true before version 5.0
post_add_content_type_if_missing=true
说明:此配置项在JMeter5.0以前默认值为true,以后版本默认为false,故在5.0以后的版本中
发送POST请求,将参数放在"body data"中,且没有设置
Content-Type时,默认为Content-Type值为"text/plain",而不是"application/x-www-form-urlencoded".
9 日志级别设置
从JMeter3.2开始,日志级别不再在jmeter.properties中设置,而是通过apache log4j2
配置文件log4j2.xml中设置日志级别:
#将level的值改为对应的日志级别,默认为info,也可以在GUI界面临时设置日志级别
log4j2定义了8个级别的日志,优先级从高到低依次为:
OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL
ALL 用于打开所有日志记录
TRACE 追踪日志
DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的
INFO 消息在粗粒度级别上突出强调应用程序的运行过程
WARN 表明会出现潜在错误的情形
ERROR 指出虽然发生错误事件,但仍然不影响系统的继续运行
FATAL 指出每个严重的错误事件将会导致应用程序的退出
OFF 用于关闭所有日志记录
用于初始化默认值和变量,以便后续采样器使用。配置元件大其作用域的初始阶段处理,配置元件仅对其所在的测试树分支有效,如,在同一个作用域的任何采样器前。
前置处理器会在采样器发出请求之前做一些特殊操作。如果前置处理器附着在某个采样器之下,那么它只会在该采样器运行之前执行。前置处理器通常用于在采样器发出请求前修改采样器的某些设置,或者更新某些变量的值(这些变量不在服务器响应中获取值)。
定时器会让作用域内的每一个采样器都在执行前等待一个固定时长,如果不设定这种延迟,JMeter可能会在短时间内产生大量访问请求,导致服务器被大量请求所淹没。如果为线程组添加了多个定时器,那么JMeter会将这些定时器的时长叠加起来,共同影响作用域范围内的采样器。定时器可以作为采样器或者逻辑控制器的子项,目的是只影响作用域内的采样器。
采样器告诉JMeter发送一个请求到指定服务器,并等待服务器的请求。采样器会按照其在测试树中的顺序去执行,还可以用逻辑控制器来改变采样器运行的重复次数。
后置处理器会在采样器发出请求之后做一些特殊操作。如果后置处理器附着在某个采样器之下,那么它只会在该采样器运行之后执行。后置处理器通常被用来处理服务器的响应数据,特别是服务器响应中提取数据。
用户可以使用断言来检查从服务器获得的响应内容。通过断言可以测试服务器返回的响应与测试人员的期望是否相符
监听器提供了对JMeter在测试期间收集到的信息的访问方法。"图形结果"监听器会将系统响应时长绘制在一张图片之中。"查看结果树"监听器会展示采样器请求和响应的细节,还可以将测试数据导入到文件之中,以供后续分析。
逻辑控制器可以帮助用户控制JMeter的测试逻辑,特别是何时发送请求。逻辑控制器可以改变其子测试元件的请求执行顺序。
测试计划的元素执行是有序的,通过以下方式执行: 1–配置元件(Config Element) 2–前置处理器(Pre Processors) 3–定时器(Timer) 4–取样器(sampler) 5–后置处理器(Post Processors,只在有结果可用情况下执行) 6–断言(Assertions,只在有结果可用情况下执行) 7–监听器(Listener,只在有结果可用情况下执行)
元件收集其作用范围的每一个sampler元件的信息并呈现,在jmeter中,元件的作用域是靠测试计划的的树型结构中元件的父子关系来确定的,作用域的原则是:
配置元件(Config Elemnet)-->用户自定义变量组件(User Defined Variables):这个组件不管放在哪个位置,它定义的变量都会被整个线程所共享。
例如:
下面这个例子,测试计划定义如下:
1、定义了三个sampler:one、Debug Sampler、two
2、在one下面定义了一个用户自定义变量:在这里添加了一个变量,名为hello,值为world
3、一个监听器:查看结果树
目的:测试在sampler one下定义的变量是否能被sampler two和debug sampler所引用
one:
User Defined Variables:
two:
运行结果:
由上可知:在one下面定义的用户变量,在debug sampler和two处都能正常使用。
可以理解为被测项目,下面可以添加一系列待测接口。
可自定义名称,便于自己理解。
一个线程组可以当做一个虚拟用户组,线程组中每个线程都可以裂解为一个虚拟用户。这个在性能测试中会用到,接口测试暂时不用关注,默认值为1即可。
进行接口测试时需要填写协议,IP地址及端口号,为了避免重复操作,可在线程组下添加HTTP请求默认值,填入协议、IP地址和端口号,这样后续的HTTP请求中就不用每次都填写了。
如果请求参数非json格式,可以不用添加此元件。
该元件是针对传入参数为json格式,需添加名称为Content-Type,值为application/json
HTTP请求主要包括请求方法、请求路径和请求参数。
由于协议、IP地址、端口号已经在HTTP请求默认值进行了设置,所以此处可以为空。
(1)传入非json格式的参数,可以直接在HTTP请求面板中【参数】下进行添加:填写参数名称与对应的值
(2)传入json格式参数,如果参数值存在中文的情况,内容编码需为utf-8格式,避免乱码情况的发生
主要目的是检查接口是否访问成功。断言的方式比较多,包含响应断言、JSON断言,大小断言,JSR223断言等等,一共提供15种断言方式,一般常用的主要是响应断言,也可以用JSON断言。对于复杂的接口,可借助BeanShell断言。
这里主要介绍响应断言的用法。
HTTP请求上鼠标右击 – 添加 – 断言 – 响应断言
详情如图:
Apply to 指断言的作用范围,一般情况下发出一个请求只触发一个请求,所以默认勾选Main sample only即可。下面针对四种选项做个说明:
(1) Main sample and sub-samples:作用于主请求和子请求
(2) Main sample only:仅仅作用于主请求
(3) Sub-sample only:仅仅作用于子请求
(4) J Meter Variable:作用于j meter变量(输入框填写变量名称)
响应字段 主要包含响应文本、响应代码、响应信息、响应头、请求头、URL样本、文档(文本)、忽略状态、请求状态,下面针对每种方式做个说明:
(1) 响应文本,一般匹配返回的json数据,需要结合模式匹配规则进行校验
根据响应文本的测试模式”records”(*?)匹配到内容,只要包括这些内容,则判断接口执行通过。
(2) 响应代码,匹配返回码,如200,404,500等
(3) 响应信息,匹配响应信息,如OK, Sucess字样
(4) 响应头,匹配响应头
(5) 请求头,匹配请求头
(6) URL样本,匹配请求的url链接,如果有重定向则包含请求url和重定向url
(7) 文档(文本),匹配响应数据的文本格式
(8) 忽略状态,一个请求有多个响应断言,第一个响应断言选中此项时,如果第一个响应断言失败时可以忽略此响应结果,继续进行下一个断言。如果下一个断言成功则还是判定事务是成功的
(9) 请求数据,匹配请求数据
实际比较常用的是响应文本、响应代码、响应信息,这三种还是无法满足的则继续补充其他字段。
模式匹配规则,有包括、匹配、相等、字符串、否、或者。
(1) 包括,响应内容包括需要匹配的内容就表示响应成功,可结合正则表达式进行
(2) 匹配,响应内容要完全匹配需要匹配的内容就表示响应成功,可结合正则表达式进行
(3) 相等,响应内容要完全等于需要匹配的内容才代表响应成功,不支持正则表达式
(4) 字符串,响应内容包含需要匹配的内容才代表成功,不支持正则表达式
(5) 否,相当于取反,如果结果是True,勾选上“否”那结果就是False
(6) 或者,可以用于将多个断言模式进行连接,只要一个模式匹配,断言就代表成功
测试模式,其实就是填写自己的预期值。
7.监听器-察看结果树,主要用于查看接口执行情况,以树形结构显示接口访问结果,包含取样器结果、请求与相应数据。
线程组上鼠标右击 – 添加 – 监听器 – 察看结果树
监听器还包含其他形式如汇总报告、聚合报告、后端监听器等,接口测试主要用到的就是察看结果树。
通过察看结果树可以了解接口执行情况,如果执行失败需要看下错误信息。
至此,使用J Meter进行常用的接口测试就结束了,实际使用过程遇到的特殊情况可以及时反馈(其实和Postman测试接口大同小异~)
JMeter做接口测试的时候,请求有三种类型可选择
1、Parameters:键值对,有空格会报错(URIsyntaxException)
2、Body Data:Json或xml格式
json
{“key”:“46a848a99aac2731d080b42a5b5f6ef4”,“city”:“邯郸”}
xml
1
3、Files Upload:处理文件上传的请求
File path:文件的绝对地址
Parameter Name:参数名称(如file)
MIME type:多媒体类型,根据文件后缀查找
三个参数必填,否则报错
注意:
Parameters界面有内容时切换至Body Data界面会报错,这两种方式只能二选一,而Files Upload不受影响
前言:
在使用Jmeter做接口测试,性能测试过程中,经常会遇到参数化问题 。这里小编提供几种常用的参数化方法。
想了解更多相关知识请关注我吧!点击下方蓝思字体领取或者添加V:mashang-zz(备注:999)全套【软件测试/自动化测试】海量资料免费领取
一般用于变化不是特别大,但是还是需要进行参数化的变量,如:IP,端口等
1、点击线程租-配置元件-用户定义的变量,在页面输入需要参数化的变量和值。
2、在对应需要使用上述变量的地方引入,后续可通过查看结果树查看
也可直接在测试计划中直接添加用户定义变量,操作同上,不再重复。
1、点击线程组-添加-前置处理器-用户参数
每次迭代更新一次:如果有多个用户/使用变量时勾选,如果不勾选,所有线程用的是同一个值,需要不同的线程用不同的值,需要勾选此选项
2、在Http请求中使用参数
1、进入Jmeter安装目录的bin目录下,找到user.properties文件
2、用Notepad编辑器,打开user.properties文件,并在文件末尾添加需要定义的变量的参数,并保存关闭该文件
3、重新启动jmeter,使用函数助手中的函数,点击选项-函数助手对话框,选择函数__P。
属性名称:与user.properties文件中变量名一致
默认值:如果user.properties文件中没有设置要使用的参数值,优先使用该默认选项,如果文件中已设置就优先使用文件中的参数值
4、生成并复制函数字符串:${__P(ip,192.168.100.100)},在Http请求中使用参数
txt/csv 文件参数化方法是在性能测试中最常用的测试方法,将参数化的数据提前保存在以.txt 或者以.csv 结尾的文件中,多个参数使用,隔开
1、点击线程组-添加-配置元件-CSV Data Set Config
image.png
2、在当前测试计划存储的同一目录入,新增 01_定损打开定损单测试数据.csv文件,内容如下:
1、以mysql为例,先要下载mysql驱动mysql-connector-java-5.1.12-bin.jar 下载地址:Index of /pub/mysql/Downloads
2、将上述jar包放到Jmeter的lib目录下
3、点击线程组-添加-配置元件-JDBC Connection Configuration,建立JDBC连接。
4、添加“Sampler”-“JDBC Request”,在SQL Query中输入查询语句
5、JDBC Request请求中添加“后置处理器”->“正则表达式提取器”,以提取上一步中的参数。
通过使用BeanShell内置对象vars可以对变量进行存取操作
vars.get("name"):从jmeter中获得变量值
vars.put("key","value"):数据存到jmeter变量中,vars.put 中均为字符串
1、点击 线程组-添加-Sampler-BeanShell Sampler,在Script区域,构造变量accidentNo
代码如下:
//获取本次生成的随机数并赋值给JMeter变量
String randStr="
{__threadNum}${__counter(,)}";
vars.put("randStr",randStr);
log.info("本次生成的随机数为:" + randStr);
String accidentNo="acc_"+randStr;
vars.put("accidentNo",accidentNo);
2、在Http请求中使用参数变量
JMeter对各种类型接口的测试
默认做接口测试前,已经给出明确的接口文档(如,http://test.nnzhp.cn/wiki/index.php?doc-view-59);本地配好了JMeter 3.x的运行环境;
打开JMeter,添加一个线程组和该线程组的查看结果树。以下的几种接口请求我们都在这个线程组中添加和运行。
如果你的JMeter返回数据是乱码,解决办法是,在JMeter安装路径的bin目录下,打开文件jmeter.properties,把Sampleresult.default.encoding的值改为 utf-8 即可。
e.g. 获取用户信息
添加http请求;填写服务器域名或IP;方法选GET;填写路径;添加参数;运行并查看结果。
e.g. 获取用户余额
添加http请求;填写服务器域名或IP;方法选POST;填写路径;在参数区域选Body Data标签;写入Json串参数,注意Json格式;运行并查看结果。
*注意:
Json传参时,往往参数相对复杂,规模较大,很多时候是Json串再嵌套Json串,在写入body的时候如果哪里格式不对会影响传参,而JMeter本身是不能对Json进行格式校验的(Postman可以进行简单的Json校验),我们可以借助这个网站来校验你的Json串的格式,www.bejson.com 再把确保格式正确的Json串填入body。
e.g. 修改用户余额
添加http请求;填写服务器域名或IP;方法选POST;填写路径;填写参数;
添加授权管理器,右击线程组->添加->配置元件->HTTP授权管理器;
打开HTTP授权管理器,在基础URL添加路径;填写用户名、密码(接口文档会给出);添加域即请求的服务器域名或IP;其他默认;
运行请求并查看结果。(该接口暂时有问题请求返回500,只要掌握需要权限验证的接口如何做就好)
e.g. 获取用户信息2
添加http请求;填写服务器域名或IP;方法选POST;填写路径;填写参数;
添加HTTP信息头管理器,右击线程组->添加->配置元件->HTTP信息头管理器;
打开HTTP信息头管理器,参照接口文档填写好header信息;
运行请求并查看结果。
e.g. 修改用户余额2
添加http请求;填写服务器域名或IP;方法选POST;填写路径;填写参数;
添加HTTP Cookie管理器,右击线程组->添加->配置元件->HTTP Cookie管理器;
打开Cookie管理器,参照接口文档填写好Cookie信息;
发送请求并查看结果。
请求通过某个接口上传文件
e.g.上传文件
添加http请求;填写服务器域名或IP;方法选POST;填写路径;在参数区域选Files Upload标签,添加文件全名(包含绝对路径,也可以点击浏览按钮添加),写入参数名;发送请求并查看结果。
JMeter的参数化
这种方法常用来解决线程组中多个请求共用相同的数据,比如我们以上所有请求都有相同的IP地址,当地址改变时可以一改全改。
添加用户定义的变量,右击线程组->添加->配置元件->用户定义的变量;
打开用户定义的变量,添加变量,写好名称和值;
脚本中用到该值的所有地方都可以引用这个变量名了,引用变量的格式为 ${变量名};
测试过程中,有时候数据不适合被指定,可选择借助函数来生成,以下是最常用的几种。
用函数生成随机数:(__Random)
在Jmeter中点击 选项->函数助手对话框;
在弹出的对话框中选__Random,填写随机数的范围,点击生成按钮,就看到你需要的字符串了;
尝试在请求中使用生成的随机数,把刚拷贝的字符串粘贴到请求的参数里;
发送请求,查看请求中参数值的情况,参数生效了。
用函数生成当前时间:(__time)
用函数生成通用的唯一识别码:(__UUID)
用于读取在文件中维护的参数,如参数文件内容如下;
注意,Jmeter读取文件总的参数是从第一行就开始了的,千万不要犯下面的错误。
在Jmeter中右击线程组->添加->配置元件->CSV Data Set Config;
打开设置窗口,写入参数文件的全名(含绝对路径),变量名,Delimiter就用默认的逗号,表示在准备参数文件时参数表的列之间用逗号隔开;
在请求中引用参数时应该是酱紫的:${username} ${pwd},用它们来顶替对应的参数值。
在线程组内,当你想用一个请求的响应结果作为另一个请求的入参时就需要用到关联。
用正则表达式关联
思路是先从某个请求的响应数据中提取你需要的值,在把这个值在另一个请求中入参,操作如下:
在需要被提取响应数据的请求下添加正则表达式提取器,右击添加->后置处理器->正则表达式提取器;
在正则表达式提取器中填写 引用名称,不说也知道用途;正则表达式,最简单的办法是在响应数据中把要提取的目标值左右若干字符包含目标值的一行拷贝出来,粘贴到正则表达式框内,在把目标值用一对小括号替换,括号里用添上合适的匹配符本例如(.*); 注意在响应数据中拷贝时尽量避开需要转义的字符如果不能避开,请转义;模板通常固定填$1$;匹配数字1代表区匹配的第一个值;缺省值是在匹配失败时取得的值,通常用来检查匹配是否成功;
用${age}入参给另一个请求,查看结果传参成功。
用Json Path Extractor 插件关联
只针对Json格式的Response 取值,右击请求添加->后置处理器->JSON Path Extractor;
在JSON Path Extractor中填入引用名和JSONPath Expression;
在另一个请求中入参,也和上面的结果一样转参成功。
注意,JSON Path Extractor这个插件只能在Jmeter3.x以上的版本安装。
Jmeter添加断言检查结果
右击请求添加->断言->响应断言;
添加并写入希望在响应结果中看到的内容;
发送请求,查看结果;
Jmeter操作Mysql
测试计划添加.jar包 mysql-connector-java-5.1.7-bin.jar用于使Jmeter可以读取Mysql;
线程组添加 JDBC Connection Configuration (添加->配置元件-> JDBC Connection Configuration)用于配置Jmeter和Mysql的连接;
JDBC Driver class是固定的,Jmeter操作各类数据的Driver参考下图;
线程组添加JDBC Request(添加->Sampler-> JDBC Request) 用于写sql来操作Mysql;
发送请求,成功访问Msql。
这篇文章主要介绍了Jmeter的接口测试详细步骤并实现业务闭环,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
执行顺序:测试计划→线程组→配置元件→前置处理器→定时器→取样器→后置处理器→断言→监听器
作用域:
组件会作用于他的同级父级组件,同级组件及同级组件的子组件(可以通过查看结果树来验证作用域,如下图所示)
客户端第一次访问服务器,服务器就会生成Cookie,然后通过响应头里的Set-Cookie传输到客户端,然后保存客户端。第2-N次访问服务器时,那么在请求头里面通过Cookie把我们保存在本地的Cookie信息传输到服务器以实现鉴权。
Web的接口测试基本都要加Cookie
简单控制器右键→取样器→HTTP请求
在HTTP请求(登陆请求)右键→后置处理器→Json提取器:这个主要用来提取请求返回结果中需要的数据,下图中设置的就是获取登录的返回值中的token,后并设置变量名为“Authorization”,后面测试别的接口的时候需要调用这个值。
需要验证Json提取器是否起作用,可以通过右键添加取样器Debug Sampler,这样查看结果树中就会展示提取器中获取详细信息。
右键添加→断言→响应断言,在应用场景中的断言包括状态断言和业务断言,状态断言主要用于检测响应的状态是否和预期一致,业务断言测试请求或者响应中返回值是否满足业务需求。
【状态断言】:下图为检测响应状态是否为200
【业务断言】:下图为测试请求响应中否包含token
通过右键添加→监听器→断言结果,可以查看添加的断言的结果
以上就是Jmeter的登录接口测试的一个正常流程,根据设计的接口测试用例增加请求测试
Jmeter用于接口测试时,后一个接口经常需要用到前一次接口返回的结果,本文主要介绍了jmeter实现接口关联的两种方式,感兴趣的小伙伴们可以参考
在开展接口测试或者是接口面试的过程中,我们会发现很多接口需要依赖前面的接口,需要我们动态从前面的接口返回中提取数据,也就是我们通常说的关联。
关联通俗来讲就是把上一次请求的返回内容中的部分截取出来保存为参数,用来传递给下一个请求使用。
正则表达式提取器,见名知意就是使用正则表达式的方法把我们需要提取的内容通配出来。
原理:通过左右二边不变的边界来提取中间变的返回值
如上图:需要提取access_token
{"access_token":"31_qz2HtPalsk5Ey1ToWJaZ6Kaojf8y-BhxTHEmuO111m8_Gc_77HRvMuG4ltbd9gHskqi0XAq8phQys9K8awso4iq-VSr0bArrd-zC-nY0Ltudp-HcPZV7y291YjLYoeJBHW2zhB7-lWYzeTsqFKOhAHANSW","expires_in":7200}
引用名称:即下一个请求要引用的参数名称,如填写access_token,则可用${ access_token}引用它。
正则表达式:()括起来的部分就是要提取的。.代表任意字符,+表示一次或多次,*代表出现任意次。
模板:用$$引用起来,如果在正则表达式中有多个正则表达式,则可以是$2$,$3$等等,表示解析到的第几个值给access_token。本处只有1个,所有使用$1$。
匹配数字:0代表随机,-1代表所有,其余正整数代表将在检查的内容中,第几个匹配的内容提取出来。
添加调试取样器-->运行测试-->通过查看结果树里面的 调试取样器 查看结果
如果你觉得此文对你有帮助,如果你对此文有任何疑问,如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣欢迎加入软件测试技术群:695458161,群里发放的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。
使用场合:接口关联,当前一个接口返回的数据类型为json格式的数据,需要从返回的json数据中提取数据。
可以将返回的值复制到 www.bejson.com-->json菜单-->json视图-->json数据中,然后点击试图查看,如下图:
Name of created varialies:即下一个请求要引用的参数名称,如填写access_token,则可用${ access_token}引用它。
JSON Path expressions:填写jsonpath,格式:$. 节点名称 根节点用 “.” 表示
Match Numbers:0代表随机,-1代表所有,其余正整数代表将在检查的内容中,第几个匹配的内容提取出来。
Default Values:找不到时默认值,一般设置为NOT FOUND
Compute concatenation var(suffix_ALL):是否统计所有,即将匹配到的所有值保存,名为“变量名_ALL”
如图:{"tag":{"id":193,"name":"newdream20200324"}}
JSON提取器配置如下: $.tag.name
到此这篇关于jmeter实现接口关联的两种方式(正则表达式提取器和json提取器)的文章就介绍到这了
比如我们有一个产品管理的系统,我们需要进行API接口测试 这里我们以书籍管理系统为例,进行增删改查接口的测试 当我们添加一本书籍时,系统会自定义给这本书籍定义一个id,当我们后期修改书籍和删除书籍的时候就需要调用这个id,但是这个id不是一个固定的值 这种情况就需要定义一个动态参数,后期使用我们直接调用就可以
1、我们先在jmeter的测试工具里面加一个添加的测试用例 2、测试用例添加成功后,发送请求,在响应数据中获取它的动态参数,获取的方式具体为: A、在该测试用例中,右键添加后置处理器中的JSON提取器或者是正则表达式提取器 B、就以JSON提取器为例,定义一本变量,来获取动态参数的值 3、在后续的查看修改删除中,使用到这个动态参数的ID,通过调用变量的方式,具体为:${变量的值}
1、我们先在postman的测试工具里面加一个添加的测试用例 2、测试用例添加成功后,发送请求,在响应数据中获取它的动态参数,获取的方式具体为: A、在postman的tests里面首先通过JSON.parse(responseBody)获取相应数据 B、获取响应数据成功后,使用pm.environment.set来定义一个全局变量,变量的值就是获取到的动态参数 3、在后续的查看修改删除中,使用到这个动态参数的ID,通过调用变量的方式,具体为:{{变量名称}}
在演示的书籍管理系统中,我们添加书籍后系统会自动定义一个书籍id,我们就需要在添加书籍的时候先拿到添加成功后的响应参数,然后在该测试用例下定义bookID
在修改添加的书籍,查看添加的书籍跟删除添加的书籍时,在请求地址跟断言的时候都需要都调用前面定义的动态参数bookID
所谓断言,就是检查接口的返回是否符合预期。
自动化测试脚本,如果断言做的不好,就好比测试用例不写预期结果,因此我认为断言是最重要一部分。
关于如何做好断言,我觉得要做到:要断言的内容一定是唯一的,每个接口都要做断言。
举例
用例:新增一条数据,然后去列表查看新增是否成功。新增数据,如果成功返回数据id,如下:
{
"id": "63c81f8c-ba80-4504-ac1d-66f3774307b2",
"msg":"ok",
"code":0
}
列表数据返回如下:
无数据
{
"data": []
}
有数据
{
"data": [
{
"id": "63c81f8c-ba80-4504-ac1d-66f3774307b2",
"name": "zhangsan"
}
]
}
如何要断言列表中存在我新增的数据?错误断言:断言data,不管是否存在我们要的数据,返回内容都包含data正确断言:从新增接口提取返回的ID,然后断言ID出现在列表中注意:如果id是自增形式的,建议使用json断言,在这里json断言是首选
实现断言的三种方式
我们首先要把新增接口的id提取出来,用到json提取器,具体配置见下图
JSON断言
json断言配置如下,取出列表所有数据的id看是否存在新增返回的id
关于json断言配置解释,在前面文章已经有介绍。
响应断言
通过响应断言进行断言预期,只需要判断列表数据中出现id,配置如下
关于响应断言配置解释,在前面文章已经有介绍。
Beanshell断言
Beanshell断言在实际运用的比较少,除非是结果需要经过处理后进行断言才用得到,本文为了举例,用Beanshell断言实现我们的目的,配置如下
附上脚本源码
import org.json.*;
//获取上一个请求的返回值
String response = prev.getResponseDataAsString();
//将返回值转换为json
JSONObject responseJson = new JSONObject(response);
//从json提取data数组
JSONArray dataList = responseJson.getJSONArray("data");
//遍历所有列表,判断是否存在id
for(i==0;i
补充
假如我们执行删除数据后,我们需要断言不存在于列表
响应断言取反
json断言取反
Beanshell断言读者自己想想如何处理吧!
最近想慢慢把jmeter的相关元件都用实例实践下,增强下自身的动手能力,切忌眼看手不动。
1、项目实例:测试登录接口
2、思路:将每一条用例的预期结果一并保存在csv文档中,循环读取文档中的期望结果,来跟实际运行的结果进行一致性判断,高效实现接口自动化。
3、实例步骤:
1)整理测试数据及预期结果的csv文档
2)CSV测试数据参数化
a.csv数据文件设置
变量名称:CSV文件中的数值存放在变量中,供后续引用。变量可以多个,用英文逗号隔开,变量分别读取CSV文件中的列
b.线程组设置
一般CSV文档中有几条用例,就设置线程数为几
c.登录接口的入参变量引用
这里的变量引用,是前面csv文件设置的变量,所以在接口中可以用${}进行引用
d.设置断言
同上,这里的变量引用,是前面csv文件设置的变量,所以在接口中可以用${}进行引用
e.运行查看结果树
数据驱动测试,即是分离测试逻辑与测试数据,通过如excel表格的形式来保存测试数据,用测试脚本读取并执行测试的过程。
大量的测试脚本与测试数据内聚在一起,使得我们的测试脚本的可移植性及可维护性变得很不好,所以我们接下来采取了csv格式表格保存测试数据来驱动测试的方式。
注:个人感觉这种用excel维护的也有点生硬,不过是初学,先记录下来先吧,后续如果技能进阶了,会继续更新哈
用Jmeter实现几个接口用例测试
思路:用excel设计好测试用例后,jmeter读取执行
实例步骤:
1)设计测试用例,保存为csv格式
列名分别为:用例编号、接口名称、接口地址、请求方式、测试目的、入参、期望结果
2)设计测试脚本读取csv中的测试用例数据
a. 线程组下新增循环控制器,循环次数设置为永远
b. 循环控制器下新增CSV Data Set ConFig控件
c. 添加if控制器,来做判断执行
c.1 判断请求方式为POST则执行POST请求
c.2 判断请求方式为GET则执行GET请求
d. 配置响应断言
e. 执行后查看结果树
一个 http 请求指从客户端到服务端的请求消息,我们可以通过浏览器的F12键,可以看到以下信息:
请求方法:即http请求的提交方式,一般以get和post居多URI:请求资源的标识,可以理解为一个请求的路径信息协议:http协议
版本: 1.1
请求正文:请求参数
请求头:告诉服务器关于客户端环境和请求正文相关的一些信息,例如浏览器版本,请求参数的长度
User-Agent:告诉服务器客户端的相关信息(如果是浏览器会有版本,内核等信息)referer:告诉服务器,此请求是从哪个页面上发出来(防盗链)
X-Requested-With:告诉服务器这个是一个ajax请求
Cookie:带给服务器的cookie信息
请求头可以在代码中指定,添加,通过键值对的形式,调用:addHeader (Stringname,String value)即可在请求对象中添加一个名字为name,值为value的请求头。
一个http response (http响应)指的是从服务端到客户端的响应消息,它包括了以下信息:
总结:
“set-Cookie”这个响应头的作用是告诉浏览器需要缓存的 cookie 数据。如果对于 cookie 不太明白的同学,可以去这个博客下面看一看这篇文章:
其他几个比较常见的响应头,大家也可以适当了解学习下:
${__base64Encode(需加密的文本,)}
${__base64Decode(需解密文本,)}
直接上代码
import java.io.*;
import org.apache.commons.codec;
import sun.misc.BASE64Decoder;
log.info("------------开始加密-------------------");
String encryption = new sun.misc.BASE64Encoder().encode("hc_staging".getBytes());
vars.put("encryption", encryption);
log.info("加密后的值------->>"+encryption);
log.info("------------加密结束-------------------");
log.info("------------开始解密-------------------");
org.apache.commons.codec.binary.Base64 base64=new org.apache.commons.codec.binary.Base64();
String decrypt=new String(base64.decode("aGNfc3RhZ2luZw=="));
vars.put("decrypt",decrypt);
log.info("解密后的值------->>"+decrypt);
log.info("------------解密结束-------------------");
${__digest(MD5,需加密文本,,,)}
Jmeter 中BeanShell 中支持JAVA语言,可以使用Java来辅助我们实现一些逻辑,如果我们不会写Java怎么办,比如使用比较熟悉的语言例如Python(目前对于测试人员来说Python属于普及的语言)来代替实现一些代码逻辑。
介绍Jmeter 执行Python代码,首先我们需要来先介绍下JSR,因为这个过程的实现与他密切相关。
JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。
我们了解了什么是JSR以后我们下面需要在Jmeter中使用JSR223标准来执行我们自己的Python代码
Jmeter JSR223 支持的语言#
Jmeter 基于JSR223标准 支持使用多种编程语言编写脚本程序,默认使用Groovy,默认是不支持Python语言,我们需要通过Jpython来扩展Jmeter对Python语言的支持
下载jython
Downloads | Jython
把下载的jython-standalone-2.7.2.jar 放到 jmeter的lib/ext文件夹。重启jmeter,此时就可以看到支持Python语言
添加JSR223 Sampler#
选择实现逻辑的语言
实现MD5加密#
import hashlib
# 定义密码
password = "admin"
# 对密码进行md5加密
m = hashlib.md5()
m.update(password .encode(encoding="utf-8"))
password = m.hexdigest()
# 存储value到变量key
vars.put("password",password)
import base64 # base64加密法 能加密,也能解密
s = '123456'
b = base64.b64encode(s.encode())
result1 = b.decode()
print(result1) # 加密base64
# 存储value到变量key
c = base64.b64decode('MTIzNDU2') # .b64decode() 解密
result2 = c.decode()
print(result2)
vars.put("result1",result1)
vars.put("result2",result2)
BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;
BeanShell是一种松散类型的脚本语言(这点和JS类似);
BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简的解释器jar文件大小为175k;
BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。
jmeter中关于beanshell的有:
1.BeanShell Sampler 取样器:完成Beanshell请求组件中定义的脚本功能;
2.BeanShell PostProcessor 后置处理器:可通过编程方式获取对应请求的响应结果;
3.BeanShell PreProcessor 前置处理器:可通过编程方式在发起请求以前做预处理,比如编码或者加密;
4.Beanshell 断言:可通过编程方式实现复杂的断言逻辑;
5.Beanshell 计时器:编码实现条件定时功能;
6.BeanShell Listener 监听器:监听Beanshell运行结果;
BeanShell前置处理器、BeanShell取样器、BeanShell后置处理器,它们之间的区别:
1、BeanShell前置处理器和后置处理器 比 BeanShell取样器多一个重置解释器(Reset Interpreter),意思是指:对于每一次处理是不是都要进行重置;
2、在JMeter中BeanShell取样器是当成线程处理的,所以运行时是有一定的消耗的,而使用BeanShell前置处理器/后置处理器总体来说比BeanShell取样器消耗低,相当于少起一个线程。
在JMeter运行的流程控制中,BeanShell出现的位置,如下图所示:
Beanshell有一些默认的内置变量,用户可以通过这些变量与jmeter进行交互,其中主要的变量及其使用方法如下:
log:打印日志,写入信息到jmeter.log文件,帮助调试脚本;
常用方法:
log.debu(“调试信息”)
log.info(“响应状态码” + ResponseCode)
log.warn(“警告信息”)
log.error(“出错信息”)
vars:操作jmeter变量,生成、更新、获取当前脚本的jmeter变量;(只能在同一线程组内传递);
常用方法:
a) vars.get(String key):从jmeter中获取变量值;如,user是变量,vars.get("user");
b) vars.put(String key,String value):数据存到jmeter变量中;
更多方法可参考:org.apache.jmeter.threads.JMeterVariables
props:操作jmeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。对应于java.util.Properties。 (可在整个测试计划中跨线程组传递)
常用方法:
a) props.get("START.HMS"); 可以获取JMeter中已经生成的属性----注:START.HMS为属性名,在文件jmeter.properties中定义
b) props.put("PROP1","1234"); 可以创建和更新JMeter属性。
ctx:获取当前线程上下文,可获取当前线程的请求信息和相应信息(可以获取http请求和响应的所有数据);
常用方法:
ctx.getVariables(“变量名”):获取变量值(同vars.get())。
ctx.setVariables(“变量名”, “变量值”):设置变量(同vars.put())。
ctx.getProperties(“属性名”):获取属性值(同props.get())。
ctx.setProperties(“属性名”,“属性值”):设置属性(同props.put())。
ctx.getPreviousResult():获取当前请求结果同(prev)。
ctx.getCurrentSampler():获取当前采样器。
ctx.getPreviousSampler():获取前一采样器。
ctx.getThreadNum():获取线程数。
ctx.getThreadGroup():获取线程组。
ctx. getThread():获取当前线程。
ctx.getEngine():获取引擎。
ctx.isSamplingStarted():判断采样器是否启动。
ctx.isRecording():判断是否开启录制。
ctx.getSamplerContext():获取采样器山下文数据。
使用方法可参考:org.apache.jmeter.threads.JMeterContext。
prev:获取当前请求的结果,或者说是获取前面的sample返回的信息;
常用方法:
a) getResponseDataAsString():获取响应信息
b) getResponseCode() :获取响应code
背景:
由于需要传较复杂的json串作为变量到请求参数中使用,在使用自带的csv data setconfig时会将json串截断。此路不通
package com.ai;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
/**
* author:xiaxi
* date:2022-8-23
* 获取文件中的selecotr值
*/
public class ReadSelectorCSV {
public static String result(String filePath, int i)
{
String line ="";
List csvResult = new ArrayList();
try {
BufferedReader reader = new BufferedReader(new FileReader(filePath));
while ((line = reader.readLine()) != null) {
csvResult.add(line);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(csvResult.get(i).replace("\\\"\"", "\\\""));
// return StringEscapeUtils.unescapeJava(csvResult.get(i));
return csvResult.get(i).replace("\\\"\"", "\\\"");
}
public static void main(String[] args) {
`在这里插入代码片`try {
int i ;
String filePath = "C:\\Users\\EDY\\Desktop\\grpc\\windows_selector.csv";
String line = result(filePath,1);
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.ai;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
/**
* author:xiaxi
* date:2022-8-23
* 获取文件中的selecotr值
*/
public class ReadSelectorCSV {
public static String result(String filePath, int i)
{
String line ="";
List csvResult = new ArrayList();
try {
BufferedReader reader = new BufferedReader(new FileReader(filePath));
while ((line = reader.readLine()) != null) {
csvResult.add(line);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(csvResult.get(i).replace("\\\"\"", "\\\""));
// return StringEscapeUtils.unescapeJava(csvResult.get(i));
return csvResult.get(i).replace("\\\"\"", "\\\"");
}
public static void main(String[] args) {
`在这里插入代码片`try {
int i ;
String filePath = "C:\\Users\\EDY\\Desktop\\grpc\\windows_selector.csv";
String line = result(filePath,1);
} catch (Exception e) {
e.printStackTrace();
}
}
}
1、jar包名自己指定
2、需要指定mainclass
3、需要创建:manifest文件:
4、生成成功后在out目录下会有jar包
Manifest-Version: 1.0
Main-Class: com.ai.ReadSelectorCSV
如上图表示jar可正常使用。
通用调试后,将变量放在请求中直接调用:
jmeter 使用JDBC 连接数据库查询数据,并提取
提前准备:
接口测试大部分都使用接口的响应值作为接口验证的依据,但在与数据库有交互的接口中这种结果判断不足以判断接口的正确性,本文将以jmeter作为接口测试的工具来实现接口的数据库断言
以搜索接口为例,业务需求为:通过关键字搜索商品。接口信息如下:
接口信息:
输入参数:
返回结果:
根据以上接口信息在jmeter中添加http 请求,如下图
添加json提取器是为了获取接口响应中所有name,用来和数据库中查到的name值进行一一对比
选中搜索请求--添加--后置处理器--json提取器
各项参数解释:
1. Names of created variables:表示json提取器从响应中获取到的内容所存储的变量,随便定义只要不冲突即可,建议起一个有意义的名称,不要写成abc毫无意义的名称
2. JSON Path Expressions:json提取的表达式,表示需要按照这个规则从响应中匹配内容,图中表达式表示匹配响应中的所有name字段对应的值
3. Match No. (0 for Random):匹配结果存储到变量的策略,默认什么都不写就是0
- 0表示随机一个存储的变量中,比如我们匹配了多个name字段的值,那么会随机将其中一个 值赋值给Names of created variables指定的变量
- -1表示使用数字后缀标识每一个匹配的结果,比如我们匹配了多个name字段的值,那么最终每一个结果都会对应一个变量,变量名称则是name_1、name_2、name_3、name_4 ....
- X表示把第几个匹配到的值赋值给Names of created variables指定的变量,比如写个2,那么就会把匹配到的第2的name字段的值赋值给name
- Compute concatenation var:表示如果匹配到多个值,可以将多个值存储在一个变量中,变量名为Names of created variables指定的变量名称加_ALL,比如当前图中就是name_ALL,存储的多个值以,分割
- Default Values:表示如果json表达式没有匹配到任何值,那么变量的默认值是啥
以mysql数据库为例
配置数据库所需要的jar包,下载mysql-connector-java.5.1.46.jar,可以直接在maven上进行下载,下载地址https://mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.46
下载好以后放入jmeter目录下的lib/ext目录下,然后重启jmeter
配置jdbc元件,选中线程组--添加--配置元件--JDBC Connection Configuration
核心字段含义
选中线程组--添加--取样器--JDBC Request
核心字段含义
选中线程组--添加--取样器--调试取样器
选中线程组--添加--监听器--察看结果树
选中搜索请求--添加--断言--BeanShell 断言
执行整个脚本,执行通过,脚本全貌如下
Jmeter中有两种方法可以录制脚本,但笔者一向不喜欢把简单的事情复杂化(安装badbody麻烦,就不介绍这种方法了),那么自然就选择通过Jmeter代理来录制脚本。下面讲讲具体的脚本录制步骤:
介绍下各设置项:
端口:代理服务器的端口,默认为8888,可自行修改,但不要与其它应用端口冲突。
目标控制器:录制的脚本存放位置,通常都选择为测试计划中的线程组。
代理服务器:对请求进行分组。将一批请求汇总分组,可以把url请求理解为组。下面分别说明各选项:
1)不对样本分组 :所有请求全部罗列。
2)在组间添加分隔 :加入一个虚拟的以分割线命名的动作,运行同“不对样本分组”,无实际意义。
3)每个组放入一个新的控制器 :执行时按控制器输出结果。
4)只存储每个组的第一个样本 :对于一次url请求,实际很多次http请求的情况,这里只存储第一个请求。这个选项很实用,常常我们是不关心后面的那些请求的。
5)Put each group in a new transaction controller :将每个组置于新事务控制器中,通常我们都选择该项。
记录HTTP信息头:录制request的head信息。
HTTP Sampler settings:http请求的实现包版本以及具体协议类型。
Content-type filter:请求类型过滤器 1)Include 包含xx 2)Exclude 不包含xx
包含模式:通过过滤只录制指定的内容,如正则表达式:.*.php 。
排除模式:过滤掉我们不要录制的内容,如:.*.gif 。
4、在HTTP代理服务器中点击启动。
可能遇到的问题:当启动时出现提示“Root CA certificate:ApacheJMeterTemporaryRootCA created in JMeter bin directory”
解决办法:在【Internet选项】->【内容】->【证书】中,点击导入“Jmeter安装目录/bin下的证书 ApacheJMeterTemporaryRootCA.crt”即可,然后再重新启动HTTP代理服务器。如果导入证书后,仍然提示,可以不用理会了。这里是提示我们要加上对应的证书,否则后面不能进行脚本录制。
5、启动HTTP代理服务器后,打开浏览器(IE,Firefox,Chrome等),添加代理,地址填写本机ip或localhost,端口填写上面设置的代理端口(8899),在浏览器中进行正常网页浏览,即可录制下对应的http请求。IE上的设置:
6、当录制完后,停止HTTP代理服务器即可。这样,一个脚本就录制成功了。可以进行断言,参数化了。
微服务介绍
如图所示:
服务器通过中间层分解,将系统拆分成很多小应用(微服务),微服务可以部署在不同的服务器上,也可以部署在相同的服务器不同的容器上。其RPC代表框架有 Spring cloud、Dubbo 、Thrift、grpc。
微服务之间的调用叫做远程调用RPC(remote procedure call)
Dubbo介绍:
是一款高性能、轻量级、基于java的开源RPC框架。
Dubbo接口测试
连接语法:telnet IP 端口号 (win+r cmd 输入telnet IP 端口号 按两次回车 出现dubbo 就成功了)
用ls- 查看项目中有哪些服务
调用接口的命令格式:
invoke 服务名.方法名(参数)
举例:invoke MemberService.findByTelephone(“13020210001”) 出现以下结果
(1)首先是环境配置 终端里面安装pip install dubboclient 并用pip list检查是否安装成功
(2)使用dubboclient发送请求
1、导包 (固定语法 dubboclient类)
from dubboclient import DubboClient
2、创建DubboClient类实例,指定IP和端口
dubbo_client(dubbo_client为创建的变量名) = DubboClient(“ip”, 端口)
3、使用 实例调用invoke()方法 传入:服务名、方法名、实参(方法使用)。获取响应结果
resp(响应结果) = dubbo_client.invoke(服务名, 方法名, 参数)
4、打印响应结果
print(f"响应结果:",resp)
本文章主要是介绍接口自动化持续集成环境搭建以及测试实例,Apache JMeter是Apache组织开发的基于Java的接口和性能测试工具。
Apache Jmeter是一个100%的纯java桌面应用,主要是针对web的压力和性能测试,但后来扩展到其他测试领域。Jmeter可以用于测试FTP、HTTP、RPC、JUNIT、JMS、LDAP、WebService(Soap) Request以及Mail和JDBC(数据库压力测试)。
1、安装JDK:
由于jmeter是100%的纯java编写的,需要有java的运行环境,所以我们需要安装jdk,官网链接:Java Downloads | Oracle(版本要求:最好是1.8以上)
1.1、下载jdk:
1.2、安装jdk:Java SE 8u191
1.3、配置jdk环境变量
我的电脑”>鼠标右键菜单>"属性">"高级系统设置">"环境变量"。
a、在系统变量里新建“JAVA_HOME”变量,变量值为:D:jdk1(注:具体路径根据自己实际安装路径填写)
其为jdk的安装路径
b、新建“classpath”变量,变量值为:.;%JAVA_HOME%lib;%JAVA_HOME%lib ools.jar;%CATALINA_HOME%lib;
其为java加载类路径,只有类在classpath中java命令才能识别,在路径前加了个"."表示当前路径
c、在path变量里添加变量值:%JAVA_HOME%in;%JAVA_HOME%jrein(注:变量值之间用“;”隔开)
1.4、在命令窗口输入Java -version,可以查看到jdk版本说明安装正确。
2、安装Jmeter:
2.1、下载Jmeter:官网地址:Apache JMeter - Download Apache JMeter
解压就可以用,前提条件是必须是已经安装jdk,
2.2、插件下载:官网地址:Install :: JMeter-Plugins.org
插件下载后解压:找到JMeterPlugins-Extras.jar,把JMeterPlugins-Extras.jar放到apache-jmeter-2.12libext目录。
2.3、配置环境变量
具体操作位置同刚jdk一样,把jdk的java_home相应的换成jmeter的地址即可。
我的电脑”>鼠标右键菜单>"属性">"高级系统设置">"环境变量";
JMETER_HOME=D:Auto_Testapache-jmeter-5.0(注:具体路径根据自己实际安装路径填写)
CLASSPATH=%JMETER_HOME%libextApacheJMeter_core.jar; %JMETER_HOME%libjorphan.jar;
PATH=%JMETER_HOME%in
2.4、启动jmeter 在命令窗口输入jmeter或者在 apache-jmeter-2.12injmeter.bat启动 (打开后的命令窗口不能关闭,否则jmeter的GUI也不能使用)
两种方式都能够成功启动说明jmeter安装成功
Ant是一个代码构建工具,在这里主要作用是为了构建我们写的jmeter脚本,然后再后面安装Jenkins上可以持续集成监控到我们的脚本情况。
3.1、下载Ant,官网下载地址:Apache Ant - Binary Distributions
3.2、配置Ant环境变量
具体操作位置同刚jdk一样,把jdk的java_home相应的换成jmeter的地址即可。
ANT_HOME=D:Auto_Testapache-ant-1.9.13(注:具体路径根据自己实际安装路径填写)
PATH=%ANT_HOME%in
CLASSPATH=%ANT_HOME%lib
3.3、验证Ant是否安装成功
在命令窗口输入ant,出现下面提示说明安装成功,还可以通过ant -version查看ant版本。
jenkins是基于java开发一个持续集成工具,在这是用于我们监控我们跑jmeter写的接口测试用例。
4.1、安装jenkins,官网地址:Jenkins download and deployment
4.2、配置jenkins
通过在浏览器访问localhost:8080/jenkins既可以进入到jenkins页面(后面加了jenkins后访问不不了,是bug,直接去掉jenkins,如果你的8080端口没有被占用的话)
初始的管理员密码,jenkins自动生成的,根据上面红色的路径找到密码,拷到下面的输入框中。
然后弹出安装jenkins插件的页面,如果出现无法自动安装插件,查看是否有防火墙和网络,实在不行得通过离线方式进行安装,我这是在线自动安装的。
接下来是创建用户和密码。
一般公司接口测试,开发会提供明确的接口文档,包含接口地址、请求方式、入参、出参等以及各个返回值的对应的含义。
具体开发不做详细介绍哈,有兴趣的朋友可以一起探讨下。
1、打开jmeter,创建测试计划,在测试计划下面创建线程组,线程组本质就是并发用户数。
在这边简单介绍一个http接口用jmeter开发的脚本
在测试计划组件下,鼠标右键添加线程组
2、添加取样器,我们这篇文章主要介绍http请求,jmeter支持其他ftp、jdbc、tcp请求,都是类似的操作,后续会更新。
3、根据接口文档维护http取样器参数
4、判断请求结果是否正确,我们可以添加响应断言,
5、为了能够很直观的查看到测试结果,我们可以添加监听器,其中可以添加查看结果树和聚合报告
这样一个很简单的接口测试脚本就完成了,像我们这边做接口测试进行测试时是需要考虑接下来几个场景:
5、接口测试用例设计
a、功能测试:正常场景(通过性验证)、参数测试(参数组合)、异常场景(空)等
b、性能测试:响应时间、吞吐量、并发数等
c、安全测试:敏感信息、权限、数据加密、SQL注入等
6、一个完整的接口测试脚本
a、添加http头信息管理器,用于处理请求中存在中文的编码问题
b、添加用户自定义变量,相当于我们的全局变量,在整个测试计划中都可以使用
c、添加功能测试场景用例
d、添加性能测试场景
e、参数化不可变数据,为了模拟真实的用户场景,使数据不重复
g、添加后置处理器BeanShell PostProcessor,用于处理响应中存在中文的编码问题
h、添加监听器、(聚合报告、查看结果树)
整个测试计划结构如下:
(1)将 jmeter的extras目录中ant-jmeter-1.1.1.jar包拷贝至ant安装目录下的lib目录中,这一步操作使Ant运行时能够找到"org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"这个类,从而成功触发JMeter脚本。
(2)修改Jmeter的bin目录下jmeter.properties文件的配置:jmeter.save.saveservice.output_format=xml,同时去掉前面的注释,这一步操作使Jmeter报告输出文件格式为xml。
(3)生成的测试报告可能会有三个指标显示NAN,那么复制jmeter的lib目录下的xalan-2.7.2.jar和serializer-2.7.2.jar copy到Ant的lib包里,重新生成就会成功!
(4)如果生成jmeter报告数据为空,是因为jmeter的extra目录中缺少jmeter-results-detail-report_21.xsl文件导致,下载拷贝即可。
好了,所有的环境以及配置还有脚本都已经准备好了,接下来就是配置jenkins
ant工具主要是根据build.xml文件来执行,build.xml默认存放于jmeter下的extras文件下,我们可以对build.xml文件进行修改来指定测试脚本、测试结果存放路径等。
我的bulid.xml放在jmeter下的D:Auto_Testapache-ant-1.9.13目录下
我的bulid.xml文件如下所示,把相应的路径改成自己的的就可以运行。
然后再D:Auto_Testjenkins-2.138.3workspacejobs esults目录下会生成测试报告
其中有一个失败是用例就是这么设置的场景。
好了,到这为止我们的jmeter接口测试工具的部分已经完成,关于测试报告的分析,在后面我会做进一步的分析和总结,谢谢!