本文详细介绍了JMeter的安装与基本使用方法,通过创建测试计划和线程组,添加HTTP请求和监听器,逐步引导读者入门。文中还提供了多个实战案例,包括模拟用户登录、测试网站性能和压测API接口,帮助读者深入理解JMeter初识项目实战。
JMeter简介与安装 什么是JMeterJMeter是一个开源的性能测试工具,主要用于对网站应用或其他组件进行负载测试。它能模拟多种协议,包括但不限于HTTP、HTTPS、FTP、JDBC、SOAP、RESTful等。JMeter可用于测试静态和动态资源,如静态文件、Java Servlet、PHP脚本、ASP.NET页面、JSP组件、数据库查询和网页后端等等。此外,JMeter还可以作为功能测试工具,用于测试应用程序的功能性,如表单提交、点击流等。
JMeter的安装步骤-
下载JMeter
访问JMeter官网或GitHub页面,下载最新版本的JMeter压缩包。下载地址如下:
https://jmeter.apache.org/download_jmeter.cgi
-
解压安装包
使用解压工具(如WinRAR、7-Zip)将下载的JMeter压缩包解压到指定目录,例如
C:\JMeter
。 -
配置环境变量
- 打开系统的环境变量设置。
- 在“系统变量”窗口中,点击“新建”,创建名为
JMeter_HOME
的变量,值为解压JMeter的目录路径,例如C:\JMeter\apache-jmeter-5.4
。 - 在“系统变量”窗口中,找到
Path
变量,点击“编辑”,在变量值中添加;%JMeter_HOME%\bin
(注意前面的分号)。
-
启动JMeter
- 打开终端或命令提示符,输入
jmeter
并回车,启动JMeter。 - 或者直接通过JMeter安装目录的
bin
文件夹中双击jmeter.bat
启动JMeter。
- 打开终端或命令提示符,输入
确保安装过程正确无误后,可以通过以下步骤验证JMeter是否成功安装:
-
打开JMeter
在命令行中输入
jmeter
并按回车,或者直接找到JMeter的启动脚本并运行它。 -
检查启动界面
正确安装后,JMeter的启动界面会显示出来,界面中可以看到各种组件和工具。
-
创建测试计划
单击“文件”菜单中的“新建”选项,创建一个新的测试计划。如果能够成功创建新的测试计划,则说明JMeter已经正确安装了。
-
打开JMeter
启动JMeter并创建一个新测试计划。
-
命名测试计划
在测试计划的名称框内输入“我的第一个测试计划”。
-
添加线程组
右键点击测试计划,然后选择“添加”>“线程(用户)”>“线程组”,在弹出的对话框中设置线程数(即模拟用户数),例如设置为5个用户,循环次数设置为1次,这意味着每个用户会发起一次请求。
-
添加HTTP请求
右键点击线程组,选择“添加”>“取样器”>“HTTP请求”。在弹出的对话框中,设置请求的名称,例如“我的第一个请求”。在“服务器名称或IP”字段中输入目标服务器的地址,例如
http://www.example.com
。 -
添加监听器
右键点击线程组,选择“添加”>“监听器”>“查看结果树”,这样可以在测试过程中查看每个请求的详细响应。
继续上面的步骤,可以增加更多的HTTP请求来测试不同的功能,或者调整线程组的参数,例如增加线程数来模拟更多的用户并发访问。
-
线程组参数设置:
Thread Group - Number of Threads (Virtual Users): 5 - Ramp-Up Period (in seconds): 0 - Loop Count: 1
-
HTTP请求设置:
HTTP Request - Name: 我的第一个请求 - Protocol: http - Server Name or IP: www.example.com - Path: /
-
启动测试
单击测试计划上方的“启动”按钮,JMeter将开始执行测试计划。
-
观察结果
在“查看结果树”监听器中,可以实时查看每个HTTP请求的响应状态、响应时间、请求内容等。
-
分析结果
通过“聚合报告”监听器,可以查看整体的测试结果,包括平均响应时间、吞吐量等关键指标。
逻辑控制器
逻辑控制器用于控制取样器的执行顺序,常见的逻辑控制器包括:
-
Simple Controller
该控制器允许你将多个请求组织成一个组,这些请求将按顺序执行。例如,可以将所有涉及登录的请求放入一个Simple Controller中。
<SimpleController guiclass="LogicControllerGui" testclass="SimpleController" testname="登录流程" enabled="true"> <elementProp guiclass="TestElement" testclass="ElementProperty" testname="HTTP请求1" enabled="true"> <elementProp name="HTTPSampler.path" elementType="HTTPSampler"> <stringProp name="HTTPSampler.domain">www.example.com</stringProp> <stringProp name="HTTPSampler.port">80</stringProp> <stringProp name="HTTPSampler.protocol">http</stringProp> <stringProp name="HTTPSampler.method">POST</stringProp> <stringProp name="HTTPSampler.path">/login</stringProp> </elementProp> </elementProp> <elementProp guiclass="TestElement" testclass="ElementProperty" testname="HTTP请求2" enabled="true"> <elementProp name="HTTPSampler.path" elementType="HTTPSampler"> <stringProp name="HTTPSampler.domain">www.example.com</stringProp> <stringProp name="HTTPSampler.port">80</stringProp> <stringProp name="HTTPSampler.protocol">http</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> <stringProp name="HTTPSampler.path">/profile</stringProp> </elementProp> </elementProp> </SimpleController>
-
While Controller
使用While控制器可以创建循环,直到满足特定条件才停止。例如,可以设置一个While控制器来模拟长时间运行的任务。
<WhileController guiclass="LogicControllerGui" testclass="WhileController" testname="长时间任务" enabled="true"> <boolProp name="WhileController.condition">false</boolProp> <elementProp guiclass="TestElement" testclass="ElementProperty" testname="HTTP请求" enabled="true"> <elementProp name="HTTPSampler.path" elementType="HTTPSampler"> <stringProp name="HTTPSampler.domain">www.example.com</stringProp> <stringProp name="HTTPSampler.port">80</stringProp> <stringProp name="HTTPSampler.protocol">http</stringProp> <stringProp name="HTTPSampler.method">POST</stringProp> <stringProp name="HTTPSampler.path">/task</stringProp> </elementProp> </elementProp> </WhileController>
示例代码片段
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="登录请求" enabled="true">
<stringProp name="HTTPSampler.path">/login</stringProp>
<stringProp name="HTTPSampler.domain">www.example.com</stringProp>
<stringProp name="HTTPSampler.port">80</stringProp>
<stringProp name="HTTPSampler.method">POST</stringProp>
<stringProp name="HTTPSampler.embedded"></stringProp>
</HTTPSampler>
使用断言验证响应
断言用于验证服务器响应是否符合预期。JMeter提供了多种断言方式,例如:
-
HTTP响应码断言
用于验证HTTP响应状态码是否在期望的范围内,例如200表示成功。
<responseAssertion> <boolProp name="Assertion.tolerant">true</boolProp> <boolProp name="Assertion.ignoreStatus">false</boolProp> <stringProp name="Assertion.testField">Response Code</stringProp> <stringProp name="Assertion.testResponse">200</stringProp> </responseAssertion>
-
响应内容断言
用于检查响应内容是否包含特定的文本或符合正则表达式。
<responseAssertion> <boolProp name="Assertion.tolerant">true</boolProp> <boolProp name="Assertion.ignoreStatus">false</boolProp> <stringProp name="Assertion.testField">Text Response</stringProp> <stringProp name="Assertion.testString">success</stringProp> </responseAssertion>
示例代码片段
<responseAssertion>
<boolProp name="Assertion.tolerant">true</boolProp>
<boolProp name="Assertion.ignoreStatus">false</boolProp>
<stringProp name="Assertion.testField">Text Response</stringProp>
<collectionProp name="Assertion.testString">
<stringProp name="1">success</stringProp>
</collectionProp>
</responseAssertion>
通过定时器控制请求间隔
定时器用于控制请求之间的间隔时间,常见的定时器类型有:
-
Constant Timer
每个请求之间设置恒定的延迟时间,例如500毫秒。
<constantTimer> <stringProp name="ConstantTimer.delay">500</stringProp> </constantTimer>
-
Uniform Random Timer
每个请求之间设置一个随机的延迟时间,例如在100至500毫秒之间。
<uniformRandomTimer> <stringProp name="UniformRandomTimer.delay">500</stringProp> <stringProp name="UniformRandomTimer.range">400</stringProp> </uniformRandomTimer>
示例代码片段
<constantTimer>
<stringProp name="ConstantTimer.delay">500</stringProp>
</constantTimer>
JMeter的高级功能介绍
使用监听器实时查看测试结果
-
View Results Tree
查看结果树监听器可以实时查看每个请求的详细响应,包括请求头、响应头、响应内容等。
<viewResultsTree> <boolProp name="ViewResultsTree.saveDataOnError">false</boolProp> <boolProp name="ViewResultsTree.saveLogRowsOnError">false</boolProp> <stringProp name="ViewResultsTree.requestHeaders">true</stringProp> <stringProp name="ViewResultsTree.responseHeaders">true</stringProp> <stringProp name="ViewResultsTree.responseBody">true</stringProp> </viewResultsTree>
-
Aggregate Report
聚合报告监听器可以汇总整个测试计划的测试结果,提供平均响应时间、吞吐量等关键指标。
<aggregateReport> <boolProp name="SummaryReport.showPercentiles">true</boolProp> <boolProp name="SummaryReport.showLatency">true</boolProp> <boolProp name="SummaryReport.showPercentageErrors">true</boolProp> <boolProp name="SummaryReport.showThroughput">true</boolProp> </aggregateReport>
示例代码片段
<viewResultsTree>
<boolProp name="ViewResultsTree.saveDataOnError">false</boolProp>
<boolProp name="ViewResultsTree.saveLogRowsOnError">false</boolProp>
<stringProp name="ViewResultsTree.requestHeaders">true</stringProp>
<stringProp name="ViewResultsTree.responseHeaders">true</stringProp>
<stringProp name="ViewResultsTree.responseBody">true</stringProp>
</viewResultsTree>
结果保存与回放
-
结果保存
测试完成后,可以保存结果以便后续分析。结果可以保存为HTML或JTL文件。
<resultcollector> <boolProp name="ResultCollector.errorLogging">false</boolProp> <stringProp name="ResultCollector.filename">C:\results.jtl</stringProp> <stringProp name="ResultCollector.fileFormat">jtl</stringProp> </resultcollector>
-
结果回放
保存的测试结果可以通过JMeter回放,以便重复执行相同的测试用例。
<resultcollector> <boolProp name="ResultCollector.errorLogging">false</boolProp> <stringProp name="ResultCollector.filename">C:\results.jtl</stringProp> <stringProp name="ResultCollector.fileFormat">jtl</stringProp> </resultcollector>
示例代码片段
<resultcollector>
<boolProp name="ResultCollector.errorLogging">false</boolProp>
<stringProp name="ResultCollector.filename">C:\results.jtl</stringProp>
<stringProp name="ResultCollector.fileFormat">jtl</stringProp>
</resultcollector>
调整和优化测试脚本
-
参数化
通过使用变量来替换测试脚本中的固定值,例如用户名、密码等。可以在测试计划中添加“用户定义的变量”元件来定义这些变量。
<userDefinedVariables> <collectionProp name="UserDefinedVariables"> <elementProp name="User" elementType="Argument"> <stringProp name="Argument.value">admin</stringProp> </elementProp> <elementProp name="Password" elementType="Argument"> <stringProp name="Argument.value">123456</stringProp> </elementProp> </collectionProp> </userDefinedVariables>
-
调试脚本
使用调试组件,如
Debug Sampler
和Debug Post-Processor
,来获取请求和响应的详细信息。<debugSampler> <boolProp name="DebugSampler.displayJMeterVariables">true</boolProp> <boolProp name="DebugSampler.displaySamplerProperties">true</boolProp> <boolProp name="DebugSampler.displayAssertionErrors">true</boolProp> </debugSampler>
示例代码片段
<userDefinedVariables>
<collectionProp name="UserDefinedVariables">
<elementProp name="User" elementType="Argument">
<stringProp name="Argument.value">admin</stringProp>
</elementProp>
<elementProp name="Password" elementType="Argument">
<stringProp name="Argument.value">123456</stringProp>
</elementProp>
</collectionProp>
</userDefinedVariables>
JMeter实战案例分析
实战案例一:模拟用户登录
-
创建测试计划
新建一个测试计划,命名为“用户登录测试”。
-
添加线程组
在测试计划中添加线程组,设置线程数为5,循环次数为1。
-
添加HTTP请求
在线程组中添加HTTP请求,设置URL为
http://www.example.com/login
,设置请求方法为POST,并添加对应的参数,例如用户名和密码。 -
添加断言
添加响应内容断言,确保响应内容中包含“登录成功”。
-
添加监听器
添加查看结果树监听器以查看每个请求的详细响应。
示例代码片段
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="登录请求" enabled="true">
<elementProp guiclass="HttpHeaderPanel" testclass="HeaderManager" testname="HTTP请求头管理器" enabled="true">
<collectionProp name="Header.name">
<elementProp name="Content-Type" elementType="Header">
<stringProp name="Header.value">application/x-www-form-urlencoded</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.path">/login</stringProp>
<stringProp name="HTTPSampler.domain">www.example.com</stringProp>
<stringProp name="HTTPSampler.port">80</stringProp>
<stringProp name="HTTPSampler.method">POST</stringProp>
<stringProp name="TestAction.file"></stringProp>
<stringProp name="HTTPSampler.embedded"></stringProp>
<elementProp name="HTTPsampler.Arguments" elementType="HTTPArguments">
<collectionProp name="Arguments.arguments">
<elementProp name="username" elementType="HTTPArgument">
<stringProp name="Argument.name">username</stringProp>
<stringProp name="Argument.value">admin</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="password" elementType="HTTPArgument">
<stringProp name="Argument.name">password</stringProp>
<stringProp name="Argument.value">123456</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
</HTTPSampler>
实战案例二:测试网站性能
-
创建测试计划
新建一个测试计划,命名为“网站性能测试”。
-
添加线程组
设置线程数为10,循环次数为100。
-
添加HTTP请求
在线程组中添加HTTP请求,设置URL为
http://www.example.com/index
。 -
添加定时器
添加Constant Timer,设置延迟时间为100毫秒。
-
添加监听器
添加聚合报告监听器,查看测试结果的统计信息。
示例代码片段
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="首页请求" enabled="true">
<stringProp name="HTTPSampler.path">/index</stringProp>
<stringProp name="HTTPSampler.domain">www.example.com</stringProp>
<stringProp name="HTTPSampler.port">80</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<stringProp name="TestAction.file"></stringProp>
<stringProp name="HTTPSampler.embedded"></stringProp>
</HTTPSampler>
<constantTimer>
<stringProp name="ConstantTimer.delay">100</stringProp>
</constantTimer>
<responseAssertion>
<boolProp name="Assertion.tolerant">true</boolProp>
<boolProp name="Assertion.ignoreStatus">false</boolProp>
<stringProp name="Assertion.testField">Text Response</stringProp>
<collectionProp name="Assertion.testString">
<stringProp name="1">Welcome</stringProp>
</collectionProp>
</responseAssertion>
<viewResultsTree>
<boolProp name="ViewResultsTree.saveDataOnError">false</boolProp>
<boolProp name="ViewResultsTree.saveLogRowsOnError">false</boolProp>
<stringProp name="ViewResultsTree.requestHeaders">true</stringProp>
<stringProp name="ViewResultsTree.responseHeaders">true</stringProp>
<stringProp name="ViewResultsTree.responseBody">true</stringProp>
</viewResultsTree>
<aggregateReport>
<boolProp name="SummaryReport.showPercentiles">true</boolProp>
<boolProp name="SummaryReport.showLatency">true</boolProp>
<boolProp name="SummaryReport.showPercentageErrors">true</boolProp>
<boolProp name="SummaryReport.showThroughput">true</boolProp>
</aggregateReport>
实战案例三:压测API接口
-
创建测试计划
新建一个测试计划,命名为“API接口压测”。
-
添加线程组
设置线程数为50,循环次数为100。
-
添加HTTP请求
在线程组中添加HTTP请求,设置URL为
http://www.example.com/api/v1/users
,设置请求方法为GET。 -
添加监听器
添加聚合报告监听器,查看测试结果的统计信息。
示例代码片段
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="API请求" enabled="true">
<stringProp name="HTTPSampler.path">/api/v1/users</stringProp>
<stringProp name="HTTPSampler.domain">www.example.com</stringProp>
<stringProp name="HTTPSampler.port">80</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<stringProp name="TestAction.file"></stringProp>
<stringProp name="HTTPSampler.embedded"></stringProp>
</HTTPSampler>
<constantTimer>
<stringProp name="ConstantTimer.delay">100</stringProp>
</constantTimer>
<responseAssertion>
<boolProp name="Assertion.tolerant">true</boolProp>
<boolProp name="Assertion.ignoreStatus">false</boolProp>
<stringProp name="Assertion.testField">Text Response</stringProp>
<collectionProp name="Assertion.testString">
<stringProp name="1">[{"id":1,"name":"John Doe"}]</stringProp>
</collectionProp>
</responseAssertion>
<viewResultsTree>
<boolProp name="ViewResultsTree.saveDataOnError">false</boolProp>
<boolProp name="ViewResultsTree.saveLogRowsOnError">false</boolProp>
<stringProp name="ViewResultsTree.requestHeaders">true</stringProp>
<stringProp name="ViewResultsTree.responseHeaders">true</stringProp>
<stringProp name="ViewResultsTree.responseBody">true</stringProp>
</viewResultsTree>
<aggregateReport>
<boolProp name="SummaryReport.showPercentiles">true</boolProp>
<boolProp name="SummaryReport.showLatency">true</boolProp>
<boolProp name="SummaryReport.showPercentageErrors">true</boolProp>
<boolProp name="SummaryReport.showThroughput">true</boolProp>
</aggregateReport>
总结与后续学习方向
JMeter学习资源推荐
-
慕课网
慕课网提供了大量的JMeter在线课程,包括基础入门和高级进阶课程,适合不同级别的学习者。访问地址:
https://www.imooc.com/course/cate/25
-
JMeter官方文档
JMeter的官方文档详尽地介绍了工具的各个方面,是学习JMeter的重要资源。可以在JMeter官网获取:
https://jmeter.apache.org/usermanual/index.html
-
JMeter社区论坛
论坛是学习JMeter和解决问题的好地方,社区成员可以分享经验、交流心得。访问地址:
https://jmeter.51cyz.com/
-
JMeter社区
JMeter社区是一个活跃的在线论坛,用户可以提问、分享经验、讨论问题。社区提供了详细的FAQ、教程和案例分享。
访问地址:
https://community.jmeter.apache.org/
-
JMeter用户邮件列表
JMeter用户邮件列表是一个邮件订阅列表,注册后可以接收邮件通知,了解最新的信息和问题解答。
访问地址:
https://jmeter.apache.org/mail-lists.html
-
深入理解JMeter组件
在掌握了基础功能后,可以深入学习JMeter的各种组件,例如元件、监听器、断言等,并了解它们的具体用途和配置选项。
-
编写复杂的测试脚本
学习如何编写复杂的测试脚本,可以模拟更复杂的用户行为和业务场景,例如登录、注册、购物车操作等。
-
性能和负载测试
深入理解性能和负载测试的概念,如何设置合适的线程数、请求间隔等参数,以模拟真实的用户访问情况。
-
自动化测试脚本
学习如何使用脚本语言(如BeanShell、JSR223等)来编写自动化测试脚本,让测试更加灵活和自动化。
通过上述步骤和建议,可以逐步掌握JMeter的使用技巧,提升测试工作的效率和质量。
希望这篇教程能够帮助你更好地理解和使用JMeter,祝你在性能测试的道路上越走越远!
共同学习,写下你的评论
评论加载中...
作者其他优质文章