JMeter 源代码解读(一)
jmeter是如何启动的
1 背景
随着公司业务急剧扩展,呈现爆发式的增长,当前测试工具已经无法更好,更全面的覆盖所有的业务以及协议,不同事业部之间也存在不同的加密方式,jmeter工具已经不适用于当前业务需求。考虑到涉及到性能测试,单方面的jar包以及beanshell已经严重制约性能结果的准确率,故而在此分析jmeter的开源代码。解决当前问题,对项目定制化工具需求。
2 解读源代码目的
· 了解jmeter的结构
· 了解jmeter的启动工作原理
3 IDEA编译jmeter
3.1 jmeter源代码下载
· 下载地址: http://jmeter.apache.org/download_jmeter.cgi
下载完成后,解压zip文件。
PS:这里要注意,5.2版本后已经切换工具维护,不再是ant构建,而是采用Gradle构建,不再需要修改文件。
3.2 打开文件开源文件
看下源代码结构目录。如下:

3.2.1 顶层目录
· bin - 包含.bat 和 . sh 这些文件用于启动JMeter。同时也包含了ApacheJmeter.jar 和 相关的配置文件
· build - build 脚本创建的目录,存放一些build过程生成的文件
· dist - build 脚本创建饿目录,存放最后输出的文件
· docs - JMeter 相关目录
· extras - ant 相关的其他文件
· lib - 包含JMeter 依赖的相关文件
· src - 子目录包含支持的协议和相关组件代码
· test - 单元测试目录
· xdocs - 用于生成文档的xml文件,JMeter用xml来生成文档(主要核心思想,后期主要的代码讲解点)
3.2.2 lib目录结构
· ext - 包含 JMeter 核心和协议相关的 jar 文件。把这些 jar 文件独立出来原因是如果都放在lib/目录里启动速度会变慢
· opt - 一些可选的 jar 用于 JMeter 的一些可选的功能。这些 jar 只有在build 和 运行的时候才会被引入。用户可以自己下来可选的 jar 放到整个目录里
3.2.3 src目录结构
· Core - JMeter 核心功能和接口的代码目录,分析的重点
· components - 和协议无关的一些类,例如协议, GUI 组件等
· examples - 一些sampler的例子
· functions - 一些其他组件会使用的标准函数
· jorphan - 公共方法类
· protocol - 不同的协议支持代码
· junit - 测试相关的代码

请核对一下idea目录与下载的目录是否一致。
3.3 jmeter的主要入--NewDriver.java

上图是jemter启动的程序入口。
那么,如果启动程序要做哪些事。
3.3.1 jmeter启动之前要做环境变量检查,如下图

上图红色全中是jmeter的环境变量检查。
3.3.2 程序初始化

上图就是初始化
下图是我在代码添加了注释,方便阅读

3.3.3 初始化检查通过后,开始执行启动

上图红色圈中解释如下:
这一块涉及了 启动的判断
· jmeter.sh的启动 (这里要分操作系统,有些linux是有GUI界面的,也可以看得见,比如ubuntu,cenos 等,所以不能都认为是非GUI命令)
· jmeter.bat的启动
· jmeter.jar的启动
· jmeter非GUI命令启动
然后开始进行下一步,寻找jar目录,lib,ext等的完整性
3.3.4 主main程序
在3.3.3的步骤中,如果完整性检查通过,则进入程序的main.

这里的程序做了哪些事情呢?
这里的主main需要声明一下
· 先判断一下EXCEPTIONS_IN_INIT 是否为空,如果不为空就表示静态初始化有异常,直接退出进程并打印错误信息。
· 初始化一些基本的日志配置
· 用刚才初始化的 classloader 加载类 org.apache.jmeter.JMeter
· 通过java 反射的方式来调用 org.apache.jmeter.JMeter 的 start 方法,正式完成 JMeter 的启动
下图就是反射调用启动star

以上jmeter启动就结束了。下图是debug的截图


4 总结
1. 了解jmeter的结构,有助于我们要对它进行第二次开发应该注意细节
2. 了解jmeter的启动,阅读代码是理解jmeter工作的最好方式
原创内容,转载请说明出处。