JMeter使用示例

5,703 阅读13分钟

下载安装

  1. 安装主程序

从Apache JMeter官网下最新版本:jmeter.apache.org/download_jm…
如图:



下载后直接解压即可。

  1. 安装插件管理

从http://www.jmeter-plugins.org/install/Install/ 下载插件管理包,如图:


将下载的包放至jmemter解压根目录的lib/ext下即可。

目录说明

先看一下解压后的JMeter安装目录:


  • 目录说明

  • bin 包含启动、配置等相关命令

  • docs 官方本地文档目录

  • extras 辅助库

  • lib 核心库,包含JMeter用到的各种基础库和插件

  • licenses 包含non-ASF软件的许可证

  • printable_docs 可打印版本文档目录

  • LICENSE JMeter许可说明

  • NOTICE JMeter简单信息说明

  • README.md JMeter官方基本介绍

下面我们重点看下bin目录,如图:


主要介绍bin目录下我们最关注几个文件:

  • jmeter.properties JMeter核心配置文件,各种配置基本在这完成

  • log4j.conf JMeter日志配置管理

  • jmeter.log JMeter运行日志记录,什么输出信息、警告、报错都在这里进行了记录

  • jmeter.bat windows下jmeter启动文件

  • shutdown.cmd windows下jmeter关闭文件

  • stoptest.cmd windows下jmeter测试停止文件

  • jmeter-server.bat windows下jmeter服务器模式启动文件

注:每一个.cmd文件都对应一个.sh文件,.sh是linux下的对应功能的文件

其他文件的功能就不一一说明了,同时其他目录这里也不再进行阐述,有兴趣的朋友可以自己深入看下。

关键配置说明

  1. jmeter.properties配置说明

主要包含以下几个方面的配置:

  • SSL配置:

重点关注下面几个配置# 指定HTTPS协议层https.default.protocol=TLS# 指定SSL版本,实际应用中可能需要修改https.default.protocol=SSLv3# 设置启动的协议https.socket.protocols=SSLv2Hello SSLv3 TLSv1# 缓存控制,控制SSL是否可以在多个迭代中重用https.use.cached.ssl.context=true
  • JMeter界面显示配置

这里就不对其界面显示控制进行说明了,一般情况下默认界面能满足大家的应用了。

  • JMeter测试项目自动备份配置

# 设置是否启用自动备份,默认是truejmeter.gui.action.save.backup_on_save=true# 设置自动备份目录,默认备份至JMeter根目录的backups下jmeter.gui.action.save.backup_directory=# 设置自动备份项目数,默认为最近10个jmeter.gui.action.save.keep_backup_max_count=10
  • 远程主机配置

# 配置远程主机的IP,默认为本机。用逗号","可以设置多个远程主机remote_hosts=127.0.0.1# 多个远程主机指定示例如下,其中:后为端口remote_hosts=127.0.0.1:1099,127.0.0.1:1200,127.0.0.1:1300对于RMID的配置请直接看配置文件中的选项说明
  • 日志管理配置

# 设置日志格式log_format_type=default# 设置日志输出级别log_level.jmeter=INFO# 设置junit日志输出级别log_level.jmeter.junit=DEBUG# 设置日志输出目标文件,默认为jmeter.loglog_file=jmeter.log
  • 等等其他还有10多个配置大项(就不一一列举了)

  1. jmeter.bat关键配置修改

为了更优化的使用jmeter,需要对jmeter.bat中的一些配置根据当前机器的配置进行优化,这里进行关键配置项说明,大家根据自己的机器的配置来进行修改。

jvm相关配置,大概在80行左右,找到这些配置,
对其中的数值根据当前机器的硬件配置来修改。set HEAP=-Xms2048m -Xmx2048mset NEW=-XX:NewSize=512m -XX:MaxNewSize=512mset SURVIVOR=-XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=50%set TENURING=-XX:MaxTenuringThreshold=2if %current_minor% LEQ "8" (    rem Increase MaxPermSize if you use a lot of Javascript in your Test Plan :
    set PERM=-XX:PermSize=512m -XX:MaxPermSize=1024m
)

启动jmeter

在bin目录下直接双击jmeter.bat即可

启动后的界面如下:




HTTP协议报文结构及示例

HTTP基本架构

下面我们用一张简单的流程图来展示HTTP协议基本架构,以便大家先有个基本的了解。


  • Web Client可以是浏览器、搜索引擎、机器人等等一切基于HTTP协议发起http请求的工具。

  • Web Server可以是任何的能解析HTTP请求,并返回给Web Client可识别的响应的服务,常见的有apache、nginx、IIS等等web服务器。

浓缩就是精华,看下最简洁的HTTP交互图:


HTTP报文结构

  • 请求报文

HTTP请求报文由请求行、请求头、空行和请求内容4个部分构成。

如下图所示:


下面对上图进行简单的分析:

请求行

由请求方法字段、URL字段、协议版本字段三部分构成,它们之间由空格隔开。常用的请求方法有:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。

请求头

请求头由key/value对组成,每行为一对,key和value之间通过冒号(:)分割。请求头的作用主要用于通知服务端有关于客户端的请求信息。

典型的请求头有:

User-Agent:生成请求的浏览器类型

Accept:客户端可识别的响应内容类型列表;星号* 用于按范围将类型分组。*/*表示可接受全部类型,type/*表示可接受type类型的所有子类型。

Accept-Language: 客户端可接受的自然语言

Accept-Encoding: 客户端可接受的编码压缩格式

Accept-Charset: 可接受的字符集

Host: 请求的主机名,允许多个域名绑定同一IP地址

connection:连接方式(close或keeplive)

Cookie: 存储在客户端的扩展字段

空行

最后一个请求头之后就是空行,用于告诉服务端以下内容不再是请求头的内容了。

请求内容

请求内容主要用于POST请求,与POST请求方法配套的请求头一般有Content-Type(标识请求内容的类型)和Content-Length(标识请求内容的长度)

  • 响应报文

HTTP响应报文由状态行、响应头、空行和响应内容4个部分构成。

如下图所示:


下面对响应报文格式进行简要的分析说明:

状态行

由HTTP协议版本、状态码、状态码描述三部分构成,它们之间由空格隔开。

状态码由3位数字组成,第一位标识响应的类型,常用的5大类状态码如下:

1xx:表示服务器已接收了客户端的请求,客户端可以继续发送请求

2xx:表示服务器已成功接收到请求并进行处理

3xx:表示服务器要求客户端重定向

4xx:表示客户端的请求有非法内容

5xx:标识服务器未能正常处理客户端的请求而出现意外错误

常见状态码说明:

200 OK: 表示客户端请求成功

400 Bad Request: 表示客户端请求有语法错误,不能被服务器端解析

401 Unauthonzed: 表示请求未经授权,该状态码必须与WWW-Authenticate报文头一起使用

404 Not Found:请求的资源不存在,例如输入了错误的url

500 Internal Server Error: 表示服务器发生了不可预期的错误,导致无法完成客户端的请求

503 Service Unavailable:表示服务器当前不能处理客户端的请求,在一段时间后服务器可能恢复正常

响应头

一般情况下,响应头会包含以下,甚至更多的信息。

Location:服务器返回给客户端,用于重定向到新的位置

Server: 包含服务器用来处理请求的软件信息及版本信息

Vary:标识不可缓存的请求头列表

Connection: 连接方式。

对于请求端来讲:close是告诉服务端,断开连接,不用等待后续的求请了。keeplive则是告诉服务端,在完成本次请求的响应后,保持连接,等待本次连接后的后续请求。

对于响应端来讲:close表示连接已经关闭。keeplive则表示连接保持中,可以继续处理后续请求。Keep-Alive表示如果请求端保持连接,则该请求头部信息表明期望服务端保持连接多长时间(秒),例如300秒,应该这样写Keep-Alive: 300

空行

最后一个响应头之后就是空行,用于告诉请求端以下内容不再是响应头的内容了。

响应内容

服务端返回给请求端的文本信息。

HTTP报文示例

在这里我们在Firefox下用firebug随意抓取一个HTTP包和上文的报文结构做下一一对应关系图,以便大家了解实际的包和标准报文结构的对应关系。


JMeter组件

在jmeter中提供了一系列的不同的组件,每一种组件都提供了某类功能的实现,用于支持性能测试的实施。

请看下图,jmeter的核心组件构成。


学习、研究jmeter之前,深入了解jmeter的基本组件及其作用是必须的。接下来我们开始讨论基于jmetere进行性能测试必须掌握的组件,以便大家逐步掌握jemter的核心基本能力。

下面的几个组件是入门jmeter必须掌握的:

  • Thread Group

  • Samplers

  • Listeners

  • Configuration

Thread Group(线程组)

线程组是一系列线程的集合,每一个线程代表着一个正在使用应用程序的用户。在jmeter中,每个线程意味着模拟一个真实用户向服务器发起请求。

在jmeter中,线程组组件运行用户设置线程数量、初始化方式等等配置。

例如,如果你设置线程数为100,那么jmeter将创建并模拟测试100个用户请求到服务器端。

如下图所示:


Samplers

我们常用的jmeter测试有HTTP、FTP、JDBC协议,以及其他各种支持的协议。

在上节我们已经知道线程组件用于模拟用户请求至服务器端。

但还未讲解如何在线程组件中实现某种请求类型(比如如何发起HTTP请求?)。

在本节中,我们将演示如何利用Samplers组件的元素来实现各类请求类型。

我们先看一下在jmeter中Samplers组件已经实现了哪些协议的支持。如下图所示:


下面我们就重要的Samplers组件元素进行一一讲解,以便大家有个初步的了解。

  • BeanShell Sampler

这个组件元素允许我们在jmeter中写Bean Shell脚本,写这个脚本有什么作用?意味着你可以完全的控制和实现自己的需要。灵活定制,自然也就有难度,你得有点脚本功底。

参见图说明:


注:每一个Sampler都有自己独立的beanshell解析器,并且sampler只能在自己的线程中调用(意味着不可跨线程使用)。

  • FTP Request

FTP Request元素提供了测试ftp服务器的能力,这个元素让我们能够去测试ftp的上传、下载功能。

下面我们看一下ftp元素的基本配置说明:


注:我们经常在windows和linux直接通过ftp进行文件传输,建议勾选Use Binary Mode,避免编码问题。

  • HTTP Request

HTTP Request提供了HTTP/HTTPS协议的测试支持能力。

下面我们一起看看HTTP Request元素的基本配置说明,了解下基本的功能。


  • Java Request

Java Request提供了测试java API的支持,但要注意要测试的java API需要有对应的测试类,该测试类必须继承AbstractJavaSamplerClient。 示例如下:

待测类class Sum; -> 生成sum.jar

继承至AbstractJavaSamplerClient的测试类Class TestSum(AbstractJavaSamplerClient) -> 生成testSum.jar

注:

一个java测试应该要实现以下几个方法,以便jmeter java sampler可以正确调用:

方法说明
Arguments getDefaultParameters()用于获取jmeter java sampler传入的测试数据
SampleResult runTest(JavaSamplerContext arg0)测试事务处理
void setupTest(JavaSamplerContext arg0)初始化
void teardownTest(JavaSamplerContext arg0)清理

更详细的后续出专题讲解,本篇不举具体示例了。

注意testSum.jar要能调用sum.jar。

将上述sum.jar、testSum.jar拷贝至jmeter安装目录的lib/ext下。

下面我们看看如何在jmeter配置java测试。


对于JDBC Request、JMS Point-to-Point、JSR223、SMTP、JUnit Request等Sampler组件元素就不一一说明了在后续的分享中,主要基于HTTP和java请求来分享实战。

Listeners(监听器)

在jmeter中Listeners提供了执行结果生成和显示能力的支持,提供了树形结构、表、图形和日志方式。

下面我们先看下几种结果显示示例图。

图形模式:


树模式:


表模式:


日志方式


Configuration Elements(即配置元件)

配置元件包含了Samplers下各种Sampler的默认配置设置,如果有配置默认配置,在Sampler下对应的sampler就会使用该默认配置。

下面我们看看我们主要用到的默认配置有哪些。


下面进行逐一的说明。

  • CSV Data Set Config CSV Data Set Config主要用于读取csv格式的文件中数据,实现参数化。


  • HTTP Cookie Manager HTTP Cookie Manager主要用于默认cookie管理。


  • HTTP Request Defaults HTTP Request Defaults用于配置HTTP request的默认值,例如IP、端口等等都设置好默认值后,在后续HTTP request元素里就不需要重复设置,节省时间。


JMeter性能测试基本过程及示例

性能测试是我们日常测试过程中,必须掌握的技能。通过进行性能测试,我们能分析服务端的整体性能、负载等,以便进一步评估我们的业务系统是否能满足当前运营生产及未来业务增长情况下如何进一步调整我们的服务配置方案。

jmeter为性能测试提供了一下特色:

  • jmeter可以对测试静态资源(例如js、html等)以及动态资源(例如php、jsp、ajax等等)进行性能测试

  • jmeter可以挖掘出系统最大能处理的并发用户数

  • jmeter提供了一系列各种形式的性能分析报告

使用jmeter一般用于以下两种类型的性能测试


负载测试:通过测试系统在资源超负荷情况下的表现,以发现设计上的错误或验证系统的负载能力。

压力测试:测试系统能承受的最大负载能力。目的在于发挖掘出目标服务系统可以处理的最大负载。

基本过程

下面我们看下使用jmeter进行性能测试的基本过程。


对上图进行简要的说明

  • 新增线程组

创建测试线程组,并设置线程数量及线程初始化启动方式。

  • 新增JMeter元组

创建各种默认元组及测试元组,填入目标测试静态资源请求和动态资源请求参数及数据。

  • 新增监听器

创建各种形式的结果搜集元组,以便在运行过程及运行结束后搜集监控指标数据。

  • 运行&查看结果 调试运行,分析指标数据,挖掘性能瓶颈、评估系统性能状态、

示例

下面我们以打开百度演示上述过程。

  • 新增线程组

  1. 在jmeter的bin目录下双击jmeter.bat启动jmeter

  2. 在左边操作栏中选择“测试计划”,右击新增一个线程组,如图所示:


  3. 初始化线程组相关信息,如图:


  • 新增JMeter元组

  1. 添加默认配置元素,添加如下默认配置,如


各默认组件配置如图所示。

HTTP Cache Manager


HTTP Cookie管理器


HTTP请求默认值


  1. 添加HTTP Request元组 在线程组上右击新增HTTP请求,如图:



HTTP请求设置如图:


  • 新增监听器

在这里我们添加如下监听器,如图所示


  • 运行&查看结果

如果启动运行jmeter,可以单击添加的监听器查看运行过程中的监控指标数据,也可以等运行结束后,再查看。

如图:


结果说明

下面我们就监听器所采集的结果图进行简要的说明:

图形结果


察看结果树


用表格查看结果


聚合报告