JMeter的取样器
在JMeter中,取样器通常用来模拟并发用户发出实际请求的操作,向待性能压测的对象发送请求以及接收相应的响应数据。取样器是JMeter性能压测的核心组件,如图3-18所示。通常情况下,如果需要完成一个性能测试场景,那么肯定是离不开取样器的。
图3-18 如何添加取样器
从图3-18中可以看到取样器主要包括以下类型。
3.6.1 HTTP请求
HTTP请求取样器是指可以向指定的Web服务发送HTTP或者HTTPS请求。如果需要对一个使用HTTP或者HTTPS协议的服务做性能压测,就需要用到该取样器。由于Web服务是一种最常见的服务,所以HTTP请求取样器是使用频率最高的取样器。HTTP取样器界面中主要包含如下参数:
- 协议:默认为HTTP,支持填入HTTP、HTTPS 或者 FILE。FILE协议主要用于访问本地计算机中的文件。
- 服务器名称或IP:用于设置服务端的IP或者域名地址。
- 端口号:用于设置服务端的端口号。如果不设置的话,当协议为HTTP时,端口号默认为80,当协议为HTTPS的时候,端口号默认为443。
- HTTP或者FILE请求的类型:可以通过下拉框来选择HTTP请求的类型。HTTP协议支持的请求类型包括GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE、PATCH。FILE协议支持的请求类型包括PROPFIND、PROPPATCH、MKCOL、COPY、MOVE、LOCK、UNLOCK、REPORT、MKCALENDAR、SEARCH。其中最常用的HTTP请求类型就是GET和POST,我们平时在浏览器中的大部分Web操作基本也都是这两种类型的请求居多。
- 路径:通常指的是HTTP请求地址路径,但是该地址路径不包含协议名和服务器地址。比如,服务端的服务地址http://www.baidu.com/context/url,此路径就是/context/url。
- 内容编码:指的是对发送HTTP请求的内容设置编码字符集。通常用于POST、PUT、PATCH请求,并且此处的内容编码不会与HTTP 请求头中的Content-Encoding有任何的关联关系。
- 自动重定向:重定向是指HTTP请求会自动重定向到下一个HTTP请求。比如,当客户端向服务端发出请求后,服务端可以发送和返回一个特殊的HTTP响应码,来告诉客户端需要重定向到一个新的服务端地址来获取最终的响应,如图3-19所示。
图3-19 重定向过程
在重定向为自动重定向的情形下,如果JMeter收到了重定向后,将会自动进行重定向。但是,自动重定向只针对POST和GET请求,而且在JMeter的日志中不会特别记录重定向过程。
- 跟随重定向:如果需要使用跟随重定向,那就不能勾选自动重定向,当同时了勾选了自动重定向和跟随重定向时,只有自动重定向会生效。JMeter会记录跟随重定向过程中的所有请求响应,此时可以通过JMeter监听器中的查看结果树这个元件来查看跟随重定向的请求与响应内容。通常来说,当HTTP 响应的CODE码为302或者301时,需要使用跟随重定向来进行处理。在HTTP 响应的CODE中,当CODE为以3开头时,通常表示的是一个重定向响应。
- 使用KeepAlive:是指JMeter在发出HTTP的取样器请求时,会在HTTP的请求头中添加Connection:keep-alive,表示保持当前的连接为活动状态,让当前连接可以复用。在高并发的压测场景中,启用 Keep-Alive 模式肯定会更高效,性能会更高,因为可以避免建立/释放连接所带来的开销。
- 对POST使用multipart/form-data:表示使用multipart/form-data的方式来提交HTTP POST表单请求(即将 HTTP 请求头的Content-Type设置为multipart/form-data),multipart通常表示允许客户端在一次HTTP POST请求中,通过多个Part的方式来向服务端发送数据。如图3-20所示的HTTP的POST请求中,包含了多个DATA,而每个DATA都可以有自己单独的Content-Type,客户端使用multipart的方式将这些DATA 一次性全部提交给服务端。
图3-20 multipart/form-data使用示例
- 与浏览器兼容的头:通常会与multipart/form-data搭配使用。当使用multipart/form-data来提交POST表单请求时,会屏蔽HTTP请求头中的原有Content-Type和Content-Transfer-Encoding设置,使它们不起作用,发送HTTP请求时会仅仅在请求头中加入Content-Disposition这个请求头。
- 参数:用于设置HTTP 请求的参数,支持以Key(参数名)- Value(参数值)的形式来设置HTTP请求的参数,并且每个参数还可以设置其编码类型和内容类型。常见的内容类型如下所示。
1)文本类型:
- text/plain:表示纯文本文件。
- text/xml:表示XML格式的数据。
- text/html:表示HTML网页文件格式的数据。
- text/css:表示CSS样式表文件。
- text/javascript:表示JavaScript脚本文件。
- text/csv:表示CSV格式数据。
2)应用程序类型:
- application/xml:表示XML数据文件。
- application/json:表示JSON数据格式。
- application/pdf:表示PDF文档文件。
- application/zip:表示ZIP压缩文件。
- application/x-gzip:表示GZip压缩文件。
- application/x-tar:表示TAR压缩文件。
- application/octet-stream:表示二进制数据流,通常用于未知文件类型。
3)multipart类型:
- multipart/form-data:通常用于HTML表单的方式上传,可以包含文本和二进制数据。
- multipart/mixed:表示包含多个独立部分的混合体,每个部分可以有不同的类型。
- multipart/alternative:表示包含同一内容的多个版本,通常是文本和HTML格式的邮件正文。
- multipart/related:表示包含相互依赖的部分,比如同时包含HTML页面和内嵌的图片或样式表等。
- multipart/byteranges:表示当响应中包含多个字节范围时使用,通常用于部分内容请求。
- multipart/report:表示用于邮件报告,通常包含消息和相关的错误报告等。
- multipart/x-mixed-replace:通常用于表示持续更新的数据流,比如实时图片流等。
4)图像类型:
- image/png:表示PNG图像文件。
- image/jpeg:表示JPEG图像文件。
- image/gif:表示GIF动画图像文件。
- image/bmp:表示BMP图像文件。
- image/svg+xml:表示SVG矢量图像文件。
5)音频类型:
- audio/wav:表示WAV音频文件。
- audio/mpeg:表示MP3音频文件。
- audio/ogg:表示OGG音频文件。
- audio/webm:表示WebM音频文件
6)视频类型:
- video/avi:表示AVI视频文件。
- video/mp4:表示MP4视频文件。
- video/quicktime:表示QuickTime视频文件。
- video/webm:表示WebM视频文件。
- 消息体数据:用于设置POST请求的消息体(通常又叫HTTP Body),这个通常仅用于POST 请求。在HTTP协议规范中,比如像GET请求等是没用消息体这个说法的。
- 文件上传:用于设置文件上传的参数。当使用JMeter做性能压测时,如果是对一个文件上传接口做性能压测,那么就需要用到文件上传这个选项了。设置文件上传时,文件名称通常填入文件的绝对路径。比如,需要上传D盘根目录下的1.jpg文件,那么就应该填入d:\1.jpg,参数名称填入HTTP请求接口中要求的参数名即可。
- 客户端实现:客户端实现位于HTTP 取样器请求的高级选项中,用于选择客户端的实现方式。在JMeter中,客户端的实现包括Java和HttpClient4两个选项,HttpClient4指的是使用外部第三方封装好的JAR包来直接发送HTTP取样器请求;而Java表示JMeter使用Java原生底层JDK的方式来发送HTTP取样器请求。当没用指定该选项时,会从JMeter 属性配置文件中读取JMeter.httpsampler的值来决定使用哪种客户端实现,如果属性配置文件中也没有进行设置,那么会直接使用HttpClient4。
- 超时连接:用于设置打开连接的超时时长,单位为毫秒。
- 响应超时:用于设置响应超时的时长,单位为毫秒。
- 从HTML文件获取所有内含的资源:用于设置让JMeter从HTML文件中解析其中被引用到的图片、Java小程序、JavaScrip文件等其他资源文件。可以同时通过正则表达式的方式来设置网址必须匹配的内容以及通过设置URLS must not match 来自定义确定需要解析哪些资源文件。
- 源地址:用于设置JMeter发送请求时的源地址,该源地址通常可以为某个IP或者电脑的主机名,也可以为某个网卡的设备等。
- 代理服务器:用于设置网络代理服务器的IP、端口号、用户名和密码等信息。通常当发送HTTP取样器请求需要用到网络代理时,才需要设置代理服务器的相关信息。
3.6.2 FTP请求
FTP请求取样器用于向FTP协议的服务器发起请求,支持向FTP服务器发送检索文件或者上传文件、下载文件等请求,该请求取样器在界面中包含的参数如下:
- 服务器名称或IP:设置FTP服务器的域名或者IP地址。
- 端口号:设置FTP服务器的端口号。
- 远程文件:要检索的文件或要上传的目标文件的名称。
- 本地文件:要上传的文件或下载的目标(通常默认为远程文件中填写的文件名称)。
- 本地文件内容:设置需要上传的文件内容,该设置会覆盖本地文件的设置,即当设置了本地文件内容后,本地文件配置就不生效。
- 选择请求类型:选择是检索获取文件还是上传文件。
- 使用二进制模式:设置是否使用二进制模式来传输文件,默认为ASCII模式。
- 保存文件响应:是否将检索到的文件内容存储到响应数据中。如果传输模式为ASCII,则内容将在JMeter监听器中的查看结果树这个元件中可查看到。
- 登录配置:指设置FTP服务器的用户名和密码。如果FTP服务器支持匿名访问,可以不设置登录配置。
3.6.3 GraphQL HTTP Request
GraphQL HTTP Request取样器是HTTP请求取样器的一种特殊形式,用于通过HTTP请求的方式对GraphQL API进行查询或者编辑等操作。GraphQL 是一种API服务的查询的语言,与传统的 RESTful API不同,GraphQL API对数据提供了一套简单并且容易理解的完整描述,使得客户端请求能够更加准确地获取其需要的数据。GraphQL HTTP Request取样器的界面参数和HTTP请求取样器类似,但是GraphQL HTTP Request取样器中新增了如下参数:
- Query:用于设置GraphQL查询语句,是一个必填参数。
- Variables:用于以JSON字符串的方式来设置GraphQL查询变量,非必填参数。
如图3-21所示是一个Query语句和Variables之间的对应关系。在查询语句中需要用到id变量,然后在Variables中通过JSON字符串的方式来设置id的值。
图3-21 Query语句和变量之间如何对应的示例
3.6.4 JDBC Request:JDBC Request
JDBC Request取样器是通过JDBC传输协议的方式向数据库发起查询、修改、删除等请求,只要是支持JDBC协议的数据库都可以通过JDBC Request取样器来进行性能压测。JDBC Request取样器通常与配置元件中的JDBC Connection Configuration元件一起搭配使用。在JDBC Connection Configuration元件中,设置待进行性能压测的JDBC数据服务器的相关连接等配置信息,然后通过JDBC Request取样器向数据库发起请求。JDBC Request取样器包含的参数如下:
- Variable Name of Pool declared in JDBC Connection Configuration:用于设置在JDBC Connection Configuration元件中设置的名称,这样JDBC Request取样器就能知道应该从哪个Connection Configuration元件中读取配置信息了。
- Query Type:选择查询的类型。支持Select(查询)、Update(更新)、Callable(调用)、Commit(提交)、Rollback(回滚)等类型。
- SQL Query:用于设置需要执行的SQL语句。
- Parameter values:设置SQL语句中用到的参数。
- Parameter types:设置SQL语句中用到的参数类型。
如图3-22所示是一个在SQL查询语句中如何设置SQL语句中用到的参数和参数类型的示例。在SQL语句中用两个问号来定义需要传入的两个变量,而在Parameter values中通过逗号分隔的方式按照顺序传入两个实际的参数值,并且在Parameter types中通过逗号分隔的方式按照顺序的方式定义这两个实际的参数值的数据类型。数据类型通常是指的Java开发语言中的基本数据类型,这些基本数据类型被定义在Java JDK的java.sql.Types这个Class类中。读者可以通过访问http://docs.oracle.com/javase/8/docs/api/java/sql/Types.html获取常见的基本数据类型详细说明。
图3-22 SQL查询设置参数示例
- Variable Names:用于设置变量名称。
- Result Variable Name:用于将查询的结果设置保存为一个变量,以提供给性能压测的其他步骤中进行引用。
- Query timeout(s):用于设置查询的超时时长,单位为秒。
- Limit ResultSet:用于设置对查询的结果集返回的记录数量进行限制。如果不设置则代表不进行限制。
- Handle ResultSet:用于设置对查询的结果集进行如何处理。默认为Store As String,表示存储为字符串。同时支持设置为Store As Object(以对象的方式存储,JMeter是通过Java语言开发,而Java语言是一种面向对象的开发语言,这里的Object指的就是Java语言中的对象)、Count Records(对结果进行统计)等。
