TestElement是所有组件的最基本单元,组件类都是TestElement类的子类
SampleResult中的所有方法都可以通过prev.来调用 ,prev映射org.apache.jmeter.samplers的SampleResult类
SampleListener接口sampleOccurred方法 写入测试结果
instance.populateCommandMap(); //这个方法会去寻找<project>/lib/ext 下所有的jar
NewDriver类入口反射调用start方法
JMeter解析命令行参数
CLArgsParser返回参数信息
JMeter加载配置文件
start Gui/ start NonGui执行
解析JMX文件成hashtree HashTree tree = SaveService.loadTree(f);加载 HashTree clonedTree = convertSubTree(tree, true);解析
JMeter实例化一个StandardJMeterEngine然后调用接口方法执行测试 JMeterEngine engine = new StandardJMeterEngine();
JMeter监听并调用接口方法启停测试
NewDriver类main方法中反射调用JMeter类的start方法----->JMeter类start方法解析命令行参数(-n,-t,-r等),加载配置文件(.properties),解析JMX文件成hashtree,
实例化一个StandardJMeterEngine然后调用接口方法执行测试,监听并调用接口方法启停测试--->JmeterEngine具体执行
整体再来梳理下JMeter类逻辑,抛开 GUI 和 Remote test相关的代码,简单说,JMeter 做的事情主要有:
解析命令行参数,加载配置文件;
将 .Jmx 文件解析成 HashTree;
实例化一个StandardJMeterEngine,并把测试的工作交给JMeterEngine;
JMeter类还有其他重要的职责,比如监听所有的 JMeterEngine ,当接收到 GUI 的 StopTestNow / Shutdown 等命令时候来调用JMeterEngine接口相应的方法。
JmeterEngine依赖于Jmx文件解析而来的HashTree,每一个Jmeter测试计划都对应一个Jmx文件,
所以只要能合理的动用测试组件并组装起来,按规则生成Jmx文件,就可以通过JmeterEngine压测
引擎去执行测试任务而不用依赖Jmeter工具本身,这也是调用发压引擎隐式开展发压操作的新方向。
JmeterEngine定义了引擎的操作方法,包括配置HashTree,执行测试,停止测试,设置属性和引擎状态识别等,
================
在 jmeter 启动过程中涉及到如下的重要类:
NewDriver-----------------功能:jmeter 入口类,该类通过自定义类加载器加载 jmeter 的各 jar 包和库,并通过自定义类加载器加载 JMeter 类
JMeter----------------------功能:jmeter 参数解析、过程处理、压测启动类
CLArgsParser------------功能:jmeter 参数解析类,可仿照已有参数新增自定义参数
JMeterUtils----------------功能:jmeter 工具类,该类用来加载 properties 文件、设定全局变量等;
FileServer-----------------功能:jmeter 通过该类以线程安全的方式访问文件
HashTree------------------功能:jmeter 性能测试脚本解析生成的树结构,该类有个表兄弟 ListedHashTree 同样很重要
Summariser---------------功能:监听器,用来搜集所有的 SampleResult,在命令行中执行时默认 30 秒打印的指标数据,即该类的杰作 SampleListener.sampleOccurred(SampleEvent e)
ResultCollector-----------功能:搜集所有 SampleResult 并输出到 jtl 文件中
JMeterEngine-------------功能:jmeter 引擎接口,无论单机、分布式引擎对象,均是该接口的实现
DistributedRunner-------功能:分布式执行时,初始化 slave、启动、停止各 slave
maven-compiler-plugin插件可以指定项目源码的jdk版本,编译后的jdk版本,以及编码
使用<testFilesIncluded>指定运行的脚本文件
propertiesUser定义用户变量,脚本中利用${__P(配置名)}读取此处的配置
新建取样器 继承AbstractSampler
新建函数助手方法 继承AbstractFunction
Jmeter插件的入口是继承AbstractPostProcessorGui类
BeanShell Sampler 运行时依靠bsh.Interpreter解释器
聚合报告中的每一列信息,是由SamplingStatCalculator类的不同方法实现统计的,(相同名称的请求会共用同一个SamplingStatCalculator)
聚合报告,最终的底层都是调用StatGraphVisualizer类的add(sampleResult)方法来生成表格的一行数据,传递的参数为每个请求的请求结果(sampleResult)信息。
<testFilesDirectory>标签指定jmx存放的文件夹 默认是${project.base.directory}/src/test/jmeter
-----------------------------------------------------------------------------------------------------
<plugin>
<groupId>com.lazerycode.jmeter</groupId>
<artifactId>jmeter-maven-plugin</artifactId>
<version>1.9.0</version>
<executions>
<execution>
<id>jmeter-tests</id>
<phase>verify</phase>
<goals>
<goal>jmeter</goal>
</goals>
<configuration>
<testFilesDirectory>/scratch/testfiles/</testFilesDirectory>
</configuration>
</execution>
</executions>
</plugin>
-----------------------------------------------------------------------------------------------------
vars是对变量进行读写操作,而props主要是对属性进行读写操作。
vars只能在当前线程组内使用,props可以跨线程组使用。
vars只能保存String或者Object,props可以是Hashtable或者Object。
在<remoteConfig>下添加参数,用来与jenkins配合参数化jmeter远程发压机的ip:
<remoteConfig>
<startServersBeforeTests>true</startServersBeforeTests>
<serverList>${remote_hosts_list}</serverList>
</remoteConfig>
二次开发 转https://mp.weixin.qq.com/s/w_lodzuQdlFK0ElcTK7nAQ