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 Detailed Section List

-

-

复制代码
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">判断是否含有关键词:&quot;百度一下,你就知道&quot;,是则请求,HTTP请求2</stringProp>
          <stringProp name="IfController.condition">&quot;${my_title}&quot; == &quot;百度一下,你就知道&quot;</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">&quot;${name1}&quot; == &quot;百度&quot;</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">&quot;${name2}&quot; == &quot;禅道&quot;</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">&quot;${name}&quot; == &quot;百度&quot;</stringProp>
          <boolProp name="IfController.evaluateAll">false</boolProp>
        </IfController>
        <hashTree>
          <IfController guiclass="IfControllerPanel" testclass="IfController" testname="如果(If)控制器" enabled="true">
            <stringProp name="IfController.condition">&quot;${password}&quot; == &quot;123456&quot;</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,添加一个监听器,这里选择的是查看统计结果。

上面的测试结果中可以看出错误率是百分百,根据日志结果发现是路径这里不小心多增加了一个空格,把空格去掉就可以了。

 
shell
复制代码
[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测试邮件服务:

步骤:

  1. 创建JMeter测试计划

    打开JMeter,创建一个新的测试计划。

  2. 添加线程组

    在测试计划中,添加一个线程组。右键点击测试计划 -> 添加 -> Threads (Users) -> Thread Group。

  3. 添加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配置项,根据你的需求填写。
  4. 添加监听器

    在线程组下添加一个监听器,例如查看结果树(View Results Tree)或汇总报告(Summary Report)。

  5. 运行测试

    保存测试计划并运行。JMeter将模拟发送邮件的请求,并通过监听器显示响应。

请注意:

  • SMTP Sampler默认使用JavaMail API发送邮件。确保你的JMeter环境中包含了JavaMail库。你可以在 JMeter 的 lib 目录中找到 mail.jaractivation.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 选择 noneAddress 填写 Dubbo 服务地址。
  • 按需调整服务调用配置,如分组 Group、版本 Version、调用超时时间 Timeout(默认为 1 秒)等。

  • 配置 Dubbo 服务的完整 Java 接口类名和方法名。

  • 配置每个参数的参数类型和参数值。

    • 参数类型:基本类型(如 boolean, int 等)直接写类型名,其他类型写完整 Java 类名(注意哦,是完整类名)。
    • 参数值:基本类型和字符串直接写参数值,复杂类型用 JSON 表示填写

为了方便本地调试测试脚本,可以添加结构监听器,右键单击 【线程组】,选择 【添加】 > 【监听器】【察看结果树】,添加 察看结果树 监听器。

3、测试执行

在**【线程组】上右击,点击【验证】**,执行单次请求,来测试工具与服务的联通性。

在**【察看结果树】选项卡中可以看到【响应数据】**返回如预期,说明可以正常执行 Dubbo 调用了。

4、添加断言
 
- RPC 调用失败。
- 业务处理失败

解决方法:

针对此类问题,可以添加断言来检查服务是否成功。泛化调用的结果以 JSON 形式返回,可以添加断言检查返回的 JSON 数据,以更准确的校验服务执行是否成功。

具体步骤就是,在 jmeter的 【测试计划】 区域右键单击 Dubbo Sample,并选择 【添加】 > 【断言】 > 【JSR233 Assertion】

groovy 测试脚本代码
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 并发

  1. 性能测试多线程压测模型
  2. 性能测试3大核心指标详解
  3. 性能压测之Jmeter集群
  4. 高级性能提升的13个阶段

直播入口:https://xvduz.xetslk.com/sl/4fsxlj

- jmeter 压测restful接口范例

 

end

posted @   siemens800  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源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
点击右上角即可分享
微信分享提示