JMeter是一个完全开源的、纯Java编写的性能测试工具,主要用于测试静态和动态资源的性能。它能够模拟多种用户行为,测试系统在高并发情况下的性能表现。本文将详细介绍JMeter初识,包括安装配置、基本功能使用和测试结果分析等。
JMeter简介JMeter 是一个完全开源的、纯 Java 编写的性能测试工具,主要用于测试静态和动态资源的性能。它能够对多种组件进行测试,包括静态资源(如静态文件、图片等)、动态服务器(如基于 Servlet 的应用)、数据库、FTP 服务器、Java 对象、Web 服务等。
JMeter 主要用于模拟多种用户行为,测试系统在高并发情况下的性能表现。例如,可以用来测试 Web 应用程序、数据库、和其他基于网络的应用。它可以用来验证服务器的响应时间和稳定性,也可以用来做负载测试,即模拟大量用户同时访问系统的情况来测试系统的极限性能。
在安装 JMeter 之前,需要确保系统已经安装了 JDK。JMeter 仅支持 Java 8 及以上版本,因此在安装 JMeter 之前,请确保您的系统已经安装并配置了 Java 开发工具包(JDK)。
C:\apache-jmeter-5.4
。bin
子目录。jmeter.bat
;对于 Linux 或 macOS 系统,使用 jmeter
。jmeter.bat
文件启动 JMeter。./jmeter
启动 JMeter。测试计划是 JMeter 测试的基本单元。在 JMeter 中创建测试计划,可以按照以下步骤进行:
添加 -> 测试计划 -> 测试计划
。Web 应用性能测试
。测试计划的 XML 配置示例:
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Web 应用性能测试" enabled="true"> <stringProp name="TestPlan.name">Web 应用性能测试</stringProp> <stringProp name="TestPlan.comments"></stringProp> <boolProp name="TestPlan.functional_mode">false</boolProp> <boolProp name="TestPlan.serialize_thread_group">false</boolProp> <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" enabled="true"> <collectionProp name="Arguments.arguments"></collectionProp> </elementProp> </TestPlan> `` ### 添加线程组和采样器 线程组用于模拟多个用户并发访问,而采样器则用于发送具体的 HTTP 请求。 1. **添加线程组**: - 在测试计划上右键,选择 `添加 -> 线程组 (Threads (Users)) -> 线程组`。 - 在线程组中可以设置线程数(模拟的用户数量)、Ramp-Up 时间(用户启动的间隔时间)以及循环次数(每个用户执行请求的次数)。 线程组的 XML 配置示例: ```xml <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="线程组" enabled="true"> <stringProp name="ThreadGroup.name">线程组</stringProp> <stringProp name="ThreadGroup.comments"></stringProp> . <intProp name="ThreadGroup.num_threads">1</intProp> <intProp name="ThreadGroup.ramp_time">0</intProp> <boolProp name="ThreadGroup.scheduler">false</boolProp> <intProp name="ThreadGroup.duration">0</intProp> <intProp name="ThreadGroup.delayedStart">0</intProp> <elementProp name="ThreadGroup.thread_group_properties" elementType="Arguments" guiclass="ThreadGroupPropertiesGui" testclass="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" enabled="true"> <collectionProp name="Arguments.arguments"></collectionProp> </elementProp> </ThreadGroup> `` 2. **添加 HTTP 请求采样器**: - 在线程组上右键,选择 `添加 -> 取样器 -> HTTP 请求`。 - 填写相关参数,包括协议(HTTP/HTTPS)、服务器名、端口(默认为 80/443)、路径、用户名和密码等。 HTTP 请求采样器的 XML 配置示例: ```xml <HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="HTTP Request" enabled="true"> <elementProp name="HTTPsampler.info" elementType="HTTPSamplerInfo" guiclass="HttpTestSampleGui" testclass="HTTPSamplerInfo" enabled="true"> <boolProp name="HTTPSampler.domain">example.com</boolProp> <boolProp name="HTTPSampler.port">80</boolProp> <boolProp name="HTTPSampler.Path">/api</boolProp> <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">true</boolProp> <boolProp name="HTTPSampler.useThreadDefaultPool">true</boolProp> <elementProp name="HTTPsampler.headers" elementType="HeaderManager" guiclass="HeaderPanel" testclass="HeaderManager" guiclass="HeaderPanel" testclass="HeaderManager" enabled="true"> <boolProp name="HeaderManager.always_encode">true</boolProp> </elementProp> </elementProp> </HTTPSampler>
监听器用于查看和记录测试结果。常用的监听器有视图结果树和聚合报告。
添加 -> 监听器 -> 视图结果树
。视图结果树监听器的 XML 配置示例:
<ViewResultsFullVisualizer guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="视图结果树" enabled="true"> <boolProp name="ViewResultTree.saveConfig">true</boolProp> <boolProp name="ResultCollector.error_logging">false</boolProp> <collectionProp name="SaveVariables"></collectionProp> <boolProp name="ResultCollector.successful">true</boolProp> <stringProp name="ResultCollector.filename"></stringProp> </ViewResultsFullVisualizer>
添加 -> 监听器 -> 聚合报告
。聚合报告监听器的 XML 配置示例:
<AggregateReport guiclass="AggregateReport" testclass="ResultCollector" testname="聚合报告" enabled="true"> <boolProp name="aggregateByThreads">false</boolProp> <boolProp name="aggregateByTime">true</boolProp> <stringProp name="aggregateByLabel"></stringProp> <boolProp name="aggregateByInvocations">false</boolProp> <boolProp name="includeTimedOutRequests">false</boolProp> <stringProp name="filename"></stringProp> </AggregateReport>JMeter脚本的编写
文件 -> 保存
或 文件 -> 另存为
保存脚本文件。HTTP 请求采样器:用于发送 HTTP 请求。
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="HTTP Request" enabled="true"> <elementProp name="HTTPsampler.info" elementType="HTTPSamplerInfo" guiclass="HttpTestSampleGui" testclass="HTTPSamplerInfo" enabled="true"> <boolProp name="HTTPSampler.domain">example.com</boolProp> <boolProp name="HTTPSampler.port">80</boolProp> <boolProp name="HTTPSampler.Path">/api</boolProp> <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">true</boolProp> <boolProp name="HTTPSampler.useThreadDefaultPool">true</boolProp> <elementProp name="HTTPsampler.headers" elementType="HeaderManager" guiclass="HeaderPanel" testclass="HeaderManager" guiclass="HeaderPanel" testclass="HeaderManager" enabled="true"> <boolProp name="HeaderManager.always_encode">true</boolProp> </elementProp> </elementProp> </HTTPSampler>
<JDBCSampler guiclass="JDBCPanel" testclass="JDBCSampler" testname="Database Request" enabled="true"> <elementProp name="dataSource" elementType="DataSource" guiclass="com.alibaba.p3c.jmeter.ui.DataSourcePanel" testclass="DataSource" guiclass="com.alibaba.p3c.jmeter.ui.DataSourcePanel" testclass="DataSource" enabled="true"> <boolProp name="dataSource.driverClass">com.mysql.jdbc.Driver</boolProp> <stringProp name="dataSource.url">jdbc:mysql://localhost:3306/mydatabase</stringProp> <stringProp name="dataSource.username">root</stringProp> <stringProp name="dataSource.password">password</stringProp> </elementProp> <stringProp name="JDBC.request">SELECT * FROM users WHERE id = 123</stringProp> </JDBCSampler>
参数化:可以通过变量来参数化请求中的动态值,如 URL 参数、请求头等。
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="HTTP Request" enabled="true"> <elementProp name="HTTPsampler.info" elementType="HTTPSamplerInfo" guiclass="HttpTestSampleGui" testclass="HTTPSamplerInfo" enabled="true"> <boolProp name="HTTPSampler.domain">example.com</boolProp> <boolProp name="HTTPSampler.port">80</boolProp> <boolProp name="HTTPSampler.Path">/api</boolProp> <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">true</boolProp> <boolProp name="HTTPSampler.useThreadDefaultPool">true</boolProp> <elementProp name="HTTPsampler.headers" elementType="HeaderManager" guiclass="HeaderPanel" testclass="HeaderManager" guiclass="HeaderPanel" testclass="HeaderManager" enabled="true"> <boolProp name="HeaderManager.always_encode">true</boolProp> </elementProp> </elementProp> <elementProp name="HTTPsampler.params" elementType="HTTPArguments" guiclass="ArgumentsPanel" testclass="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" enabled="true"> <collectionProp name="Arguments.arguments"> <elementProp name="param1" elementType="Argument"> <stringProp name="Argument.name">id</stringProp> <stringProp name="Argument.value">${id}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> </collectionProp> </elementProp> </HTTPSampler>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="CSV Data Set Config" enabled="true"> <stringProp name="filename">data.csv</stringProp> <stringProp name="variableNames">id</stringProp> </CSVDataSet>
视图结果树监听器可以显示每个请求的具体响应信息,包括请求参数、响应头、响应体、响应时间等。
<ViewResultsFullVisualizer guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="视图结果树" enabled="true"> <boolProp name="ViewResultTree.saveConfig">true</boolProp> <boolProp name="ResultCollector.error_logging">false</boolProp> <collectionProp name="SaveVariables"></collectionProp> <boolProp name="ResultCollector.successful">true</boolProp> <stringProp name="ResultCollector.filename">testresults.jtl</stringProp> </ViewResultsFullVisualizer>
聚合报告监听器可以汇总所有请求的性能统计信息,如平均响应时间、最小响应时间、最大响应时间、吞吐量等。
<AggregateReport guiclass="AggregateReport" testclass="ResultCollector" testname="聚合报告" enabled="true"> <boolProp name="aggregateByThreads">false</boolProp> <boolProp name="aggregateByTime">true</boolProp> <stringProp name="aggregateByLabel"></stringProp> <boolProp name="aggregateByInvocations">false</boolProp> <boolProp name="includeTimedOutRequests">false</boolProp> <stringProp name="filename">aggregated_results.csv</stringProp> </AggregateReport>
文件 -> 导出 -> 聚合报告
导出结果。<ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true"> <boolProp name="ViewResultTree.saveConfig">true</boolProp> <boolProp name="ResultCollector.error_logging">false</boolProp> <collectionProp name="SaveVariables"></collectionProp> <boolProp name="ResultCollector.successful">true</boolProp> <stringProp name="ResultCollector.filename">testresults.jtl</stringProp> </ResultCollector>
JMeter 社区资源非常丰富,可以在这里找到大量的示例和文档。在遇到问题时,可以寻求社区的帮助,或者在 GitHub 上查看其他用户的解决方案。