本文详细介绍了JMeter压测学习的全过程,从下载安装到创建简单的压测脚本,再到分布式压测和结果分析。文章涵盖了JMeter的基本概念、配置优化、以及如何生成和解读测试报告,帮助读者全面掌握JMeter压测技能。JMeter压测学习不仅涉及基础操作,还包括高级配置和实践应用。
JMeter简介与下载安装JMeter是什么
JMeter是一款开源的Java应用,主要用于进行负载测试、功能测试以及性能测试。它能模拟多种用户行为,并支持各种协议,如HTTP、HTTPS、FTP、Web Services等。JMeter在Web测试中尤其强大,可以测试静态和动态资源,如动态网页、JSP组件、Java对象、数据库、FTP服务器等。此外,JMeter还可以用于测试静态资源加载时间、服务器响应速度、网络延迟等。
JMeter的下载与安装
JMeter的最新版本可以在其官方网站上找到。以下是下载与安装步骤:
- 访问JMeter官网下载页面,选择合适的版本。通常选择最新版本即可,但也可以根据自己的需求选择。
- 下载完成后,解压下载的文件夹。
- 解压后,打开bin文件夹,选择对应的启动脚本。对于Windows用户,可以直接运行
jmeter.bat
;对于Linux或Mac用户,需要使用jmeter
命令。 - 运行启动脚本后,JMeter窗口将会打开,此时可以开始使用了。
JMeter的界面介绍
JMeter的界面主要包括以下几个部分:
- 菜单栏:包含文件、编辑、运行等菜单项。
- 工具栏:常用功能的快捷按钮,包括新建、保存、运行测试等。
- 工作区:用于添加各种测试组件,如线程组、取样器、监听器等。
- 测试计划树:展示当前测试计划结构,包括线程组、取样器、监听器等。
- 日志栏:展示JMeter的运行日志信息。
测试计划
测试计划是JMeter中一个重要的组件,它定义了一个测试的所有组件,包括线程组、取样器、监听器等。它相当于一个测试脚本的容器,可以包含多个线程组和取样器。测试计划是可配置的,可以设置名称、注释等。
线程组
线程组是JMeter的核心组件之一,它定义了测试中用户的虚拟行为。线程组可以设置模拟用户数量、启动时间间隔、循环次数等参数。线程组下可以添加取样器、定时器、断言等组件,用于模拟用户的行为。
取样器
取样器是JMeter中最基本的组件,它负责向服务器发送请求并接收响应。常见的取样器如HTTP请求、JDBC请求等。取样器的配置取决于请求的协议类型。
监听器
监听器用于收集和显示测试结果。常见的监听器包括查看结果树、聚合报告、响应时间等。监听器可以配置不同的参数,以便显示所需的信息。例如,查看结果树监听器可以展示每次请求的具体信息,如请求URL、响应时间、响应内容等。
创建第一个简单的压测脚本新建测试计划
- 打开JMeter。
- 在菜单栏选择文件 -> 新建,创建一个新的测试计划。
- 在测试计划的名字框内输入测试计划名称,如
My First Test Plan
。 - 保存测试计划,可以选择文件 -> 保存,输入文件名保存。
添加线程组
- 在测试计划中右键,选择添加 -> 线程(用户) -> 线程组。
- 在弹出的线程组配置窗口中,设置线程数,如设置线程数为10,表示模拟10个用户。
- 设置每个线程的启动延迟时间,如每个线程启动间隔5秒。
- 设置循环次数,如设置为1,表示每个用户只执行一次请求。
添加HTTP请求
- 在线程组内右键,选择添加 -> 取样器 -> HTTP请求。
- 在HTTP请求配置窗口中,输入请求的URL,如
http://example.com
。 - 设置协议(HTTP或HTTPS)、服务器名称或IP地址、端口号、路径等。
- 可以设置其他参数,如设置Content-Type为
application/json
。 - 保存配置。
示例代码(线程组配置):
<ThreadGroup>
<elementProp name="ThreadGroup-1-1" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="ThreadGroup.num_threads">10</stringProp>
<stringProp name="ThreadGroup.ramp_time">5</stringProp>
<boolProp name="ThreadGroup.scheduler">false</boolProp>
<stringProp name="ThreadGroup.duration"></stringProp>
<stringProp name="ThreadGroup.delay"></stringProp>
<boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
</ThreadGroup>
添加查看结果树监听器
- 在线程组内右键,选择添加 -> 监听器 -> 查看结果树。
- 保存配置。
运行测试
- 选择菜单栏的运行 -> 启动,开始测试。
- 测试运行中,可以在查看结果树监听器中看到每个请求的详细信息,包括响应时间、响应内容等。
- 测试结束后,可以分析结果并进行优化。
线程组参数设置
线程组的参数设置直接影响测试行为和结果。设置参数时,需要考虑以下几点:
- 线程数:模拟的用户数量。增加线程数可以模拟更多的并发用户。
- 启动延迟:每个线程启动的间隔时间。适当的延迟可以模仿真实用户的访问间隔,减少服务器压力。
- 循环次数:每个线程执行请求的次数。可以设置为无限制(持续运行),直到特定条件或时间为止。
示例代码(线程组配置):
<ThreadGroup>
<elementProp name="ThreadGroup-1-1" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="ThreadGroup.num_threads">10</stringProp>
<stringProp name="ThreadGroup.ramp_time">5</stringProp>
<boolProp name="ThreadGroup.scheduler">false</boolProp>
<stringProp name="ThreadGroup.duration"></stringProp>
<stringProp name="ThreadGroup.delay"></stringProp>
<boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
</ThreadGroup>
设置采样器参数
采样器参数的设置决定了请求的具体内容。参数设置包括URL、请求方法(GET、POST等)、请求头、请求体等。
示例代码(采样器配置):
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain">example.com</stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.path">/path</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
<boolProp name="HTTPSampler.postBodyRaw">false</boolProp>
</HTTPSamplerProxy>
添加断言与定时器
断言用于验证请求的预期结果,例如响应码是否为200。定时器用于设置请求之间的延迟时间,模拟真实用户的访问间隔。
示例代码(断言配置):
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request" enabled="true">
<boolProp name="HTTPSampler.postBodyRaw">false</boolProp>
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain">example.com</stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.path">/path</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
<elementProp name="HTTPSampler.assertion_1" elementType="Assertion" guiclass="AssertionGui" testclass="Assertion" testname="Response Assertion" enabled="true">
<boolProp name="Assertion.testField">false</boolProp>
<stringProp name="Assertion.testProperty">Response code was not 200</stringProp>
<collectionProp name="Assertion.response_field_names">
<stringProp name="1">Response Code</stringProp>
</collectionProp>
<collectionProp name="Assertion.response_field_values">
<stringProp name="1">200</stringProp>
</collectionProp>
<boolProp name="Assertion.assertAllIfThreadsEqualOne">false</boolProp>
</elementProp>
</HTTPSamplerProxy>
示例代码(定时器配置):
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request" enabled="true">
<boolProp name="HTTPSampler.postBodyRaw">false</boolProp>
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain">example.com</stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.path">/path</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
<elementProp name="HTTPSampler.timer_1" elementType="ConstantTimer" guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true">
<stringProp name="ConstantTimer.delay">500</stringProp>
</elementProp>
</HTTPSamplerProxy>
JMeter的分布式压测
分布式压测的概念
分布式压测是指使用多台机器同时运行JMeter测试,这样可以模拟更多的用户并发访问,提高测试的准确性和可靠性。分布式压测通常用于大型系统或需要大量并发压力的场景。
分布式压测的配置与运行
分布式压测的配置与运行包括以下几个步骤:
- 准备压测服务器:选择多台服务器作为压测服务器。服务器需要安装JMeter并且配置环境变量。
- 配置主控机:主控机用于控制多台服务器的测试运行。在主控机的
jmeter.properties
文件中,需要配置服务器列表。 - 配置从属服务器:从属服务器需要设置JMeter的
jmeter.properties
文件,指定服务器角色为从属。 - 分发测试计划:将测试计划分发到所有从属服务器。
- 启动测试:在主控机上启动测试,开始分布式压测。
示例代码(主控机配置):
server_port=4445
remote_hosts=server1,server2,server3
示例代码(从属服务器配置):
server_port=4445
client.rmi.localport=50000
示例代码(启动命令):
jmeter -n -t /path/to/testplan.jmx -R server1,server2,server3
JMeter服务器的搭建与管理
JMeter服务器的搭建与管理包括以下几个步骤:
- 安装JMeter:在每台服务器上安装JMeter。
- 配置JMeter:修改配置文件
jmeter.properties
,设置相应的参数。 - 启动JMeter:启动JMeter并加入分布式测试集群。
- 管理JMeter:监控和管理服务器的运行情况,确保测试的稳定性和准确性。
生成测试报告
生成测试报告是测试完成后的重要步骤,测试报告可以提供详细的测试结果和分析数据。JMeter提供了多种监听器来生成不同的报告。
示例代码(聚合报告监听器配置):
<AggregateReport guiclass="AggregateReportGui" testclass="AggregateReport" testname="Aggregate Report" enabled="true">
<boolProp name="aggregateByTS">false</boolProp>
<boolProp name="aggregateByLabel">true</boolProp>
<stringProp name="aggregateByField"></stringProp>
<boolProp name="aggregateBySample">false</boolProp>
<boolProp name="aggregateByHost">false</boolProp>
<stringProp name="aggregateByFieldKey"></stringProp>
<boolProp name="showPercentiles">true</boolProp>
<boolProp name="showResponseTimes">true</boolProp>
<boolProp name="showAggTime">true</boolProp>
<boolProp name="showAvg">true</boolProp>
<boolProp name="showCount">true</boolProp>
<boolProp name="showError">true</boolProp>
<boolProp name="showSuccess">true</boolProp>
<boolProp name="showThroughput">true</boolProp>
<boolProp name="showThroughputUnit">true</boolProp>
<boolProp name="showThroughputUnitValue">true</boolProp>
<boolProp name="showConcurrency">true</boolProp>
<boolProp name="showLatency">true</boolProp>
<boolProp name="showLabel">true</boolProp>
<stringProp name="includeLabels"></stringProp>
<stringProp name="excludeLabels"></stringProp>
<stringProp name="percentilesToDisplay"></stringProp>
<stringProp name="minResponseTime"></stringProp>
<stringProp name="maxResponseTime"></stringProp>
<stringProp name="percentile1"></stringProp>
<stringProp name="percentile2"></stringProp>
<stringProp name="percentile3"></stringProp>
<stringProp name="percentile4"></stringProp>
<stringProp name="percentile5"></stringProp>
<stringProp name="percentile6"></stringProp>
<stringProp name="percentile7"></stringProp>
<stringProp name="percentile8"></stringProp>
<stringProp name="percentile9"></stringProp>
<stringProp name="percentile10"></stringProp>
<stringProp name="percentile11"></stringProp>
<stringProp name="percentile12"></stringProp>
<stringProp name="percentile13"></stringProp>
<stringProp name="percentile14"></stringProp>
<stringProp name="percentile15"></stringProp>
<stringProp name="percentile16"></stringProp>
<stringProp name="percentile17"></stringProp>
<stringProp name="percentile18"></stringProp>
<stringProp name="percentile19"></stringProp>
<stringProp name="percentile20"></stringProp>
</AggregateReport>
分析测试结果
分析测试结果是测试完成后的重要工作。通过分析结果,可以了解系统的性能瓶颈、响应时间、吞吐量等关键指标。此外还可以发现系统中的错误和异常情况。
使用后处理器与聚合报告
后处理器用于处理响应数据,例如可以从响应中提取特定信息并保存到变量中。聚合报告是JMeter中常用的监听器之一,它可以汇总测试结果,提供各种统计信息。
示例代码(BeanShell后处理器配置):
<BeanShellPostProcessor guiclass="BeanShellPostProcessorGui" testclass="BeanShellPostProcessor" testname="BeanShell PostProcessor" enabled="true">
<stringProp name="beanshell_variables">vars.put("responseCode", responseCode)</stringProp>
<stringProp name="beanshell_script"></stringProp>
<stringProp name="beanshell_reset">true</stringProp>
<stringProp name="beanshell_init"></stringProp>
<stringProp name="beanshell_reset_init"></stringProp>
<stringProp name="beanshell_reset_tearDown"></stringProp>
<stringProp name="beanshell_tearDown"></stringProp>
</BeanShellPostProcessor>
示例代码(聚合报告监听器配置):
<AggregateReport guiclass="AggregateReportGui" testclass="AggregateReport" testname="Aggregate Report" enabled="true">
<boolProp name="aggregateByTS">false</boolProp>
<boolProp name="aggregateByLabel">true</boolProp>
<stringProp name="aggregateByField"></stringProp>
<boolProp name="aggregateBySample">false</boolProp>
<boolProp name="aggregateByHost">false</boolProp>
<stringProp name="aggregateByFieldKey"></stringProp>
<boolProp name="showPercentiles">true</boolProp>
<boolProp name="showResponseTimes">true</boolProp>
<boolProp name="showAggTime">true</boolProp>
<boolProp name="showAvg">true</boolProp>
<boolProp name="showCount">true</boolProp>
<boolProp name="showError">true</boolProp>
<boolProp name="showSuccess">true</boolProp>
<boolProp name="showThroughput">true</boolProp>
<boolProp name="showThroughputUnit">true</boolProp>
<boolProp name="showThroughputUnitValue">true</boolProp>
<boolProp name="showConcurrency">true</boolProp>
<boolProp name="showLatency">true</boolProp>
<boolProp name="showLabel">true</boolProp>
<stringProp name="includeLabels"></stringProp>
<stringProp name="excludeLabels"></stringProp>
<stringProp name="percentilesToDisplay"></stringProp>
<stringProp name="minResponseTime"></stringProp>
<stringProp name="maxResponseTime"></stringProp>
<stringProp name="percentile1"></stringProp>
<stringProp name="percentile2"></stringProp>
<stringProp name="percentile3"></stringProp>
<stringProp name="percentile4"></stringProp>
<stringProp name="percentile5"></stringProp>
<stringProp name="percentile6"></stringProp>
<stringProp name="percentile7"></stringProp>
<stringProp name="percentile8"></stringProp>
<stringProp name="percentile9"></stringProp>
<stringProp name="percentile10"></stringProp>
<stringProp name="percentile11"></stringProp>
<stringProp name="percentile12"></stringProp>
<stringProp name="percentile13"></stringProp>
<stringProp name="percentile14"></stringProp>
<stringProp name="percentile15"></stringProp>
<stringProp name="percentile16"></stringProp>
<stringProp name="percentile17"></stringProp>
<stringProp name="percentile18"></stringProp>
<stringProp name="percentile19"></stringProp>
<stringProp name="percentile20"></stringProp>
</AggregateReport>
通过上述内容,您可以全面了解和掌握JMeter的使用方法与技巧。从入门到实践,从基本功能到高级配置,JMeter提供了丰富的功能,帮助您更好地进行性能测试和负载测试。