本文详细介绍了JMeter压测资料,包括JMeter的基本概念、安装配置、组件介绍、实战演练以及测试结果分析,帮助读者全面了解和掌握JMeter的使用方法。
JMeter简介Apache JMeter 是一个开源的 Java 应用程序,主要用于性能测试。它可用来测试静态和动态资源的性能,也可以测试桌面应用、数据库、Web 服务、FTP 服务器等。
JMeter 有以下主要功能:
JMeter 可以用于多种场景的性能测试:
JMeter 可以在官网下载,选择最新稳定版的 JMeter 发行包。下载完成后,解压到一个合适的目录。
JMeter 是一个基于 Java 的应用,所以需要 Java 环境。确保已经安装了 Java 并且环境变量设置正确。
设置环境变量:确保 JAVA_HOME
和 PATH
环境变量正确设置。
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH
运行 JMeter:进入 JMeter 的 bin 目录,运行 jmeter.sh
(Linux)或 jmeter.bat
(Windows)。
cd /path/to/jmeter/bin ./jmeter.sh
JMeter 的配置文件位于 bin
目录下的 jmeter.properties
文件中。
编辑 jmeter.properties
:例如,可以修改 JMeter 的线程池大小。
# 设置线程池大小 threads.create.max=255
2.. 调整 JMeter 的日志级别:可以在 log4j2.xml
中更改日志级别。
```xml <Configuration> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} %5p %c{1}:%L - %m%n"/> </Console> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> ```JMeter基本组件介绍
采样器是 JMeter 中最基本的组件,用于模拟用户的请求行为。常见的采样器有 HTTP 请求、数据库请求等。
HTTP 请求:用于模拟 HTTP 请求。
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request" enabled="true"> <stringProp name="HTTPSampler.domain">www.example.com</stringProp> <stringProp name="HTTPSampler.port">80</stringProp> <stringProp name="HTTPSampler.path">/path</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">true</boolProp> <boolProp name="HTTPSampler.useMonitor">false</boolProp> <stringProp name="HTTPSampler.connect_timeout"></stringProp> <stringProp name="HTTPSampler.response_timeout"></stringProp> </HTTPSamplerProxy>
数据库请求:用于模拟数据库操作请求。
<JDBCSampler guiclass="JDBCDebugSamplerGui" testclass="JDBCSampler" testname="JDBC Request" enabled="true"> <elementProp name="request" elementType="java.util.Properties" guiclass="PropertiesPanel" testclass="PropertiesPanel" testname="PropertiesPanel" enabled="true"> <collectionProp name="parameters"> <stringProp name="0">url=jdbc:mysql://localhost:3306/testdb</stringProp> <stringProp name="1">username=root</stringProp> <stringProp name="2">password=secret</stringProp> <stringProp name="3">driver=com.mysql.jdbc.Driver</stringProp> </collectionProp> </elementProp> <stringProp name="query">SELECT * FROM users</stringProp> </JDBCSampler>
监听器用于收集和显示测试结果。常见的监听器有查看结果树、聚合报告等。
查看结果树:显示每个请求的详细信息,包括请求头、响应体、响应码等。
聚合报告:显示测试的汇总信息,包括每秒请求数(T/s)、每秒失败数(f/s)、平均响应时间等。
定时器用于控制线程组中各个请求之间的延迟时间,模拟真实的用户行为。
固定定时器:设定一个固定的延迟时间。
<ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Constant Timer" enabled="true"> <intProp name="ConstantTimer.delay">1000</intProp> </ConstantTimer>
随机定时器:设定一个随机范围内的延迟时间。
<UniformRandomTimer guiclass="UniformRandomTimerGui" testclass="UniformRandomTimer" testname="Uniform Random Timer" enabled="true"> <intProp name="ConstantTimer.delay">1000</intProp> <intProp name="UniformRandomTimer.delay">1000</intProp> </UniformRandomTimer>
断言用于验证请求的结果是否符合预期。常见的断言有响应断言、JSON 断言等。
响应断言:验证响应内容是否包含特定的文本或正则表达式。
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true"> <collectionProp name="Assertion.response_field_names"> <stringProp name="1">HTTPSampler.dt</stringProp> </collectionProp> <collectionProp name="Assertion.test_type"> <stringProp name="2">1</stringProp> </collectionProp> <stringProp name="Assertion.test_strings">success</stringProp> <stringProp name="Assertion.response_encoding"></stringProp> </ResponseAssertion>
JSON 断言:验证 JSON 响应是否符合预期。
<JSONAssertion guiclass="JSONAssertionGui" testclass="JSONAssertion" testname="JSON Assertion" enabled="true"> <stringProp name="JSONAssertion.testJsonPath">$.status == 'success'</stringProp> <stringProp name="JSONAssertion.jsonText">${__P(json)}</stringProp> </JSONAssertion>
配置元件用于配置采样器的参数,包括用户定义的变量、HTTP 请求默认值等。
用户定义的变量:定义全局变量,可以在多个采样器中使用。
<UserDefinedVariables guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"> <elementProp name="user" elementType="pair" guiclass="ArgumentPanel" testclass="Argument" testname="Argument" enabled="true"> <stringProp name="Argument.name">user</stringProp> <stringProp name="Argument.value">admin</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> <elementProp name="password" elementType="pair" guiclass="ArgumentPanel" testclass="Argument" testname="Argument" enabled="true"> <stringProp name="Argument.name">password</stringProp> <stringProp name="Argument.value">123456</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> </collectionProp> </UserDefinedVariables>
HTTP 请求默认值:定义 HTTP 请求的默认值,可以在多个 HTTP 请求采样器中使用。
<HTTPDefaults guiclass="HTTPDefaultsGui" testclass="HTTPDefaults" testname="HTTP Request Defaults" enabled="true"> <stringProp name="HTTPSampler.domain">www.example.com</stringProp> <stringProp name="HTTPSampler.port">80</stringProp> <stringProp name="HTTPSampler.path">/path</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> </HTTPDefaults>
步骤 1:打开 JMeter,创建一个新的测试计划。
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true"> <elementProp name="TestPlan.function.gui.support" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> </elementProp> <stringProp name="TestPlan.name">Test Plan</stringProp> <stringProp name="TestPlan.testfile">Test Plan.jmx</stringProp> </TestPlan>
步骤 2:添加线程组(Thread Group)。
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true"> <stringProp name="ThreadGroup.onetransactionper_iteration">true</stringProp> <stringProp name="ThreadGroup.duration"></stringProp> <stringProp name="ThreadGroup.delay">0</stringProp> <stringProp name="ThreadGroup.scheduler">false</stringProp> <stringProp name="ThreadGroup.num_threads">5</stringProp> <stringProp name="ThreadGroup.ramp_time">1</stringProp> <stringProp name="ThreadGroup.start_time"></stringProp> <stringProp name="ThreadGroup.end_time"></stringProp> <stringProp name="ThreadGroup.delay_thread_creation">false</stringProp> <boolProp name="ThreadGroup.scheduler">false</boolProp> <stringProp name="ThreadGroup.duration"></stringProp> <stringProp name="ThreadGroup.delay">0</stringProp> <stringProp name="ThreadGroup.thread_count">1</stringProp> </ThreadGroup>
步骤 3:在线程组中添加 HTTP 请求采样器。
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request" enabled="true"> <stringProp name="HTTPSampler.domain">localhost</stringProp> <stringProp name="HTTPSampler.port">8080</stringProp> <stringProp name="HTTPSampler.protocol">http</stringProp> <stringProp name="HTTPSampler.path">/api/users</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> </HTTPSamplerProxy>
步骤 4:添加监听器来查看请求的结果。
<ViewResultsTree guiclass="ViewResultsTreeGui" testclass="ViewResultsTree" testname="View Results Tree" enabled="true"> </ViewResultsTree>
步骤 5:调整线程组中的参数,如线程数、循环次数等。
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true"> <stringProp name="ThreadGroup.onetransactionper_iteration">true</stringProp> <stringProp name="ThreadGroup.duration"></stringProp> <stringProp name="ThreadGroup.delay">0</stringProp> <stringProp name="ThreadGroup.scheduler">false</stringProp> <stringProp name="ThreadGroup.num_threads">50</stringProp> <stringProp name="ThreadGroup.ramp_time">1</stringProp> <stringProp name="ThreadGroup.start_time"></stringProp> <stringProp name="ThreadGroup.end_time"></stringProp> <stringProp name="ThreadGroup.delay_thread_creation">false</stringProp> </ThreadGroup>
查看结果树(View Results Tree):显示每个请求的详细信息,包括请求头、响应体、响应码等。
<ViewResultsTree guiclass="ViewResultsTreeGui" testclass="ViewResultsTree" testname="View Results Tree" enabled="true"> </ViewResultsTree>
聚合报告(Aggregate Report):显示测试的汇总信息,包括每秒请求数(T/s)、每秒失败数(f/s)、平均响应时间等。
<AggregateReport guiclass="AggregateReportGui" testclass="AggregateReport" testname="Aggregate Report" enabled="true"> </AggregateReport>