目录

1.代码解析:

2.使用方法:

(1)添加BeanShell取样器

(2)配置BeanShell取样器

(3)添加事务控制器

(4)配置事务控制器

(5)添加HTTP请求、聚合报告、查看结果树等

3.补充方法:

(1)复制上述附件中的阶梯式压测配置

(2)配置Stepping Thread Group

(3)复制上述附件中Beanshell取样器的脚本

(4)开始测试


1.代码解析:

import org.apache.jmeter.threads.JMeterContextService;int num = JMeterContextService.getNumberOfThreads();    //获取当前活动线程数
int total = JMeterContextService.getTotalThreads();     //获取设置的线程总数量//---------------------设置参数--------------------------
int step = 10; //每次增添线程数
int start = 20; //起始时的线程数
//------------------------------------------------------int Multiple = (num-start)/step;    //设置的总线程数是步数的多少倍
int rem = (num-start)%step; //取余数运算//---------------------开始计算--------------------------
/**
*1.thread——参数,事务控制器(Transaction Controller)名称需要引用 ${thread}
*
*这里主要对当前正在运行的线程数进行统计,将其结果记录到对应的阶段;
*例如,设置10个线程为一步,当前正在运行线程数量为25,则其结果放置在 “线程数30” 个层级下
*/
if(Multiple==0 && num <= start){vars.put("thread","线程数"+start);}
else if(num>start && num<=(total-start)/step*step+start){if(rem==0){vars.put("thread","线程数"+(Multiple*step+start));}else{vars.put("thread","线程数"+((Multiple+1)*step+start));}}
else if(num>((total-start)/step)*step+start){vars.put("thread","线程数"+total);}/**
*当前存在的主要问题:
*    1.需要手动设置每次增加的线程数;
*    2.需要手动设置起始的线程数;
*    3.起始数量不为0时,聚合报告第一行标签为 ${thread} 需要优化
*/

2.使用方法:

整体结果:

(1)添加BeanShell取样器

(2)配置BeanShell取样器

(3)添加事务控制器

(4)配置事务控制器

(5)添加HTTP请求、聚合报告、查看结果树等

注意:一定要右键事务控制器 ${thread} 添加

3.补充方法:

由于不能上传附件,只能粘贴.jmx文件内容

jmx文件:

<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.2.1"><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="User Defined Variables" enabled="true"><collectionProp name="Arguments.arguments"/></elementProp><stringProp name="TestPlan.user_define_classpath"></stringProp></TestPlan><hashTree><Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true"><collectionProp name="Arguments.arguments"><elementProp name="ip" elementType="Argument"><stringProp name="Argument.name">ip</stringProp><stringProp name="Argument.value">mineservice.minedata.cn</stringProp><stringProp name="Argument.metadata">=</stringProp></elementProp><elementProp name="key" elementType="Argument"><stringProp name="Argument.name">key</stringProp><stringProp name="Argument.value">55a8282ab563422db1f6b0ca0bb0a57a</stringProp><stringProp name="Argument.metadata">=</stringProp></elementProp><elementProp name="port" elementType="Argument"><stringProp name="Argument.name">port</stringProp><stringProp name="Argument.value">443</stringProp><stringProp name="Argument.metadata">=</stringProp></elementProp><elementProp name="test" elementType="Argument"><stringProp name="Argument.name">test</stringProp><stringProp name="Argument.value">30</stringProp><stringProp name="Argument.metadata">=</stringProp></elementProp></collectionProp><stringProp name="TestPlan.comments">192.168.5.174</stringProp></Arguments><hashTree/><Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="阶梯式压测配置" enabled="true"><collectionProp name="Arguments.arguments"><elementProp name="TotalThreads" elementType="Argument"><stringProp name="Argument.name">TotalThreads</stringProp><stringProp name="Argument.value">100</stringProp><stringProp name="Argument.metadata">=</stringProp><stringProp name="Argument.desc">这个组将会启动的总线程数(必选)</stringProp></elementProp><elementProp name="FirstWaitTime" elementType="Argument"><stringProp name="Argument.name">FirstWaitTime</stringProp><stringProp name="Argument.value">0</stringProp><stringProp name="Argument.metadata">=</stringProp><stringProp name="Argument.desc">从零开始达到起始线程数所用的时间,单位:s(非必选,默认为0)</stringProp></elementProp><elementProp name="StartThreads" elementType="Argument"><stringProp name="Argument.name">StartThreads</stringProp><stringProp name="Argument.value">0</stringProp><stringProp name="Argument.desc">起始线程数(非必选,默认为0)</stringProp><stringProp name="Argument.metadata">=</stringProp></elementProp><elementProp name="AddThreads" elementType="Argument"><stringProp name="Argument.name">AddThreads</stringProp><stringProp name="Argument.value">10</stringProp><stringProp name="Argument.desc">每步增加线程数(必选)</stringProp><stringProp name="Argument.metadata">=</stringProp></elementProp><elementProp name="AddInterval" elementType="Argument"><stringProp name="Argument.name">AddInterval</stringProp><stringProp name="Argument.value">5</stringProp><stringProp name="Argument.desc">每一步的持续时间(必选)</stringProp><stringProp name="Argument.metadata">=</stringProp></elementProp><elementProp name="RampUpTime" elementType="Argument"><stringProp name="Argument.name">RampUpTime</stringProp><stringProp name="Argument.value">1</stringProp><stringProp name="Argument.desc">启动AddThreads线程所用时间,单位:s(非必选,默认为0)</stringProp><stringProp name="Argument.metadata">=</stringProp></elementProp><elementProp name="HoldTime" elementType="Argument"><stringProp name="Argument.name">HoldTime</stringProp><stringProp name="Argument.value">10</stringProp><stringProp name="Argument.desc">最后一步持续运行时间,单位:s(必选,一般和AddThreads一致)</stringProp><stringProp name="Argument.metadata">=</stringProp></elementProp><elementProp name="StopThreads" elementType="Argument"><stringProp name="Argument.name">StopThreads</stringProp><stringProp name="Argument.value">0</stringProp><stringProp name="Argument.desc">结束后每步停止线程数量(非必选)</stringProp><stringProp name="Argument.metadata">=</stringProp></elementProp><elementProp name="StopInterval" elementType="Argument"><stringProp name="Argument.name">StopInterval</stringProp><stringProp name="Argument.value">0</stringProp><stringProp name="Argument.desc">停止线程每步间隔时间,单位:s(非必选)</stringProp><stringProp name="Argument.metadata">=</stringProp></elementProp></collectionProp></Arguments><hashTree/><kg.apc.jmeter.threads.SteppingThreadGroup guiclass="kg.apc.jmeter.threads.SteppingThreadGroupGui" testclass="kg.apc.jmeter.threads.SteppingThreadGroup" testname="地理编码测试" enabled="true"><stringProp name="ThreadGroup.on_sample_error">continue</stringProp><stringProp name="ThreadGroup.num_threads">${TotalThreads}</stringProp><stringProp name="Threads initial delay">${FirstWaitTime}</stringProp><stringProp name="Start users count">${AddThreads}</stringProp><stringProp name="Start users count burst">${StartThreads}</stringProp><stringProp name="Start users period">${AddInterval}</stringProp><stringProp name="Stop users count">${StopThreads}</stringProp><stringProp name="Stop users period">${StopInterval}</stringProp><stringProp name="flighttime">${HoldTime}</stringProp><stringProp name="rampUp">${RampUpTime}</stringProp><elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="循环控制器" enabled="true"><boolProp name="LoopController.continue_forever">false</boolProp><intProp name="LoopController.loops">-1</intProp></elementProp></kg.apc.jmeter.threads.SteppingThreadGroup><hashTree><BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="BeanShell 取样器" enabled="true"><stringProp name="BeanShellSampler.query">import org.apache.jmeter.threads.JMeterContextService;int num = JMeterContextService.getNumberOfThreads();    //获取当前活动线程数
int total = JMeterContextService.getTotalThreads();     //获取设置的线程总数量//---------------------设置参数--------------------------
int step = ${AddThreads}; //每次增添线程数
int start = ${StartThreads}; //起始时的线程数
//log.info(&quot;ttttttt&quot;+${StartThreads});
//------------------------------------------------------int Multiple = (num-start)/step;    //设置的总线程数是步数的多少倍
int rem = (num-start)%step; //取余数运算//---------------------开始计算--------------------------
/**
*1.thread——参数,事务控制器(Transaction Controller)名称需要引用 ${thread}
*
*这里主要对当前正在运行的线程数进行统计,将其结果记录到对应的阶段;
*例如,设置10个线程为一步,当前正在运行线程数量为25,则其结果放置在 “线程数30” 个层级下
*/
if(Multiple==0 &amp;&amp; num &lt;= start){vars.put(&quot;thread&quot;,&quot;线程数&quot;+start);}
else if(num&gt;start &amp;&amp; num&lt;=(total-start)/step*step+start){if(rem==0){vars.put(&quot;thread&quot;,&quot;线程数&quot;+(Multiple*step+start));}else{vars.put(&quot;thread&quot;,&quot;线程数&quot;+((Multiple+1)*step+start));}}
else if(num&gt;((total-start)/step)*step+start){vars.put(&quot;thread&quot;,&quot;线程数&quot;+total);}/**
*当前存在的主要问题:
*    1.需要手动设置每次增加的线程数;
*    2.需要手动设置起始的线程数;
*    3.起始数量不为0时,聚合报告第一行标签为 ${thread} 需要优化
*/</stringProp><stringProp name="BeanShellSampler.filename"></stringProp><stringProp name="BeanShellSampler.parameters"></stringProp><boolProp name="BeanShellSampler.resetInterpreter">false</boolProp></BeanShellSampler><hashTree/><TransactionController guiclass="TransactionControllerGui" testclass="TransactionController" testname="${thread}" enabled="true"><boolProp name="TransactionController.includeTimers">false</boolProp><boolProp name="TransactionController.parent">true</boolProp></TransactionController><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 name="address" elementType="HTTPArgument"><boolProp name="HTTPArgument.always_encode">true</boolProp><stringProp name="Argument.value">北京市海淀区永旭南路四维图新大厦</stringProp><stringProp name="Argument.metadata">=</stringProp><boolProp name="HTTPArgument.use_equals">true</boolProp><stringProp name="Argument.name">address</stringProp></elementProp><elementProp name="city" elementType="HTTPArgument"><boolProp name="HTTPArgument.always_encode">true</boolProp><stringProp name="Argument.value">北京</stringProp><stringProp name="Argument.metadata">=</stringProp><boolProp name="HTTPArgument.use_equals">true</boolProp><stringProp name="Argument.name">city</stringProp></elementProp><elementProp name="appKey" elementType="HTTPArgument"><boolProp name="HTTPArgument.always_encode">true</boolProp><stringProp name="Argument.value">${key}</stringProp><stringProp name="Argument.metadata">=</stringProp><boolProp name="HTTPArgument.use_equals">true</boolProp><stringProp name="Argument.name">appKey</stringProp></elementProp></collectionProp></elementProp><stringProp name="HTTPSampler.domain">${ip}</stringProp><stringProp name="HTTPSampler.port">${port}</stringProp><stringProp name="HTTPSampler.protocol">https</stringProp><stringProp name="HTTPSampler.contentEncoding">utf-8</stringProp><stringProp name="HTTPSampler.path">/service/lbs/search/v1/geo</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/><ResultCollector guiclass="StatVisualizer" 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>false</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/><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>false</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></hashTree>
</jmeterTestPlan>

(1)复制上述附件中的阶梯式压测配置

修改如下四个参数值;

(2)配置Stepping Thread Group

(3)复制上述附件中Beanshell取样器的脚本

(4)开始测试

jmeter二次开发——阶梯式/分步式压测聚合报告定制化显示相关推荐

  1. Jmeter阶梯压测聚合报告分阶梯汇总显示

    需求分析 1.在使用阶梯线程进行阶梯递增性能压测过程中,由于聚合报告生成的结果是一个汇总的结果,不会分阶梯模式汇总压测结果,这样导致不能根据生成的聚合报告对比不同阶梯模式下,tps.响应实际.erro ...

  2. 测试开发必备技能-Jmeter二次开发

    为什么需要做二次开发?JMeter作为一款开源的性能.接口测试工具,有时候无法满足我们工作的需要,一般体现在:协议不支持.没有相应数据处理功能等. 一般这种情况下,我们可以做的选择有: 第一种找插件 ...

  3. Jmeter二次开发准备-Jmeter插件开发

    Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,因为对java的良好支持,我们可以对其进行做二次的开发. Jmeter二次开发可以直接下载其源码,然 ...

  4. 基于EasyNVR二次开发实现自己的摄像机IPC/NVR无插件化直播解决方案

    基于EasyNVR二次开发实现自己的摄像机IPC/NVR无插件化直播解决方案 参考文章: (1)基于EasyNVR二次开发实现自己的摄像机IPC/NVR无插件化直播解决方案 (2)https://ww ...

  5. JMeter二次开发(1)-eclipse环境配置及源码编译

    1.下载src并解压 http://jmeter.apache.org/download_jmeter.cgi 2.获取所需jar包,编译 ant download_jars ant install ...

  6. Jmeter性能测试-安装和配置、分布式压测配置及服务器性能监控

    Jmeter性能测试 (一)工具版本 (二)安装和配置 安装jdk 在D盘下新建JAVA文件夹,找到jdk文件,双击运行.点击下一步,出现如下图一内容,这里是设置安装路径,可以默认,用户可自行选择,这 ...

  7. QGIS二次开发:鼠标在地图上移动时,状态栏显示鼠标所在位置经纬度

    主要思路: 当鼠标在地图画布控件上移动时,会发送xyCoordinates信号,该信号参数是墨卡托坐标系表示的地图上的点坐标,然后将墨卡托坐标转为经纬度表示的WSG84坐标,绑定该信号到槽函数,然后发 ...

  8. 【Jmeter】分布式测试--单机均衡负载压测

    目录 前言 分布式测试前提 分布式测试流程 构建基础镜像 准备文件 Dockerfile(生成基础镜像) entrypoint.sh(容器启动运行脚本) install_plugin_manager. ...

  9. jmeter压测生成报告

    下载jmeter 然后点击bin目录下的bat文件,会自动弹出命令框 像这样加载完后,会出现jmeter的界面 支持更换中文简体 创建测试计划---------在testPlan中选择取样器--线程组 ...

最新文章

  1. HashMap为什么是线程不安全的?
  2. 仅1年GitHub Star数翻倍,Flink 做了什么?
  3. java 技术点_Java的21个技术点和知识点归纳
  4. codeforces:1361(div1)1362(div2):总结
  5. 015_ICMP专项研究监控
  6. Spring Data Jpa出现Not supported for DML operations
  7. [AaronYang]C#人爱学不学[1]
  8. bzoj 1615: [Usaco2008 Mar]The Loathesome Hay Baler麻烦的干草打包机
  9. 拓端tecdat|Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析
  10. 文档根元素 mapper 必须匹配 DOCTYPE 根 configuration
  11. NOIP2013普及组复赛 解题分析
  12. 【高德地图】------- JavaScript实现高德地图经纬度获取地址位置
  13. 3dmax快捷键命令大全
  14. Windows配置Rsync同步,安装cwRsync
  15. 关于内存地址和内存空间的理解
  16. python lime_本地可解释模型不可知的解释– LIME in Python
  17. navicat 连接oracle的配置
  18. 7-6 536 判定子串
  19. 大数据算法MOOC笔记1:大数据定义、特点、应用
  20. 毫米和像素怎么换算_图片的像素和毫米之间是怎么换算的有公式吗

热门文章

  1. 阿里AI天池大赛-天猫复购预测-基于XGBoost模型预测
  2. “能找到工作,全靠我简历造假”
  3. WMS系统数据分析—库存周转率分析
  4. 怎么玩转GIS数据查询
  5. Maven的Mirror的详细说明
  6. 240次方在线计算机,0.05的240次方是多少
  7. SAAS健身房会员管理软件
  8. 使用深度学习的PointNet直接从无人机载激光雷达数据中分割单个树冠
  9. Microsoft Platform SDK Febrary 2003下载(更新VC6的SDK)
  10. 我最近学python_我要偷偷的学Python,然后惊呆所有人(第十六天)