一、jmeter目录
backups 存放jmx文件的备份文件。
bin目录:存放启动文件,配置文件。模板文件。
docs:离线帮助文档
extras:存放第三方集成构建文件。
lib:存放jar包
licences:存放许可证文件
二、Jmeter常用的组件
测试计划:jmeter进行测试的起点,也是Jmeter其他组件的容器。可以加入jar包
线程组:代表一定数量的虚拟用户。
取样器:最小的测试单元。发送请求:http,tcp,ftp,jdbc
逻辑控制器:模拟复制的请求。包含逻辑结构 if,for
前置处理器:请求之前的操作,类似postman的前置脚本
后置处理器:请求之后的操作
断言:判断实际结果是否预期结果是一致。
定时器:请求之间的延迟间隔。固定,随机,高斯
配置文件:配置信息。
监听器:收集测试结果
三、Jmeter接口测试
http请求默认值:设置当前环境请求的默认url、IP等默认值,类似环境变量
http cookie管理器:自动处理cookie关联,web项目必备,postman中自动关联无需设置
用户定义的变量:类似于全局变量,无法跨线程组
当接口需要传递随机变量时,可以将随机变量设置为一个全局变量传递
参数:用于存放键值对参数,消息体数据传json数据,二者不能共存
自动重定向与跟踪重定向:有多个重定向时,自动重定向只记录最后一个,跟踪重定向记录每一个
multipart/form-data:form-data的请求头
查看结果树:查看包括请求数据请求头、响应数据响应头、取样器结果
使用Json Path Tester,测试json提取脚本:
四、接口关联
4.1json提取器
main sample only:只在主请求取
添加调试取样器:Json Path tester可以查看json提取到的token值
在其他接口通过${token}获取提取的token
4.2正则表达式提取器
模板表示取第几个正则表达式的值
匹配数字表示取第几个值
添加调试取样器:RegExp tester可以查看正则表达式提取到的值
在调试取样器中可以看到每一个正则表达式取到的值:
4.3边界值提取器
与正则表达式类似,只是取左右两个边界的值:
4.4XPATH值提取器
五、动态参数
5.1内置函数
随机数:
请求想要有随机数则粘贴生成的随机函数:
六、断言
常用的三种断言:
6.1响应断言
响应文本:匹配接口返回的数据
响应代码:匹配状态码(200,404)
响应信息:返回的信息字段,如OK
响应头
请求头
URL样本
文本:匹配接口返回的文本格式数据
模式匹配规则:
字符串:如果响应内容包含需要匹配的内容代表响应成功,大小写敏感,不支持正 则
包括:如果响应内容包含需要匹配的内容代表响应成功,大小写敏感,支持正则
匹配:如果响应内容等于需要匹配的内容代表响应成功,大小写敏感,支持正则
相等:如果响应内容等于需要匹配的内容代表响应成功,大小写敏感,不支持正则
6.2 json断言
6.3 xpath断言
七、调试
1.使用调试取样器查看中间结果
2.使用抓包:
2.1设置fildder过滤
2.2jmeter设置代理
2.3在fildder中查看
八、数据驱动
csv数据驱动:
csv文件:
四组数据,可以设置线程数为4(存在线程组下所有接口受影响的弊端):
一般设置一个循环控制器设置:
循环的参数设置取全局变量:
九、必须带请求头的接口
添加信息头管理器,设置对应的请求头:
cookie管理器:自动传递关联的cookie信息
十、cookie,session,token
cookie是服务器产生的。保存在客户端。不安全。
- 在客户端第一次请求服务器的时候通过响应头的set-cookie传输给客户端。然后客户端保存在本地。
- 在客户端第2-N次请求服务器的时候,那么就会根据cookie的作用域自动的加上cookie实现鉴权。
session是服务器产生的。保存在服务器的内存。默认生命周期是30分钟。
在客户端第一个登陆的时候产生。产生之后通过cookie传输给客户端,一般的名字叫
sessionid。
然后在登陆之后的请求会随着cookie信息自动的传输给服务器实现鉴权。证明这个用户是
登录状态。
token是服务器产生的。保存在服务器的硬盘。
1.要么就是登录之后自动生成token,要么就是通过一个专门的接口生成token
2.在后面所有的接口里面都必须带上token实现鉴权。
十一、Jmeter命令行方式运行
参数:
-n :表示用非GUI方式运行jmeter脚本,不能单独使用,必须和-t一起使用
-t:表示指定jmeter的脚本
-l :生成jtl格式的报告
-e:表示生成html报告,不能单独使用,必须和-o一起使用。
-o:指定html报告的目录(必须是空的)
必须要加一些配置(jmeter.propties)。
jmeter.save.saveservice.output_format=csv
jmeter -n -t test.jmx -l result.jtl -e -o reports
十二、Jmeter+ant+Jekins持续集成
1.下载ant并解压,解压后把ant的bin目录配置到环境变量。
- 官网:http://ant.apache.org/bindownload.cgi
- 验证:在dos中输入:ant -version
2.配置ant的编译文件build.xml
- 修改bulid.xml文件
- 把bulid.xml文件放到和jmx文件的同级目录
<?xml version="1.0" encoding="UTF-8"?>
<project name="ant-jmeter-test" default="run" basedir=".">
<property environment="env"/>
<tstamp>
<format property="time" pattern="yyyy_MM_dd_hh_mm" />
</tstamp>
<!-- 需要调用的jmeter目录,根据需要进行修改,本次使用的linux路径-->
<property name="jmeter.home" value="E:\apache-jmeter-5.2.1" />
<property name="report.title" value="接口自动化测试"/>
<!-- jmeter生成jtl格式的结果报告的路径-->
<property name="jmeter.result.jtl.dir" value="E:\ants\jtl" />
<!-- jmeter生成html格式的结果报告的路径-->
<property name="jmeter.result.html.dir" value="E:\ants\html" />
<!-- 【详细报告】jmeter生成html格式的详细报告的路径-->
<property name="jmeter.result.html.dir1" value="report" />
<!-- 生成的报告的前缀-->
<property name="ReportName" value="接口自动化汇总报告_" />
<property name="ReportName1" value="接口自动化详细报告_" />
<property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}${time}.jtl" />
<property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}${time}.html" />
<!-- 【详细报告】详细报告的文件名-->
<property name="jmeter.result.htmlName1" value="${jmeter.result.html.dir1}/${ReportName1}${time}.html" />
<target name="run">
<!--antcall target="delete" /-->
<antcall target="test" />
<antcall target="report" />
</target>
<!-- 该命令用来删除今天已经执行过的jtl,防止旧数据重叠
<target name ="delete">
<delete file="${jmeter.result.jtl.dir}/${ReportName}${env.BUILD_ID}.jtl"/>
</target>
-->
<!-- 该命令为执行命令-->
<target name="test">
<taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" />
<jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}">
<!-- 声明要运行的脚本路径"*.jmx"指包含此目录下的所有jmeter脚本-->
<testplans dir="E:\ants" includes="*.jmx" />
<property name="jmeter.save.saveservice.output_format" value="xml"/>
</jmeter>
</target>
<path id="xslt.classpath">
<fileset dir="${jmeter.home}/lib" includes="xalan*.jar"/>
<fileset dir="${jmeter.home}/lib" includes="serializer*.jar"/>
</path>
<!-- 该命令为生成汇总和详细报告 -->
<target name="report">
<tstamp> <format property="report.datestamp" pattern="yyyy/MM/dd HH:mm" /></tstamp>
<xslt
classpathref="xslt.classpath"
force="true"
in="${jmeter.result.jtlName}"
out="${jmeter.result.htmlName}"
style="${jmeter.home}/extras/jmeter-results-report_21.xsl">
<param name="dateReport" expression="${report.datestamp}"/>
</xslt>
<!-- 【详细报告】指定详细报告模板文件-->
<xslt
classpathref="xslt.classpath"
force="true"
in="${jmeter.result.jtlName}"
out="${jmeter.result.htmlName1}"
style="${jmeter.home}/extras/jmeter.results.shanhe.me.xsl">
<param name="dateReport" expression="${report.datestamp}"/>
</xslt>
<!-- 因为上面生成报告的时候,不会将相关的图片也一起拷贝至目标目录,所以,需要手动拷贝 -->
<copy todir="${jmeter.result.html.dir}">
<fileset dir="${jmeter.home}/extras">
<include name="collapse.png" />
<include name="expand.png" />
</fileset>
</copy>
<!-- 【详细报告】拷贝图片到目标目录-->
<copy todir="${jmeter.result.html.dir1}">
<fileset dir="${jmeter.home}/extras">
<include name="collapse.png" />
<include name="expand.png" />
</fileset>
</copy>
</target>
</project>
3.配置库文件
把jmeter extras目录下的ant-jmeter-1.1.1.jar文件拷贝到ant的lib目录下。
4.配置jmeter.properties配置文件
jmeter.save.saveservice.output_format=xml
5.在dos窗口里面执行ant命令,查看报告
在dos中进入到jmx文件目录之后输入:ant
6.登录Jenkins进入:
manage jenkins–》Global Tools Configuration-》安装Ant,配置Ant路径
7、构建job
1.设置工作目录(脚本所在位置)
2.构建:执行windows的批处理命令(输入ant)
3.构建:执行grovy脚本System.setProperty("hudson.model.DirectoryBrowserSupport.CSP","")
4.构建之后:配置报告
十三、Jmeter中Bean Shell组件和语言
1.什么是bean shell
beanshell是一种语言,它有自己的语法,同时还支持java语言。
作用:beanshell可以和jmeter组件相互交互数据,用于增加jmeter的扩展性,或者是完成一些jmeter很难处理或者无法处理的一些问题。
2.beanshell的种类
1.前置处理器
2.定时器
3.采样器
4.后置处理器
5.断言
6.监听器
3.beanshell自带的语法。
1) 日志打印
beanshell自带的打印日志
log.info("码尚教育");
log.error("百里老师");
java的打印:注意打印的内容在dos窗口查看
System.out.println("java语法");
2 )vars,全称:JmeterVariables,操作Jmeter的局部变量(局部变量是只能在一个线程里面访问的变量,局部变量不能跨线程访问)。
主要的方法:
vars.put(key,value); 设置一个局部变量
vars.get(key); 获得一个局部变量
常见能用来取以下值:
1.获取用户自定义变量
2.获取正则表达式提取器或JSON提取器里面提取的变量
3.put之后的值在另一个beanshell可以取
3) props,操作Jmeter的全局变量(全局变量可以跨线程访问)
props.put(key,value); 设置一个全局变量
props.get(key); 获得一个全局变量
也可以获取properties里的全局变量
注意:断言如果没有取样器,默认不执行。
4)prev 获取前面一个取样器返回的结果
prev.getResponseCode()
prev.getResponseDataAsString()
5).调用jar包
6)接收调用参数的传值
十四、BeanShell断言
使用Failure标识断言失败。如果Failure=true代表失败,如果Failure=false代表成功。
使用FailureMessage标识断言失败或者成功的信息。
做数据驱动后进行断言时使用:数据驱动后断言每一条结果都不同
在数据驱动文件加上一个断言字段:
在beanshell断言中获取:
//获取返回的结果
String res = prev.getResponseDataAsString();
log.info(res);
//获得CSV数据文件中断言assert_str字段的值
String assert_str = vars.get("assert_str");
log.info(assert_str);
//判断并做断言
if(res.contains(assert_str)){
Failure=false;
FailureMessage = "断言成功";
}else{
log.info("‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐");
Failure = true;
FailureMessage = "断言失败";
}
十五、Jmeter的录制功能
1.抓包之后再接口测试
2.使用badbody录制。
3.使用Jmeter的http代理服务器实现接口录制。
1)线程组
2)http Cookie管理器
3)非配置文件–>http 代理服务器
端口:8888 目标控制器:设置到指定的线程组。
Type:优先默认,如果无法录取选择Java 点击【启动】按钮
4)配置电脑的代理服务器,指定为JMeter的代理服务器的IP和端口。
控制面板里面设置
5)过滤掉不需要的包,只留下需要的请求,其他的过滤掉
十六、数据库断言
1.测试计划中引入数据库的驱动jar包
2.配置数据库的连接池:JDBC Connection Configuration
3.配置JDBC请求
4.在beanshell断言中获取
String username = vars.getObject("result").get(0).get("username");