目录
9.1.如何实现Jmeter使用POST方法发送json数据
一、目标
1.Jmeter介绍
- Jmeter环境搭建以及目录介绍
- Jmeter功能页面
- Jmeter元件使用
- Jmeter参数化
- Jmeter关联
- Jmeter检查点
- Jmeter聚合报告
- Jmeter插件使用
- Jmeter命令行介绍
2.Jmeter+ant+jenkins实现接口自动化测试集成
二、环境配置
- JDK:1.8.0_131
- Jmeter:4.0
- Jenkins:Jenkins2.176.1
- ant:1.9.6
备注:版本选择可以自行官网下载配置,以上为本人电脑配置
三、实现成果
1.生成html报告如下:
2.邮件通知如下:
四、Jmeter介绍
jmeter作为一个开源的接口性能测试工具,其本身的小巧和灵活性给了测试人员很大的帮助,但其本身作为一个开源工具,相比于一些商业工具(比如LoadRunner),在功能的全面性上就稍显不足。
五、Jmeter环境搭建
1.Jmeter环境建
Jmeter下载安装,官网地址:http://jmeter.apache.org/download_jmeter.cgi
- 下载完成后解压到当前目录即可,如下图:
- 环境变量配置_新增系统环境变量
- 变量名称:JMETER_HOME:
- 变量值:D:\Develop\apache-jmeter-4.0 //即Jmeter的目录
- 环境变量配置_将Jmeter环境变量添加的Path变量下
备注:jdk下载以及环境变量配置自行操作
六、Jmeter目录介绍
Bin目录:存放可执行文件和配置文件
Jmeter.bat: windows系统中JMeter的启动文件
ApacheJMeter.jar Java环境下的JMeter启动文件
Jmeter.log:日志文件
Jmeter.sh: linux系统中JMeter的启动文件
Jmeter.properties:系统配置文件
Jmeter-server.bat: windows分布式测试要用到的服务器配置
Jmeter-serve: linux分布式测试要用到的服务器配置
lib/ext/目录 就扩展插件:在配置元件中可以看到到的组件
extras目录 主要是用来做ant自动化和报告模板
七、Jmeter结构图
八、Jmeter基础操作
8.1 启动Jmeter,
点击Jmeter目录下的"jmeter.bat"文件,D:\Develop\apache-jmeter-4.0\bin\jmeter.bat
8.2Jmeter页面如下:
备注:Jmter4.0版本左侧的树形导航仅包含“测试计划”,“无工作台”
8.3测试计划
作用:
- 本次测试所需要的【组件】都是基于测试计划添加;
- 本次测试所有组件的设置与执行都基于测试计划;
- 组件:完成指定功能代码段的封装;
8.4.添加线程组
右键点击“测试计划” -> “添加”-> “Threads(Users)” -> “线程组”
- 线程数:虚拟用户数。一个虚拟用户占用一个进程或线程。设置多少虚拟用户数在这里也就是设置多少个线程数。
- Ramp-Up Period(in seconds)准备时长:设置的虚拟用户数需要多长时间全部启动。如果线程数为10,准备时长为2,那么需要2秒钟启动10个线程,也就是每秒钟启动5个线程。
- 循环次数:每个线程发送请求的次数。如果线程数为10,循环次数为100,那么每个线程发送100次请求。总请求数为10*100=1000 。如果勾选了“永远”,那么所有线程会一直发送请求,一到选择停止运行脚本。
- Delay Thread creation until needed:直到需要时延迟线程的创建。
- 调度器:设置线程组启动的开始时间和结束时间(配置调度器时,需要勾选循环次数为永远)
- 持续时间(秒):测试持续时间,会覆盖结束时间
- 启动延迟(秒):测试延迟启动时间,会覆盖启动时间
8.5.添加http请求
右键点击“线程组” -> “添加” -> “Sampler” -> “HTTP请求”
接口地址:http://www.baidu.com/s?ie=utf-8&wd=jmeter接口测试
备注
1.自动重定向:仅对get方法有效,可以自动跳转到请求的新url,但不会显示转换url的详情
2.跟随重定向:针对get、post均有效,可以显示链接的请求过程
8.6.添加察看结果树
右键点击“线程组” -> “添加” -> “监听器” -> “察看结果树”
这时,我们运行Http请求,修改响应数据格式为“HTML Source Formatted”,可以看到本次搜索返回结果页面标题为”jmeter接口测试_百度搜索
8.7.Jmeter参数化
方式一:
添加用户自定义变量
我们可以添加用户自定义变量用以Http请求参数化,右键点击“线程组” -> “添加” -> “配置元件” -> “用户定义的变量”:
新增一个参数wd,存放搜索词"自动化测试"
并在Http请求中使用该参数,格式为:${wd}
方式二:"CSV 数据文件设置"
1.新建一个csv文件,保存如下数据:注意使用notepad编辑,将其转换为utf-8编码方式,否则中文在jmeter中显示乱码
2.右键点击“线程组” -> “添加” -> “配置元件” -> “CSV 数据文件设置”:
在Http请求中使用该参数,格式为:${keyword} ,并运行可以在结果树中查看到如下结果,则表示已从csv文件中读取对应的参数
8.8、添加断言
右键点击“HTTP请求” -> “添加”-> “断言” -> “响应断言”
校验返回的文本中是否包含搜索词,添加参数${keyword}到要测试的模式中:
8.9.添加断言结果
右键点击“HTTP请求” -> “添加”-> “监听器” -> “断言结果”,然后运行测试,即可看到断言的结果
九、Jmeter进阶操作
9.1.如何实现Jmeter使用POST方法发送json数据
添加"http信息头管理器”
右键点击“线程组”->"添加"->"配置元件"->"http信息头管理器",添加字段:Content-type:application/json
在http请求中选择"BodyData",编写Json数据
9.2.如何实现数据的关联
方式一:使用后置处理器,"正则表达式提取器"
右键点击“http请求”->"添加"->"后置处理器"->"正则表达式提取器"
(1)引用名称:下一个请求要引用的参数名称,如填写authld,则可用${authld}引用它。
(2)正则表达式:左边界(.+?)右边界
():括起来的部分就是要提取的。
.:匹配任何字符串。
+:一次或多次。
?:不要太贪婪,在找到第一个匹配项后停止。
(3)模板:用$$引用起来,如果在正则表达式中有多个正则表达式,则可以是$1$$2$等等,表示解析到的第几个值给title。如:$1$表示解析到的第1个值
(4)匹配数字:0代表随机取值,-1代表全部取值,通常情况下填0
(5)缺省值:如果参数没有取得到值,那默认给一个值让它取,我填的Error。
* 0 表示随机
* -1 表示全部
* 1表示第一个
* 2表示第二个
* ......
测试正常表达式:
引用提取的变量如下:
练习:
查看提取变量的结果可以使用debug Samper
使用表达式:"name":"(.+?)","code":(.+?),
使用模板:$0$,提取包含表达式在内的字符串。如下:
使用模板:$1$,提取包含表达式在内的字符串。如下:
使用模板:$2$,提取包含表达式在内的字符串。如下:
使用模板:$1$$2$,提取包含表达式在内的字符串。如下:
此时的则把2个(.*?)所匹配的内容拼接起来"city=江苏省320",要引用值,可以使用${city_1},${city_2}
方式二:使用后置处理器,"JSON Extractor"
右键点击“http请求”->"添加"->"JSON Extractor"
例如:在接口1中获取比赛id,然后在接口2中使用比赛id,获取当前节目的状态
在接口二中引用变量时,使用${sdspMatchId_1}
9.3.for-each控制器的使用
使用场景:循环使用变量
例如:接口二中的参数是动态获取接口一的返回的变量
在接口一中,提取的所有赛事的id
添加ForEach控制器
右键点击“线程组”->"添加"->"逻辑控制器"->"ForEach控制器"
在http请求中的变量引用forEach中的输出变量名${competitionid_mip_prd}
在结果树中查看到如下结果,forEach控制器下的http请求会遍历所有的competitionid
9.4.jmeter性能测试场景化操作
添加"Stepping Thread Group"
右键点击"测试计划"->"添加"->"Threads(Users)"->"Stepping Thread Group"
如下图:
(1)共30个线程即30个虚拟用户,每10s启动10个线程,然后运行20s
(2)启动30个线程后在持续运行120s
(3)每3s停止10s线程
备注:Jmeter默认没有"Stepping Thread Group",线程组,需要安装插件
(1):首先下载Jmeter插件管理器"jmeter-plugins-manager-1.3.jar",地址:https://jmeter-plugins.org/install/Install/
(2):下载完成后,将其放入jmeter安装目录下的lib/ext目录,然后重启jmeter,即可。
启动jemter,点击选项,最下面的一栏,如下图所示:
启动插件管理器-选择"Available Plugins" -选择"jpgc-Standard Set"->点击"Apply Changes and Restart Jmeter",安装即可
9.5.Jmeter聚合报告分析
右键点击“线程组”->"添加"->"监听器"->"聚合报告"
聚合报告参数详解:
- Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值
- #Samples:请求数——表示这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100
- Average:平均响应时间——默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,以Transaction 为单位显示平均响应时间
- Median:中位数,也就是 50% 用户的响应时间
- 5. 90% Line:90% 用户的响应时间
- Min:最小响应时间
- Max:最大响应时间
- Error%:错误率——错误请求数/请求总数
- Throughput:吞吐量——默认情况下表示每秒完成的请求数(Request per Second),当使用了 Transaction Controller 时,也可以表示类似 LoadRunner 的 Transaction per Second 数
- KB/Sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec
- 一般而言,性能测试中我们需要重点关注的数据有: #Samples 请求数,Average 平均响应时间,Min 最小响应时间,Max 最大响应时间,Error% 错误率及Throughput 吞吐量。
9.6.Jmeter脚本封装以及执行的顺序
执行顺序
- 配置元件
- 前置处理器
- 定时器
- 取样器
- 后置处理器 (如果 SampleResult 不为空)
- 断言 (如果 SampleResult 不为空)
- 监听器 (如果 SampleResult 不为空)
9.7.Jmeter命令行操作生成性能测试报告
非GUI界面,命令说明:
-h 帮助
-n 非GUI模式
-t 指定要运行的 JMeter 测试脚本文件
-l 记录结果的文件 每次运行之前,(要确保之前没有运行过,即xxx.jtl不存在,不然报错)
-r Jmter.properties文件中指定的所有远程服务器
-e 在脚本运行结束后生成html报告
-o 用于存放html报告的目录(目录要为空,不然报错)
需要修改报告的输出格式:使用CSV,修改Jmeter目录下的"jmeter.properties"文件,例如:
"F:\接口\jmeter课件资料\apache-jmeter-4.0\bin\jmeter.properties"
修改如下字段:
jmeter.save.saveservice.output_format=csv
命令:
jmeter -n -t E:\project\智慧零售\测试工作\接口\平台接口.jmx -l result.jtl -e -o E:\project\智慧零售\测试工作\接口\html
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
Creating summariser <summary>
Created the tree successfully using E:\project\智慧零售\测试工作\接口\平台接口.jmx
Starting the test @ Thu Oct 10 15:16:17 CST 2019 (1570691777018)
Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445
summary = 29 in 00:00:01 = 38.7/s Avg: 20 Min:0 Max: 133 Err: 8 (27.59%)
Tidying up ... @ Thu Oct 10 15:16:18 CST 2019 (1570691778190)
... end of run
19038992@CNHQ-19038992N E:\
报告如下:
十、Jmeter+ant+Jenkins实现自动化接口测试
10.1 Ant配置
1.下载ant
2.下载完成后配置ant的环境变量
3.Jmeter脚本已经录制好了,并测试通过,存在(xxx.jmx)脚本
4.将Jmeter所在的目录下extras子目录的ant-jmeter-1.1.1.jar复制到Ant所在目录lib目录下,这样运行Ant时才能找到"org.programmerplanet.ant.taskddfs.jmeter.JMeterTask"这个类,从而成功触发JMeter脚本
5、jmeter默认保存的是.csv格式的文件,所以我们先设置下bin/jmeter.properties文件内存,保存
jmeter.save.saveservice.output_format=xml
6.主要逻辑思路:F:\Test\apiTest\script.jmx脚本,生成.jtl文件放入
F:\Test\apiTest\resultlog\jtl文件中,ant在将相应的文件转换为对应的html文件放入F:\Test\apiTest\resultlog\html中
7.ant的编译文件build.xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<project name="pc" default="all" basedir=".">
<tstamp>
<format property="time" pattern="yyyyMMddHHmm" />
</tstamp>
<!-- 需要改成自己本地的 Jmeter 目录-->
<property name="jmeter.home" value="D:\Develop\apache-jmeter-4.0" />
<!-- jmeter生成jtl格式的结果报告的路径-->
<property name="jmeter.result.jtl.dir" value="F:\Test\apiTest\resultlog\jtl" />
<!-- jmeter生成html格式的结果报告的路径-->
<property name="jmeter.result.html.dir" value="F:\Test\apiTest\resultlog\html" />
<!-- 生成的报告的前缀 -->
<property name="ReportName" value="TestReport" />
<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="mail_from" value="502107543@qq.com" />
<property name="mail_to" value="502107543@qq.com" />
<!-- 电脑地址 -->
<!-- <property name="ComputerName" value="jkqsh-l0285" />-->
<target name="all">
<antcall target="test" />
<antcall target="report" />
<antcall target="send" />
</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="F:\Test\apiTest\script" />
</jmeter>
</target>
<path id="xslt.classpath">
<!-- 解决报告中NAN字段显示问题-->
<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-detail-report_21.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>
</target>
<!-- 发送邮件 -->
<target name="send" >
<mail mailhost="smtp.suning.com" mailport="25" subject="Test Report!" messagemimetype="text/html" user="502107543@qq.com" password="xxxxx" >
<from address="${mail_from}"/>
<to address="${mail_to}"/>
<message>This email was sent automatically by ANT. Please check the automation test report. Thank you!</message>
<attachments>
<fileset dir="${jmeter.result.html.dir}">
<include name="${ReportName}${time}.html"/>
<include name="collapse.png" />
<include name="expand.png" />
</fileset>
</attachments>
</mail>
</target>
</project>
生成报告如下:
10.2 Jenkins 搭建(By tomcat)
1、 Jenkins官网https://jenkins.io/download/下载最新版本jenkins.war
2、将jenkins.war 放到D:\Develop\tomcat7\webapps,目录下:
3.启动tomcat 服务:"startup.bat"
4、出现如下信息,则表示Jenkins已启动OK
5.在浏览器中输入地址:http://localhost:8080/jenkins/
6.新建任务
任务配置:
每行由 5 个值组成(空格或TAB分隔),分别表示 分(0-59)、时(0-23)、日(1-31)、月(1-12)、周(0-7, 0/7=周日)
使用ant执行脚本
保存后,点击Build now
编译完成后可以点击查看控制台的输出如下:
生成的html报告如下: