web test performance tool / jmeter
s
- 问题3:简陋的jmeter还是不如LR ,分析问题太粗
特征 | Python Locust | JMeter | LoadRunner |
---|---|---|---|
开发语言/是否开源 | Python / 是 | Java / 是 | C语言 / 否 |
支持协议 | 可以模拟HTTP、WebSocket及其他TCP Sockets的负载 |
可以模拟HTTP、HTTPS、SOAP、RESTful、JMS等 |
可以模拟协议 > Jmeter + Citrix、SAP等 |
脚本编写 | 编写在Python脚本中,需要一定的编程知识 | 有可视化编辑器,也提供了代码编辑器 | 有可视化编辑器,还有一些脚本命令,需要熟悉专用的IDE,相对复杂 |
负载生成 | 使用LOCUST命令启动,在主机中部署一个Web UI进行负载生成 | 可以在GUI模式或命令行模式下运行,也支持分布式负载生成 | 可以在GUI模式或命令行模式下运行,也支持分布式负载生成 |
监控工具 | 通过Web页面实时监视结果和性能指标,还查看自定义指标 | 提供了实时监控、图表和报告等功能,也可以通过插件扩展 | 可以监控载荷生成器以及被测系统的各种性能指标 |
测试报告 | 提供实时统计信息,也可以保存为CSV文件 | 定制的HTML测试报告相对简单,可通过插件 | 提供了一系列详细的报告和分析工具,包括事务响应时间、错误率和可伸缩性等 |
学习曲线 | - | 相对较低,对初学者友好 | 学习曲线较陡峭,需要培训和经验 |
支持的操作系统 | - | 跨平台,支持Windows、Linux、Mac等 | 主要支持Windows,一些协议在Linux上有限 |
用户界面 | - | 基于Java Swing,相对简单 | Windows客户端,功能丰富、复杂 |
性能和资源消耗 | - | 相对轻量级,适用于小型到中等负载 | 通常对系统资源要求较高,适用于大型和复杂负载 |
脚本录制方式 | - | 支持代理服务器录制、手工编写脚本 | 支持代理服务器录制、协议级录制、GUI级录制、手工编写脚本等 |
分布式执行 | - | 支持通过主从节点实现分布式执行 | 支持分布式执行,使用Controller和多个Load Generator |
- 问题2:jmeter自动录制IE访问的页面设置
1、创建一个线程组创建一个http代理服务器:工作台——>添加——>非测试元件——>http代理服务器设置参照下图,要录制的时候点击启动
2、设置IE,浏览器IE——>属性——>连接——>局域网设置
设置为本机IP即可,注意端口号与jemeter上的端口号一致,默认为8080
3,点击jemeter上的启动按钮,打开浏览器输入需要录制的web项目地址,jemeter会自动录制IE访问的页面。
- 问题1 :jmeter 乱码问题解决
解决1 :jmeter.properties第1063行修改为 sampleresult.default.encoding=utf8
元件执行顺序
- jmeter docs
https://jmeter.apache.org/usermanual/index.html
Jmeter Section Summary
- Changes
- +...1. Getting Started
- +...2. Building a Test Plan
- +...3. Elements of a Test Plan
- +...4. Building a Web Test Plan
- +...5. Building an Advanced Web Test Plan
- +...6. Building a Database Test Plan
- +...7. Building an FTP Test Plan
- +...8a. Building an LDAP Test Plan
- +...8b. Building an Extended LDAP Test Plan
- +...9. Building a Webservice Test Plan
- +...10. Building a JMS Point to point Test Plan
- +...11. Building a JMS Topic Test Plan
- +...11. Building a Test Plan Programmatically
- +...12. Listeners
- +...13. Remote Testing
- +...14. Dashboard Report
- +...15. Real time Results
- +...16. Best Practices
- +...17. Help! My boss wants me to load test our web app!
- +...18. Component Reference
- +...19. Properties Reference
- +...20. Functions
- +...21. Regular Expressions
- +...22. Hints and Tips
- +...23. Glossary
- +...24. Curl
- +...25. History / Future
Jmeter Detailed Section List
- 1. Getting Started
- 2. Building a Test Plan
- 3. Elements of a Test Plan
- 4. Building a Web Test Plan
- 5. Building an Advanced Web Test Plan
- 6. Building a Database Test Plan
- 7. Building an FTP Test Plan
- 8a. Building an LDAP Test Plan
- 8b. Building an Extended LDAP Test Plan
- 9. Building a Webservice Test Plan
- 10. Building a JMS Point to point Test Plan
- 11. Building a JMS topic Test Plan
- 11. Building a Test Plan Programatically
- 12. Introduction to Listeners
- 13. Remote Testing
- 14. Dashboard Report
- 15. Real time Results
- 16. Best Practices
- 17. Help! My boss wants me to load test our web app!
- 18. Component Reference
- 19. Properties reference
- 20. Functions
- 21. Regular Expressions
- 22. Hints and Tips
- 23. Glossary
- 24. Curl
- 25. History / Future
-
-
JMeter 是一款常用的性能测试工具,它可以用来模拟多种场景下的负载情况,帮助开发者发现系统中存在的性能问题。以下是 JMeter 的基本使用步骤:
下载并安装 JMeter:可以在官网上下载最新版的 JMeter 并进行安装。
创建测试计划:在 JMeter 中,测试计划是一个包含多个线程组、取样器、配置元件和监听器等元素的容器,用户可以在其中添加和配置这些元素。可以通过在 JMeter 界面上选择 File -> New 创建一个新的测试计划。
配置线程组:线程组是测试计划中的一个元素,用于指定并发用户数和测试持续时间等参数。可以通过在测试计划中右键点击 Add -> Threads(Users) -> Thread Group 添加一个线程组,并在线程组的属性窗口中设置相关参数。
添加取样器:取样器用于发送请求并获取服务器的响应,可以模拟多种类型的请求,如 HTTP 请求、FTP 请求、JDBC 请求等。可以通过在线程组中右键点击 Add -> Sampler 添加一个取样器,并在取样器的属性窗口中设置请求的地址、方法、参数等信息。
配置监听器:监听器用于收集和展示测试结果,可以显示响应时间、吞吐量、错误率等数据。可以通过在线程组中右键点击 Add -> Listener 添加一个监听器,并在监听器的属性窗口中选择需要展示的数据和显示方式。
运行测试计划:可以通过在测试计划中点击运行按钮或选择 Run -> Start 开始运行测试,JMeter 将模拟多个并发用户发送请求,并收集并展示测试结果。
以上是 JMeter 的基本使用步骤,JMeter 还支持多种高级功能,如断言、前置处理器、后置处理器、定时器等,可以通过官方文档或其他资料进行学习和掌握。
-
作业:将发布会5个接口的用例写到jmeter,添加断言,参数化,并调试通过
好的,我会根据您提供的接口信息,为每个接口编写JMeter用例,包括断言和参数化,并进行调试。以下是我为您编写的五个接口的JMeter用例:
接口1:用户注册
JMeter用例:
添加一个线程组并设置线程数为1,循环次数为1。
添加一个HTTP请求,设置请求方式为POST,请求URL为注册接口的URL。
在HTTP请求中添加请求参数:
username:${__P(username,)}
password:${__P(password,)}
email:${__P(email,)}
添加一个响应断言,检查响应数据中是否包含"success": true。
运行测试并查看结果。
参数化说明:
该接口需要三个参数:用户名、密码和电子邮件地址。在JMeter中,我使用了__P函数将这些参数定义为变量。在运行测试之前,您需要提供这些变量的值。
断言说明:
该接口的响应数据应该包含一个名为"success"的键,其值为true。因此,我使用了一个响应断言来检查响应数据中是否包含这个键值对。
接口2:用户登录
JMeter用例:
添加一个线程组并设置线程数为1,循环次数为1。
添加一个HTTP请求,设置请求方式为POST,请求URL为登录接口的URL。
在HTTP请求中添加请求参数:
username:${__P(username,)}
password:${__P(password,)}
添加一个响应断言,检查响应数据中是否包含"success": true。
运行测试并查看结果。
参数化说明:
该接口需要两个参数:用户名和密码。在JMeter中,我使用了__P函数将这些参数定义为变量。在运行测试之前,您需要提供这些变量的值。
断言说明:
该接口的响应数据应该包含一个名为"success"的键,其值为true。因此,我使用了一个响应断言来检查响应数据中是否包含这个键值对。
接口3:获取用户信息
JMeter用例:
添加一个线程组并设置线程数为1,循环次数为1。
添加一个HTTP请求,设置请求方式为GET,请求URL为获取用户信息接口的URL。
添加一个HTTP头部信息:Authorization: ${__P(token,)}
添加一个响应断言,检查响应数据中是否包含用户名和电子邮件地址。
运行测试并查看结果。
参数化说明:
该接口需要一个参数:访问令牌。在JMeter中,我使用了__P函数将这个参数定义为变量。在运行测试之前,您需要提供这个变量的值。
断言说明:
该接口的响应数据应该包含用户名和电子邮件地址。因此,我使用
siemens800@protonmail.com
继续
一个响应断言来检查响应数据中是否包含这些信息。
接口4:获取商品列表
JMeter用例:
添加一个线程组并设置线程数为1,循环次数为1。
添加一个HTTP请求,设置请求方式为GET,请求URL为获取商品列表接口的URL。
添加一个响应断言,检查响应数据中是否包含至少一个商品。
运行测试并查看结果。
参数化说明:
该接口不需要任何参数。
断言说明:
该接口的响应数据应该包含至少一个商品。因此,我使用了一个响应断言来检查响应数据中是否存在至少一个商品。
接口5:添加商品到购物车
JMeter用例:
添加一个线程组并设置线程数为1,循环次数为1。
添加一个HTTP请求,设置请求方式为POST,请求URL为添加商品到购物车接口的URL。
在HTTP请求中添加请求参数:
product_id:${__P(product_id,)}
quantity:${__P(quantity,)}
user_id:${__P(user_id,)}
token:${__P(token,)}
添加一个响应断言,检查响应数据中是否包含"success": true。
运行测试并查看结果。
参数化说明:
该接口需要四个参数:商品ID、数量、用户ID和访问令牌。在JMeter中,我使用了__P函数将这些参数定义为变量。在运行测试之前,您需要提供这些变量的值。
断言说明:
该接口的响应数据应该包含一个名为"success"的键,其值为true。因此,我使用了一个响应断言来检查响应数据中是否包含这个键值对。
注意:这里的接口参数中,用户ID和访问令牌的传递方式可能需要根据实际情况进行调整。如果这些参数是通过HTTP头部信息传递的,您需要将它们添加到HTTP请求的头部信息中。
调试说明:
在运行JMeter测试之前,您需要准备好所需的测试数据和参数值,例如用户ID、访问令牌、商品ID和数量等。这些值可以通过在命令行上设置JMeter属性或在JMeter GUI中设置用户定义的变量来传递。
在运行测试时,您应该监视JMeter的实时结果,并检查每个请求的响应时间和响应数据,以确保接口的正确性和性能。
如果您遇到任何问题或错误,请仔细检查测试计划和参数配置,并查看JMeter的日志文件以获取更多详细信息。
在调试完成后,您可以保存测试计划并在需要时再次运行。您也可以将测试结果保存为CSV或XML格式,并使用JMeter的聚合报告或图形结果分析器等插件来分析测试结果。
总结:
在本次作业中,我编写了5个JMeter测试用例,对在线商店的5个接口进行了测试。我使用了参数化和断言等技术来提高测试的可靠性和可维护性,并提供了详细的调试说明和建议。
- 作业
- jmeter jdbc
zentao 12版本环境启动
http://127.0.0.1:81/adminer/
- 1
- 2
- 3
- jmeter proxy, jmeter 代理录制,抓取url
- G:\wanho\docs\20230414_jmeter\HTTP请求_xpath_并列if_嵌套if_循环_foreach.jmx
<?xml version="1.0" encoding="UTF-8"?> <jmeterTestPlan version="1.2" properties="5.0" jmeter="5.0 r1840935"> <hashTree> <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="测试计划" enabled="true"> <stringProp name="TestPlan.comments"></stringProp> <boolProp name="TestPlan.functional_mode">false</boolProp> <boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp> <boolProp name="TestPlan.serialize_threadgroups">false</boolProp> <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="TestPlan.user_define_classpath"></stringProp> </TestPlan> <hashTree> <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="线程组-xpath写法" enabled="true"> <stringProp name="ThreadGroup.on_sample_error">continue</stringProp> <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="循环控制器" enabled="true"> <boolProp name="LoopController.continue_forever">false</boolProp> <stringProp name="LoopController.loops">1</stringProp> </elementProp> <stringProp name="ThreadGroup.num_threads">1</stringProp> <stringProp name="ThreadGroup.ramp_time">1</stringProp> <boolProp name="ThreadGroup.scheduler">false</boolProp> <stringProp name="ThreadGroup.duration"></stringProp> <stringProp name="ThreadGroup.delay"></stringProp> </ThreadGroup> <hashTree> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP请求1" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="HTTPSampler.domain"></stringProp> <stringProp name="HTTPSampler.port"></stringProp> <stringProp name="HTTPSampler.protocol"></stringProp> <stringProp name="HTTPSampler.contentEncoding"></stringProp> <stringProp name="HTTPSampler.path">http://www.cnblogs.com</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> <stringProp name="HTTPSampler.connect_timeout"></stringProp> <stringProp name="HTTPSampler.response_timeout"></stringProp> </HTTPSamplerProxy> <hashTree/> <XPathExtractor guiclass="XPathExtractorGui" testclass="XPathExtractor" testname="XPath提取器" enabled="true"> <stringProp name="TestPlan.comments">用来抓取title值,存入变量my_title,供下面if函数判断用</stringProp> <stringProp name="XPathExtractor.default">null</stringProp> <stringProp name="XPathExtractor.refname">my_title</stringProp> <stringProp name="XPathExtractor.matchNumber">-1</stringProp> <stringProp name="XPathExtractor.xpathQuery">//title</stringProp> <boolProp name="XPathExtractor.validate">false</boolProp> <boolProp name="XPathExtractor.tolerant">true</boolProp> <boolProp name="XPathExtractor.namespace">false</boolProp> </XPathExtractor> <hashTree/> <IfController guiclass="IfControllerPanel" testclass="IfController" testname="如果(If)控制器" enabled="true"> <stringProp name="TestPlan.comments">判断是否含有关键词:"百度一下,你就知道",是则请求,HTTP请求2</stringProp> <stringProp name="IfController.condition">"${my_title}" == "百度一下,你就知道"</stringProp> <boolProp name="IfController.evaluateAll">false</boolProp> </IfController> <hashTree> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP请求2" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="HTTPSampler.domain"></stringProp> <stringProp name="HTTPSampler.port"></stringProp> <stringProp name="HTTPSampler.protocol"></stringProp> <stringProp name="HTTPSampler.contentEncoding"></stringProp> <stringProp name="HTTPSampler.path">http://www.baidu.com</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> <stringProp name="HTTPSampler.connect_timeout"></stringProp> <stringProp name="HTTPSampler.response_timeout"></stringProp> </HTTPSamplerProxy> <hashTree/> </hashTree> <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="察看结果树" enabled="true"> <boolProp name="ResultCollector.error_logging">false</boolProp> <objProp> <name>saveConfig</name> <value class="SampleSaveConfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadName>true</threadName> <dataType>true</dataType> <encoding>false</encoding> <assertions>true</assertions> <subresults>true</subresults> <responseData>false</responseData> <samplerData>false</samplerData> <xml>true</xml> <fieldNames>true</fieldNames> <responseHeaders>false</responseHeaders> <requestHeaders>false</requestHeaders> <responseDataOnError>false</responseDataOnError> <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage> <assertionsResultsToSave>0</assertionsResultsToSave> <bytes>true</bytes> <sentBytes>true</sentBytes> <url>true</url> <threadCounts>true</threadCounts> <idleTime>true</idleTime> <connectTime>true</connectTime> </value> </objProp> <stringProp name="filename"></stringProp> </ResultCollector> <hashTree/> </hashTree> <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="线程组-双if并列写法" enabled="false"> <stringProp name="ThreadGroup.on_sample_error">continue</stringProp> <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="循环控制器" enabled="true"> <boolProp name="LoopController.continue_forever">false</boolProp> <stringProp name="LoopController.loops">1</stringProp> </elementProp> <stringProp name="ThreadGroup.num_threads">1</stringProp> <stringProp name="ThreadGroup.ramp_time">1</stringProp> <boolProp name="ThreadGroup.scheduler">false</boolProp> <stringProp name="ThreadGroup.duration"></stringProp> <stringProp name="ThreadGroup.delay"></stringProp> </ThreadGroup> <hashTree> <Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true"> <collectionProp name="Arguments.arguments"> <elementProp name="name1" elementType="Argument"> <stringProp name="Argument.name">name1</stringProp> <stringProp name="Argument.value">百度</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> <elementProp name="name2" elementType="Argument"> <stringProp name="Argument.name">name2</stringProp> <stringProp name="Argument.value">禅道</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> </collectionProp> </Arguments> <hashTree/> <IfController guiclass="IfControllerPanel" testclass="IfController" testname="如果(If)控制器" enabled="true"> <stringProp name="IfController.condition">"${name1}" == "百度"</stringProp> <boolProp name="IfController.evaluateAll">false</boolProp> </IfController> <hashTree> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP请求" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="HTTPSampler.domain"></stringProp> <stringProp name="HTTPSampler.port"></stringProp> <stringProp name="HTTPSampler.protocol"></stringProp> <stringProp name="HTTPSampler.contentEncoding"></stringProp> <stringProp name="HTTPSampler.path">http://www.baidu.com</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> <stringProp name="HTTPSampler.connect_timeout"></stringProp> <stringProp name="HTTPSampler.response_timeout"></stringProp> </HTTPSamplerProxy> <hashTree/> </hashTree> <IfController guiclass="IfControllerPanel" testclass="IfController" testname="如果(If)控制器" enabled="true"> <stringProp name="IfController.condition">"${name2}" == "禅道"</stringProp> <boolProp name="IfController.evaluateAll">false</boolProp> </IfController> <hashTree> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP请求" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="HTTPSampler.domain"></stringProp> <stringProp name="HTTPSampler.port"></stringProp> <stringProp name="HTTPSampler.protocol"></stringProp> <stringProp name="HTTPSampler.contentEncoding"></stringProp> <stringProp name="HTTPSampler.path">http://www.cnblogs.com</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> <stringProp name="HTTPSampler.connect_timeout"></stringProp> <stringProp name="HTTPSampler.response_timeout"></stringProp> <stringProp name="TestPlan.comments">访问禅道12版本</stringProp> </HTTPSamplerProxy> <hashTree/> </hashTree> <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="察看结果树" enabled="true"> <boolProp name="ResultCollector.error_logging">false</boolProp> <objProp> <name>saveConfig</name> <value class="SampleSaveConfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadName>true</threadName> <dataType>true</dataType> <encoding>false</encoding> <assertions>true</assertions> <subresults>true</subresults> <responseData>false</responseData> <samplerData>false</samplerData> <xml>true</xml> <fieldNames>true</fieldNames> <responseHeaders>false</responseHeaders> <requestHeaders>false</requestHeaders> <responseDataOnError>false</responseDataOnError> <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage> <assertionsResultsToSave>0</assertionsResultsToSave> <bytes>true</bytes> <sentBytes>true</sentBytes> <url>true</url> <threadCounts>true</threadCounts> <idleTime>true</idleTime> <connectTime>true</connectTime> </value> </objProp> <stringProp name="filename"></stringProp> </ResultCollector> <hashTree/> </hashTree> <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="线程组-双if嵌套写法" enabled="false"> <stringProp name="TestPlan.comments">百度</stringProp> <stringProp name="ThreadGroup.on_sample_error">continue</stringProp> <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="循环控制器" enabled="true"> <boolProp name="LoopController.continue_forever">false</boolProp> <stringProp name="LoopController.loops">1</stringProp> </elementProp> <stringProp name="ThreadGroup.num_threads">1</stringProp> <stringProp name="ThreadGroup.ramp_time">1</stringProp> <boolProp name="ThreadGroup.scheduler">false</boolProp> <stringProp name="ThreadGroup.duration"></stringProp> <stringProp name="ThreadGroup.delay"></stringProp> </ThreadGroup> <hashTree> <Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true"> <collectionProp name="Arguments.arguments"> <elementProp name="name" elementType="Argument"> <stringProp name="Argument.name">name</stringProp> <stringProp name="Argument.value">百度</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> <elementProp name="password" elementType="Argument"> <stringProp name="Argument.name">password</stringProp> <stringProp name="Argument.value">123456</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> </collectionProp> </Arguments> <hashTree/> <IfController guiclass="IfControllerPanel" testclass="IfController" testname="如果(If)控制器" enabled="true"> <stringProp name="IfController.condition">"${name}" == "百度"</stringProp> <boolProp name="IfController.evaluateAll">false</boolProp> </IfController> <hashTree> <IfController guiclass="IfControllerPanel" testclass="IfController" testname="如果(If)控制器" enabled="true"> <stringProp name="IfController.condition">"${password}" == "123456"</stringProp> <boolProp name="IfController.evaluateAll">false</boolProp> </IfController> <hashTree> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP请求" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="HTTPSampler.domain"></stringProp> <stringProp name="HTTPSampler.port"></stringProp> <stringProp name="HTTPSampler.protocol"></stringProp> <stringProp name="HTTPSampler.contentEncoding"></stringProp> <stringProp name="HTTPSampler.path">http://www.baidu.com</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> <stringProp name="HTTPSampler.connect_timeout"></stringProp> <stringProp name="HTTPSampler.response_timeout"></stringProp> </HTTPSamplerProxy> <hashTree/> </hashTree> </hashTree> <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="察看结果树" enabled="true"> <boolProp name="ResultCollector.error_logging">false</boolProp> <objProp> <name>saveConfig</name> <value class="SampleSaveConfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadName>true</threadName> <dataType>true</dataType> <encoding>false</encoding> <assertions>true</assertions> <subresults>true</subresults> <responseData>false</responseData> <samplerData>false</samplerData> <xml>true</xml> <fieldNames>true</fieldNames> <responseHeaders>false</responseHeaders> <requestHeaders>false</requestHeaders> <responseDataOnError>false</responseDataOnError> <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage> <assertionsResultsToSave>0</assertionsResultsToSave> <bytes>true</bytes> <sentBytes>true</sentBytes> <url>true</url> <threadCounts>true</threadCounts> <idleTime>true</idleTime> <connectTime>true</connectTime> </value> </objProp> <stringProp name="filename"></stringProp> </ResultCollector> <hashTree/> </hashTree> <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="线程组-循环控制器写法" enabled="false"> <stringProp name="ThreadGroup.on_sample_error">continue</stringProp> <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="循环控制器" enabled="true"> <boolProp name="LoopController.continue_forever">false</boolProp> <stringProp name="LoopController.loops">2</stringProp> </elementProp> <stringProp name="ThreadGroup.num_threads">1</stringProp> <stringProp name="ThreadGroup.ramp_time">1</stringProp> <boolProp name="ThreadGroup.scheduler">false</boolProp> <stringProp name="ThreadGroup.duration"></stringProp> <stringProp name="ThreadGroup.delay"></stringProp> </ThreadGroup> <hashTree> <LoopController guiclass="LoopControlPanel" testclass="LoopController" testname="循环控制器" enabled="true"> <boolProp name="LoopController.continue_forever">true</boolProp> <stringProp name="LoopController.loops">5</stringProp> </LoopController> <hashTree> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP请求" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="HTTPSampler.domain"></stringProp> <stringProp name="HTTPSampler.port"></stringProp> <stringProp name="HTTPSampler.protocol"></stringProp> <stringProp name="HTTPSampler.contentEncoding"></stringProp> <stringProp name="HTTPSampler.path">https://www.baidu.com</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> <stringProp name="HTTPSampler.connect_timeout"></stringProp> <stringProp name="HTTPSampler.response_timeout"></stringProp> </HTTPSamplerProxy> <hashTree/> </hashTree> <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="察看结果树" enabled="true"> <boolProp name="ResultCollector.error_logging">false</boolProp> <objProp> <name>saveConfig</name> <value class="SampleSaveConfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadName>true</threadName> <dataType>true</dataType> <encoding>false</encoding> <assertions>true</assertions> <subresults>true</subresults> <responseData>false</responseData> <samplerData>false</samplerData> <xml>true</xml> <fieldNames>true</fieldNames> <responseHeaders>false</responseHeaders> <requestHeaders>false</requestHeaders> <responseDataOnError>false</responseDataOnError> <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage> <assertionsResultsToSave>0</assertionsResultsToSave> <bytes>true</bytes> <sentBytes>true</sentBytes> <url>true</url> <threadCounts>true</threadCounts> <idleTime>true</idleTime> <connectTime>true</connectTime> </value> </objProp> <stringProp name="filename"></stringProp> </ResultCollector> <hashTree/> </hashTree> <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="线程组-foreach写法" enabled="false"> <stringProp name="ThreadGroup.on_sample_error">continue</stringProp> <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="循环控制器" enabled="true"> <boolProp name="LoopController.continue_forever">false</boolProp> <stringProp name="LoopController.loops">1</stringProp> </elementProp> <stringProp name="ThreadGroup.num_threads">1</stringProp> <stringProp name="ThreadGroup.ramp_time">1</stringProp> <boolProp name="ThreadGroup.scheduler">false</boolProp> <stringProp name="ThreadGroup.duration"></stringProp> <stringProp name="ThreadGroup.delay"></stringProp> </ThreadGroup> <hashTree> <Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true"> <collectionProp name="Arguments.arguments"> <elementProp name="name1" elementType="Argument"> <stringProp name="Argument.name">name1</stringProp> <stringProp name="Argument.value">java</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> <elementProp name="name2" elementType="Argument"> <stringProp name="Argument.name">name2</stringProp> <stringProp name="Argument.value">a</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> <elementProp name="name3" elementType="Argument"> <stringProp name="Argument.name">name3</stringProp> <stringProp name="Argument.value">b</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> <elementProp name="name4" elementType="Argument"> <stringProp name="Argument.name">name4</stringProp> <stringProp name="Argument.value">c</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> <elementProp name="name5" elementType="Argument"> <stringProp name="Argument.name">name5</stringProp> <stringProp name="Argument.value">d</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> </collectionProp> </Arguments> <hashTree/> <ForeachController guiclass="ForeachControlPanel" testclass="ForeachController" testname="ForEach控制器" enabled="true"> <stringProp name="ForeachController.inputVal">name</stringProp> <stringProp name="ForeachController.returnVal">word</stringProp> <boolProp name="ForeachController.useSeparator">false</boolProp> <stringProp name="ForeachController.startIndex">0</stringProp> <stringProp name="ForeachController.endIndex">5</stringProp> </ForeachController> <hashTree> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP请求" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="HTTPSampler.domain"></stringProp> <stringProp name="HTTPSampler.port"></stringProp> <stringProp name="HTTPSampler.protocol"></stringProp> <stringProp name="HTTPSampler.contentEncoding"></stringProp> <stringProp name="HTTPSampler.path">http://www.baidu.com?wd=${word}</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> <stringProp name="HTTPSampler.connect_timeout"></stringProp> <stringProp name="HTTPSampler.response_timeout"></stringProp> </HTTPSamplerProxy> <hashTree/> </hashTree> <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="察看结果树" enabled="true"> <boolProp name="ResultCollector.error_logging">false</boolProp> <objProp> <name>saveConfig</name> <value class="SampleSaveConfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadName>true</threadName> <dataType>true</dataType> <encoding>false</encoding> <assertions>true</assertions> <subresults>true</subresults> <responseData>false</responseData> <samplerData>false</samplerData> <xml>true</xml> <fieldNames>true</fieldNames> <responseHeaders>false</responseHeaders> <requestHeaders>false</requestHeaders> <responseDataOnError>false</responseDataOnError> <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage> <assertionsResultsToSave>0</assertionsResultsToSave> <bytes>true</bytes> <sentBytes>true</sentBytes> <url>true</url> <threadCounts>true</threadCounts> <idleTime>true</idleTime> <connectTime>true</connectTime> </value> </objProp> <stringProp name="filename"></stringProp> </ResultCollector> <hashTree/> </hashTree> </hashTree> </hashTree> </jmeterTestPlan>
-jmeter synchronizing timer 同步定时器 / 集合点 / 并发 / 抢购 / 秒杀
- dos命令如何调用执行 jmeter任务
dos命令如何调用执行 jmeter任务
可以通过jmeter.bat文件来在命令行中执行JMeter测试计划。以下是使用dos命令调用执行jmeter任务的步骤:
首先,打开一个命令提示符窗口(CMD)。
将当前目录切换到JMeter的bin目录下,可以通过输入以下命令实现:
cd C:\jmeter\apache-jmeter-5.4.1\bin
这里的路径需要根据实际情况进行调整。
然后,输入以下命令执行JMeter测试计划:
jmeter -n -t [测试计划文件名称.jmx] -l [测试结果文件名称.jtl] -e -o [测试报告文件夹名称]
其中:
-n :表示JMeter以非GUI模式执行。
-t :指定要执行的测试计划文件名(包括扩展名.jmx)。
-l :指定JMeter执行后生成的测试结果文件的名称(包括扩展名.jtl)。
-e :表示在测试完成后生成HTML格式的测试报告。
-o :指定JMeter生成的HTML测试报告存放的路径。
例如,要执行名称为test_plan.jmx的测试计划文件,并将结果保存为result.jtl,同时生成HTML测试报告并保存到report文件夹中,可以输入如下命令:
jmeter -n -t test_plan.jmx -l result.jtl -e -o report
执行命令后,JMeter将按照指定的测试计划文件进行测试,并生成测试结果和HTML测试报告。
注意:在执行上述命令之前,需要确保JMeter已经安装并配置好了测试计划和相关设置。
另外,在非GUI模式下执行测试计划时,无法使用JMeter界面进行观察和修改测试计划,因此需要事先对测试计划进行预处理和设置,以确保测试计划可以被正确地执行。
同时,还需要注意以下几点:
在执行测试计划前,确保已经启动了被测应用程序或系统,并且测试环境和参数是准确的。
执行JMeter测试计划时,可能会占用较多的系统资源和网络带宽,请确保测试过程不会影响正在运行的系统和服务。
在执行测试计划时,一定要仔细检查和分析测试结果和测试报告,及时排查系统性能和安全方面的问题,并进行必要的优化和修复。
因此,使用dos命令行调用执行JMeter任务需要熟悉JMeter测试计划的设计和配置,了解相关的testing、debug和优化等知识,才能更加准确、高效地完成测试任务。
- jmeter remote fenbushi 分布式部署调度压力机 windows版
要在Windows上进行JMeter分布式部署,你需要按照以下步骤进行操作: 1. 下载JMeter:首先,你需要从Apache JMeter官方网站(https://jmeter.apache.org/)下载JMeter的二进制文件。选择与你的操作系统兼容的版本,下载并解压缩到你的计算机上。 2. 配置主控机:选择一台作为主控机的计算机。在主控机上,打开JMeter文件夹,找到并运行bin文件夹中的jmeter.bat(Windows批处理文件)。 3. 创建测试计划:在JMeter的GUI界面中,创建你的测试计划。添加线程组、Sampler和其他必要的元素来模拟负载和执行测试。 4. 配置主控机:在主控机上,打开jmeter.properties文件。该文件位于bin文件夹中,用文本编辑器打开。找到以下属性并进行相应设置: ``` remote_hosts=IP1,IP2,... ``` 将IP1、IP2等替换为你要作为远程主机的IP地址。将多个IP地址用逗号分隔。 ``` server.rmi.ssl.disable=true ``` 将此属性设置为true以禁用SSL。 ``` client.rmi.localport=xxxx ``` 将xxxx替换为主控机上用于通信的端口号。 5. 启动远程主机:在你选择作为远程主机的计算机上,打开JMeter文件夹,找到并运行bin文件夹中的jmeter-server.bat(Windows批处理文件)。 6. 连接远程主机:回到主控机上的JMeter GUI界面,在菜单栏中选择"Run" -> "Remote Start" -> "Start"。 7. 验证连接:JMeter将尝试连接到你在第4步中配置的远程主机。在JMeter界面的左下角,你将看到远程主机的状态。如果状态显示为"Running",则表示成功连接。 8. 执行测试:现在你可以在主控机上执行你的测试计划。主控机将控制远程主机执行测试,并收集和汇总结果。 这些是在Windows上进行JMeter分布式部署的基本步骤。确保所有主机都能够相互通信,并且防火墙或安全策略没有阻止必要的端口通信。
主力控制机器配置
C:\apache-jmeter-5.5\bin\jmeter.properties
远程被调度机配置
G:\soft\winsoft\apache-jmeter-5.5\bin\jmeter.properties , 345行左右,设置为true,修改允许rmi远程通信
# Set this if you don't want to use SSL for RMI server.rmi.ssl.disable=true
远程被调度机启动 , G:\soft\winsoft\apache-jmeter-5.5\bin\jmeter-server.bat
- jmeter remote fenbushi 分布式部署调度压力机 linux版
https://www.cnblogs.com/dayu2019/p/14379039.html
- 作业:模拟5个用户并发,控制服务器QPS为20,运行时长设置为10分钟
-
- 英文版使用Jmeter
https://juejin.cn/post/7301242204994797619
简单地使用JMeter对一个接口进行并发测试:把鼠标放在Test Plan上,右键,Add -> Threads(Users)-> Thread Group,每一个线程模拟一个用户。
将图中Number of Threads的位置改为1000,表示模拟1000个用户并发请求。
在新创建的用户组上右键 -> Add -> Sampler -> HTTP Request,设置要测试的HTTP请求。
添加想要测试的HTTP信息,添加完之后点击保存按钮进行保存,然后点击运行按钮运行测试:
在创建的线程组上右键 -> Add -> Listener -> Aggregate Report,添加一个监听器,这里选择的是查看统计结果。
上面的测试结果中可以看出错误率是百分百,根据日志结果发现是路径这里不小心多增加了一个空格,把空格去掉就可以了。
[GIN] 2023/11/13 - 20:18:10 | 404 | 10.212µs | 127.0.0.1 | POST "/inventory/sale "
在创建的线程组上右键 -> Add -> Listener -> View Results Tree,添加一个监听器,这里选择查看结果树,就能在测试接口报错的时候查看具体的错误信息。
勾选上Errors选项之后,就只会展示请求错误时的详细信息:
- jmeter 分析dns耗时
JMeter本身对DNS(Domain Name System)耗时的分析相对有限,但你可以使用JMeter的一些功能来粗略地估算DNS解析的时间。DNS解析的时间通常包括了DNS查询、建立连接等步骤。
以下是一种使用JMeter来估算DNS耗时的方法:
1. **在Thread Group中设置DNS缓存**:
在JMeter的线程组(Thread Group)中,你可以使用以下的Java代码片段来启用DNS缓存:
import java.net.InetAddress; InetAddress addr; try { addr = InetAddress.getByName("example.com"); } catch (Exception e) { e.printStackTrace(); }
将这个代码片段放在一个JSR223 Sampler中,并选择合适的语言(比如Groovy)。这样,第一次执行时会进行DNS解析,而后的请求会使用缓存的DNS记录,这样你就能够获取第一次DNS解析的时间。
2. **使用JMeter定时器**:
在你的测试计划中,使用定时器来模拟真实的用户行为。设置合适的延迟以模拟用户在DNS解析完成后执行下一步操作的时间。
3. **查看结果**:
在查看结果时,你可以使用JMeter的聚合报告、图形结果、查看结果树等监听器来查看每个请求的响应时间。你可以注意到DNS解析的时间通常包括在第一个请求的响应时间内。
虽然JMeter提供了这些方法来估算DNS解析的时间,但对于更详细的DNS分析,你可能需要使用专门的工具,比如Wireshark或dnsmasq等。这些工具可以提供更详细和准确的DNS解析信息。
- jmeter 测试mail 范例
在JMeter中测试邮件服务可以使用SMTP(Simple Mail Transfer Protocol)来模拟发送邮件的场景。以下是一个简单的JMeter测试计划,演示如何使用SMTP Sampler测试邮件服务:
步骤:
-
创建JMeter测试计划:
打开JMeter,创建一个新的测试计划。
-
添加线程组:
在测试计划中,添加一个线程组。右键点击测试计划 -> 添加 -> Threads (Users) -> Thread Group。
-
添加SMTP Sampler:
- 在线程组下添加SMTP Sampler。右键点击线程组 -> 添加 -> Sampler -> SMTP Sampler。
- 在SMTP Sampler中,配置以下属性:
- Server Name or IP: 邮件服务器的主机名或IP地址。
- Server Port: 邮件服务器的端口号(通常是25)。
- From: 发件人的邮箱地址。
- To: 收件人的邮箱地址。
- Subject: 邮件主题。
- Message Data: 邮件正文内容。
- Attach files: 附件路径,如果有附件。
- 其他SMTP配置项,根据你的需求填写。
-
添加监听器:
在线程组下添加一个监听器,例如查看结果树(View Results Tree)或汇总报告(Summary Report)。
-
运行测试:
保存测试计划并运行。JMeter将模拟发送邮件的请求,并通过监听器显示响应。
请注意:
- SMTP Sampler默认使用JavaMail API发送邮件。确保你的JMeter环境中包含了JavaMail库。你可以在 JMeter 的
lib
目录中找到mail.jar
和activation.jar
,这两个库文件是用于SMTP请求的。 - 邮件服务器的配置应该与你的实际邮件服务器配置相匹配。
- 在真实环境中,要注意不要滥用邮件服务器以避免被认为是垃圾邮件。最好使用测试或开发环境的邮件服务器进行测试。
这只是一个简单的演示,实际中你可能需要更详细的配置,包括身份验证、SSL/TLS设置等,具体根据你的邮件服务器而定。
- 使用 JMeter 进行 Dubbo 性能测试
https://juejin.cn/post/6844903952962551815
https://juejin.cn/post/6844904100581081102
https://github.com/thubbo/jmeter-plugins-for-apache-dubbo
1、安装jmeter dubbo 插件
https://github.com/thubbo/jmeter-plugins-for-apache-dubbo下载 jmeter-plugins-dubbo-2.7.3-jar-with-dependencies.jar 放入{JMETER_HOME}\lib\ext
(安装完之后重启jmeter)
2、写JMeter 脚本
1、创建Dubbo Sample , 在 【测试计划】 区域右键单击 【线程组】,并选择 【添加】 > 【取样器】 > Dubbo Sample
在 Dubbo Sample 对话框中配置注册中心地址、服务接口名(Java interface 类名)、方法名、参数类型和参数值等信息。
配置步骤如下:
-
配置注册中心,通常使用 ZooKeeper。(配置完成之后,点击上面
Get Provider List
按钮获取注册的服务列表)- 若 Protocol 选择为
zookeeper
,则 Address 填写 ZooKeeper 地址。 - 若生产环境通常包含多个 ZooKeeper 节点,可填写多个 ZooKeeper 地址并用英文逗号(,)隔开。
- 若针对单台服务器进行测试,则将 Protocol 选择
none
,Address 填写 Dubbo 服务地址。
- 若 Protocol 选择为
-
按需调整服务调用配置,如分组 Group、版本 Version、调用超时时间 Timeout(默认为 1 秒)等。
-
配置 Dubbo 服务的完整 Java 接口类名和方法名。
-
配置每个参数的参数类型和参数值。
- 参数类型:基本类型(如 boolean, int 等)直接写类型名,其他类型写完整 Java 类名(注意哦,是完整类名)。
- 参数值:基本类型和字符串直接写参数值,复杂类型用 JSON 表示填写。

3、测试执行
在**【线程组】上右击,点击【验证】**,执行单次请求,来测试工具与服务的联通性。
在**【察看结果树】选项卡中可以看到【响应数据】**返回如预期,说明可以正常执行 Dubbo 调用了。



解决方法:
针对此类问题,可以添加断言来检查服务是否成功。泛化调用的结果以 JSON 形式返回,可以添加断言检查返回的 JSON 数据,以更准确的校验服务执行是否成功。
具体步骤就是,在 jmeter的 【测试计划】 区域右键单击 Dubbo Sample,并选择 【添加】 > 【断言】 > 【JSR233 Assertion】。

String respStr = null; Map<String, Object> resp = null; try { respStr = SampleResult.getResponseDataAsString(); resp = (Map<String, Object>) com.alibaba.fastjson.JSON.parse(respStr); } catch (Throwable ex) { // pass log.error("error", ex); }if (resp == null) { AssertionResult.setFailure(true); AssertionResult.setFailureMessage("RESPONSE IS NOT JSON: " + respStr); } else { // 简单检查: dubbo 泛化调用失败时, 返回 JSON 包含 code 和 detailMessage 字段. if (resp.get("code") != null && resp.get("detailMessage")) { AssertionResult.setFailure(true); AssertionResult.setFailureMessage("rpc exception, code=" + resp.get("code") + " detailMessage=" + resp.get("detailMessage")); } else if(!"SUCCESS".equals((String)resp.get("code"))) { AssertionResult.setFailure(true); AssertionResult.setFailureMessage("请求失败, code=" + resp.get("code")); } else { AssertionResult.setFailure(false); } }


- jmeter 如何测试https
在JMeter中测试HTTPS(SSL/TLS)网站时,通常需要处理证书的问题。以下是在JMeter中测试HTTPS时的一般步骤:
在JMeter中测试HTTPS(SSL/TLS)网站时,通常需要处理证书的问题。以下是在JMeter中测试HTTPS时的一般步骤:
1. **添加证书到 JMeter 的信任存储:**
- 获取目标网站的 SSL 证书。你可以使用浏览器导出证书,得到一个 `.cer` 或 `.crt` 文件。
- 将证书文件复制到 JMeter 安装目录下的 `bin` 目录。
- 打开 JMeter,进入 `bin` 目录,运行以下命令导入证书到 JMeter 的信任存储:
keytool -import -alias your_alias -keystore ../lib/security/cacerts -file your_certificate_file.cer
请将 `your_alias` 替换为你为证书指定的别名,`your_certificate_file.cer` 替换为证书文件的实际名称。
2. **配置 JMeter 中的 HTTP 请求:**
- 在 JMeter 中创建一个线程组。
- 添加一个 HTTP 请求,默认协议选择 `https`。
- 在请求中输入目标网站的 URL。
3. **配置 SSL Manager:**
- 添加一个 SSL Manager 元件。在测试计划中右键点击 -> 添加 -> Config Element -> SSL Manager。
- 在 SSL Manager 中设置别名(即你在导入证书时使用的别名)。
4. **运行测试计划:**
- 确保你的测试计划中包含了所有必要的元件,如线程组、HTTP请求和SSL Manager。
- 运行你的测试计划。
5. **处理可能的证书问题:**
- 如果服务器使用的是自签名证书,可能需要添加额外的配置。
- 在 HTTP请求的高级选项中,可以尝试勾选 "Use Keep-Alive" 和 "Follow Redirects"。
请注意,上述步骤可能需要根据具体情况进行调整,特别是在处理自签名证书或其他非标准证书时。在一些情况下,你可能还需要配置 JMeter 的 `system.properties` 文件以强制 JMeter 使用特定的 SSL 版本,这取决于你的目标服务器的配置。
- jmeter 多线程压测 / 4000 并发
- 性能测试多线程压测模型
- 性能测试3大核心指标详解
- 性能压测之Jmeter集群
- 高级性能提升的13个阶段
直播入口:https://xvduz.xetslk.com/sl/4fsxlj
- jmeter 压测restful接口范例
end
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
2021-04-14 network / shuangwangka / inner + outer
2021-04-14 performance python httprunner