JMETER整理
·接口测试原理
-HTTP协议介绍
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,HTTP是一个基于TCP/IP通信协议来传递数据(HTML文件,图片文件,查询结果等)。
HTTP工作原理
HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
Web服务器有:Apache服务器,IIS服务器(Internet Information Services)等。
Web服务器根据接收到的请求后,向客户端发送响应信息。
HTTP默认端口号为80,但是你也可以改为8080或者其他端口。
HTTP三点注意事项:
- HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
- HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP消息结构
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line),请求头部(header),空行和请求数据四个部分组成。
服务器端HTTP响应由四个部分组成,分别是:状态行,消息报头,空行和响应正文。
实例一:
客户端请求:
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi
服务器端响应:
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain</pre>
-HTTP状态码介绍
什么是HTTP状态码? 当浏览者访问一个网页时,浏览者的浏览器会向网页所在的服务器发出请求。当浏览器接受并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头,用以响应浏览器的请求。
常见的HTTP状态码:
200 -请求成功
301 -资源被永久转移到其他URL
404 -请求的资源不存在
500 -内部服务器错误
HTTP状态码分类:
1** -信息,服务器收到请求,需要请求者继续执行操作
2** -成功,操作被成功收到并处理
3** -重定向,需要进一步的操作以完成请求
4** -客户端错误,请求包含语法错误或无法完成请求
5** -服务器错误,服务器在处理请求的过程中发生了错误
-浏览器抓包工具
-APP抓包工具
·Jmeter元件
-Java环境变量搭建
JDK下载
甲骨文官网:http://www.oracle.com/technetwork/java/javase/downloads/ 选择Accept License Agreement”
JDK安装
JDK环境变量配置
1.新建JAVA_HOME环境变量,JAVA_HOME=C:\Java\jdk1.8.0_144
2.修改path环境变量,在path变量尾部添加%JAVA_HOME%\bin
3.新建classpath环境变量,classpath=.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\tools.jar
验证java环境变量
-Jmeter部署
jmeter官网下载:https://jmeter.apache.org/download_jmeter.cgi
WINDOWS系统下打开:
在jemter所在文件夹下的bin文件夹下,用管理员身份打开jmeter.bat文件
jmeter打开成功界面如下:
-Jmeter界面功能介绍
-Jmeter工作原理
原理概要:
向服务器提交请求,从服务器取回请求返回的结果。JMETER是浏览器于WEB服务器之间的代理网关,模拟在服务器、网络或者其他对象上附加高负载以测试他们提供服务的受压能力,或者分析他们提供的服务在不同负载 条件下的总性能情况。
基本原理:
建立一个线程池,多线程运行取样器产生大量负载,在运行过程中通过断言来验证结果的正确性,可以通过监听记录测试结果。
运行原理:
- 通过线程组来驱动多个线程的方式运行。
- 运行在JVM虚拟机上。
- 可以进行分布式测试(分为控制机和负载机)
- 控制机:运行负载测试、管理远程多台负载机;
- 负载机:运行负载测试,向控制机发送测试结果。
- 运行逻辑:启动Agent----》控制机连接负载机----》控制机发送运行指定----》负载机运行并回传测试结果----》控制机收集测试结果
-Jmeter三种不同线程组
Jmeter有三个线程组分类:Thread Group、setUp Thread Group、tearDown Thread Group,如图
- thread group(线程组):通常运行的线程。通俗的讲,一个线程组,可以看成是一个虚拟用户组,线程组的每个线程可以理解成一个虚拟用户。
- setUp thread group:一种特殊的ThreadGroup,可以执行预测试操作。这些线程的行为完全像一个正常的线程组元件。不同的是,这类线程执行测试前进行定期线程组的执行,测试开始时的初始化工作。
- teardown thread group:一种特殊类型的ThreadGroup的,可执行测试后动作。这些线程的行为完全像一个正常的线程组元件。不同的是,这些类型的线程执行测试结束后执行定期的线程组;测试结束时进行回收工作。
-Jmeter-GET请求
1.创建测试计划
默认启动jmeter时候会加载一个测试技术模板,保持测试计划 :修改名称,点击保存,选择保持路径。保存之后的操作步骤,每次添加或修改,软件并不会自动保存到jmx文件中,所以每次有修改后,如果需要保存本次修改内容,都需要手动到“文件”菜单中保存一次。
2.添加线程组
右键左边树中的测试计划“TestPlan"节点,添加--Threads--线程组
3.添加HTTP请求默认值
右键“线程组”,选择 “添加”--“配置元件”--“HTTP请求默认值”,点击“HTTP请求默认值”,添加成功后,线程组节点下会新增"HTTP请求默认值"
4.添加HTTP信息头管理器
非必须项。 右键“线程组”,选择“添加”--“配置元件”--“HTTP信息头管理器。
5.添加HTTP请求
右键“线程组”,选择“添加”--“Sample”--“HTTP请求”
6.添加监听器
右键“线程组”,选择“添加”--“监听器”--“对应的监听器”,常用的监听器有:图形结果,查看结果树,聚合报告
7.执行和结果分析
专业术语解析
Label:每个JMeter中的element都有一个name属性
# Samples:表示当前测试中一共发送了多少请求。如果模拟10个用户,循环10次,显示的是100
Average:平均响应时间--默认单个请求的平均响应时间
Median:中位数,也就是50%用户的响应时间
90% Line:90%用户的响应时间
Min:最小响应时间
Max:最大响应时间
Error%:本次测试中出现错误的请求数量/请求总数
Throughput:吞吐量--默认表示每秒完成的请求数
KB/Sec:每秒从服务器端接收到的数据量
-Jmeter-POST请求
-Jmeter-JSON请求
- 创建测试计划--添加测试组--添加HTTP信息头管理器--添加HTTP请求--添加结果监听“查看结果树”
- 添加HTTP信息头管理器上,要做修改
- 点击“添加”后,在“名称”列上添加 Content-Type, 在“值”列上添加“application/json"
-Jmeter-header处理
- 测试计划--线程组--配置元件--HTTP信息头管理器
名称 | 值 |
---|---|
Content-Type | application/json |
Accept | text/html,application/xhtml+html,application/xml;q=0.9,/;q=0.8 |
Accept-Language | fr,fr-fr;q=0.8,en-us;q=0.5,en; |
Accept-Encoding | gzip,feflate |
-Jmeter超时处理
测试计划-线程组-HTTP Request Defaults -Advanced
Connect:连接超时设置,以毫秒为单位
Response:响应超时设置
-Jmeter响应断言
测试计划--线程组-断言-响应断言
Apply to :一般选择 Main sample only
Field to Test:一般选择Text Response,实例只简单判断,所以选择Response Headers
Pattern Matching Rules:匹配规则,一般选择Contains
-Jmeter-JSON断言
·Jmeter参数化和结果分析
Jmeter查看结果树
- 测试计划--线程组--添加--监听器-查看结果树
数据说明:
- 左侧结果表
1.通常执行成功的请求在左侧显示绿色,执行失败的显示红色。
2.没有添加断言时,显示的绿色并不一定是测试结果的成功,只能代表响应码是200或者300系列,显示红色说明响应码是400或500系列。所以在判断请求返回是否测试结果,必须加上断言,只有断言成功的才会显示绿色。
- 右侧结果表
1.显示的信息如下:
Thread Name:线程组名称
Sample Start:启动开始时间
Load time:加载时长,是测试常用的时间,也是整个请求的消耗时间
Latency:等待时长,不常用。表示请求发送到刚开始接收响应时的时间
Size in bytes:发送的数据总大小
Headers size in bytes:发送头大小
Body size in bytes:发送数据的其余部分大小
Sample Count:发送请求数统计
Error Count:交互错误统计
Response code: 返回码
Response message:返回信息
Response headers: 返回的头部信息
HTTPSampleResult:其他附加的请求信息
Jmeter参数化
- 依赖Jmeter自带的函数助手
- CSV Data Set Config
- 用户定义变量
- 正则表达式提取器获取
- 从数据库中提取
Jmeter随机参数化
- Tools--函数助手对话--__Random
- 测试计划--线程组--添加--配置元件--随机变量
Jmeter唯一参数化
Jmeter日期参数化
Jmeter-CSV文件参数化
Jmeter聚合报告分析
Jmeter-Top响应时间分析
·Jmeter高级应用
Jmeter实时性能数据展示插件
Jmeter文件随机参数化
Jmeter扩展函数插件
Jmeter性能监控插件
Jmeter-if控制器
Jmeter-循环控制器
- 循环控制有两处可以设置:
- 1.一个是线程组里可以测试对整个线程组的循环次数设置
- 2.逻辑控制器里的循环控制器也可以设置循环次数
循环次数(Loop Count):在输入框中输入的循环的次数,控制器下的子项会循环相应的次数。forever会一直循环下去
Jmeter-foreach控制器
Jmeter仅一次控制
- 测试计划-线程组-添加-逻辑控制器-仅一次控制器
- 仅一次控制器,会使该控制器下的子项每个线程只运行一次
Jmeter-cookie处理器
Jmeter-Json提取器
Jmeter-正则提取器
Jmeter定时器
·Jmeter场景测试
Jmeter上传场景测试
Jmeter下载场景测试
Jmeter登录COOKIE处理场景
Jmeter登录TOKEN处理场景
Jmeter-JDBC请求
Jmeter加密场景测试
Jmeter-webservice接口测试
·Jmeter扩展BeanShell
Beanshell介绍
Beanshell内置变量
Beanshel逻辑判断
Beanshell调用外部java文件
Beanshell断言
Beanshell写数据到文件
·Jmeter命令行模式
Jmeter命令行-单机
- Jmeter除了界面窗口编写脚本外,还有一种命令行操作方式。一般情况下,界面使用在编写调试脚本,GUI模式进行压测,本身所需要的资源很高
命令介绍:
jmeter -n -t <testplan filename> -l <listner filename>
示例:jmeter -n -t testplan.jmx -l test.jtl
示例说明:表示开始运行testplan.jmx文件,并输出监听日志文件test.jtl
命令行参数介绍:
-h 帮助 :打印出有用的信息并退出
-n 非GUI模式:在非GUI模式下运行Jmeter
-t 测试文件: 要运行的Jmeter测试脚本文件
-l 日志文件:记录结果的文件
-r 远程运行:在Jmeter.properties文件中指定的所有远程服务器
-H 代理主机:设置Jmeter使用的代理主机
-P 代理端口:设置Jmeter使用的代理主机的端口号
查看日志文件:
Jmeter命令行-分布式
分布式测试的处理过程如下:
- 1.调度机master启动以后,会拷贝jmx文件分发到远程的slave机器上
- 2.slave机器拿到脚本以后启动命令行模式去执行脚本,对于每台slave机器,拿到的脚本都是一样的。如果脚本为50个线程跑3分钟,有3个slave机器,那么总线程是150个线程并行跑3分钟
- 3.执行时,slave会把执行获得的数据结果传到master机器,master机器会收集所有slave机器的信息并汇总,这样master机器上存有一份所有slave机器汇总的结果
使用分布式式测试时注意事项:
- 1.测试的jmx脚本是从master机器传到slave机器上的,所以不需要每个slave机器上分别上传文件
- 2.参数化文件:使用参数化文件时,需要把参数文件在每台slave机器上拷贝一份,且路径也要一致
- 3.调度机和执行机最好分开,由于master需要发送信息给slave机器并且接收slave机器回传的测试数据,会消耗master自身资源
- 4.保证每台机器的jmeter版本和插件版本一致
- 分布式测试总样本数=线程数 * 循环次数 * 执行机总数
调度机master配置:
调度机的bin目录下打开jmeter.properties文件,修改remote_hosts,后面增加远程负载机的IP和端口,添加多个,用逗号分隔开
实例: remote_hosts=192.168..:1099,192.168..**:1099
执行机slave配置:
在slave机器上的jmeter.properties文件中添加
server_port=1099
server_rmi_localport=1099
slave机器上执行jmeter-server文件
分布式测试运行步骤:
- 步骤一:修改调度机器jmeter.properties文件中的IP
- 步骤二:确认调度机与执行机以及执行机之间jmeter版本一致,部署路径相同
- 步骤三:修改执行机器jmeter.properties配置文件中的端口
- 步骤四:启动执行机上的jmeter-server文件
- 步骤五:启动调度机上的jmeter.bat文件
- jmeter -n -t test.jmx -r -l testlog.jtl
- 命令意思:表示非GUI模式下启动所有远程代理,并运行test.jmx文件,日志记录到testlog.jtl中
- jmeter -n -t slave.jmx -R xx.xx.xx.xx:1098, xx.xx.xxx.xx:1099 -l test.jtl
- 命令解释:运行指定的远程代理机器
Jmeter命令行-实时数据分析
Jmeter命令行-结果文件分析
Jmeter命令行-HTML报表
Jmeter命令错误排查