在开始讲 start 方法前,大家先考虑一个问题,Jmeter 启动时带不带参数有什么影响?我们可以带着这个问题往下看。
在前面两篇文章中,已经跟大家非常详细的介绍了 Jmeter 启动时会做什么,回顾一下就是:
那么这些参数是从哪来的呢?其实入口就是 NewDriver.main(String[] args) ,这个方法的参数列表可以从 Jmeter 的启动脚本获取,也可以通过执行
java -jar ApacheJMeter.jar xxx 来启动
后面的 xxx 表示的就是启动参数,跟执行以下命令效果一样
jmeter xxx
我们可以通过查看 Jmeter /bin 目录下的 jmeter 脚本来验证这个过程,以下内容是 JMeter 在 mac 下的启动脚本,其中只保留了最后几行内容,其他系统下的脚本内容也是类似,就不在此处展开解释。
这段脚本其实很简单,就是判断 JMETER_COMPLETE_ARGS 这个变量是不是为空,用来控制 ARGS 参数值,最后一行就是很普通的 java 应用启动命令,后面的 "$@" 是一个特殊变量,用于表示所有向脚本传递的位置参数(命令行参数)。具体来说,$@ 会将所有的位置参数作为一个单独的字符串列表返回。每个位置参数会被当作一个独立的字符串,在使用时可以通过遍历 $@ 获取每个参数。需要注意的是,"$@" 使用双引号括起来时,会将每个位置参数作为独立的字符串处理,保留参数中的空格和特殊字符。这样可以确保传递参数时的正确性,在处理包含空格或特殊字符的参数时非常有用。
顺便提一句,上面判断了 JMETER_COMPLETE_ARGS 是为了给 Java9 单独设置一些启动参数,因为在 Java 9 之前的版本中,可以使用标准的 JAVA_OPTS 环境变量来设置 Java 虚拟机的选项。然而,从 Java 9 开始,Oracle 官方建议使用 JAVA_TOOL_OPTIONS 环境变量来设置 Java 应用程序的选项,以便与新的模块化系统和命令行标志兼容。为了确保 JMeter 在不同版本的 Java 中都能正常运行,并且可以方便地配置 Java 9 相关的选项,此处单独处理了 Java 9 的选项设置。通过使用 JAVA9_OPTS 环境变量存储 Java 9 相关的选项,并将其与其他选项拼接到 ARGS 字符串中,以便将这些选项传递给 JMeter 启动脚本。这种单独处理 Java 9 的选项,能够更好地适应不同版本的 Java,并确保在升级或切换 Java 版本时不会影响到 JMeter 的启动脚本和选项设置。这样做的目的是为了提高 JMeter 的兼容性和可移植性。
ok,那现在我们知道了,NewDeriver.main(String[] args) 会接受命令行参数,然后 main 方法再反射调用 Jmeter.start(String[] args) 时,也会把参数传递下去,代码如图所示:
invoke 方法第二个参数 args 就是 main 方法接收到的参数,这就完成了参数从命令行传递给 Jmeter 的过程,在实例化 Jmeter 时,这些参数又被 CLOptionDescriptor 类处理了一次,从一堆字符串变成了一个对象,方便 Jmeter 更好的处理参数,那接下来我们迎来了本文章的重点:Jmeter.start(String[] args) 方法到底做了什么?
在解释代码之前,大家有没有发现一个现象:
当我们什么启动参数都不带时,Jmeter 会直接以 GUI 模式启动,我们可以写脚本调试,甚至直接开始测试,也可以不跑测试,写个脚本就把它关掉。但是当我们使用 cli 时,就可以直接传递一个 jmx 脚本给 Jmeter,这时 Jmeter 就会直接开始测试。这两种方式是如何实现的呢?
如果大家有观察过这个现象,那接下来的内容会非常容易理解,因为这涉及到了 Jmeter 的 2 种启动模式:
但是这个时候大家会疑惑,之前不是说 Jmeter 有三种启动模式么,分别是:GUI,NON-GUI, SERVER,为啥到这边又成了 2 种了?
其实,这前后并没有矛盾,因为 SERVER 和 NON-GUI 模式都是属于 NON-GUI 的方式启动,我们此处只是讨论 Jmeter 在启动时的宏观表现,即有没有图形界面。
接下来,我们就开始从代码出发,看下 Jmeter 真正的启动过程。
在进入 start 方法后,会先对命令行参数的组合进行判断,如果参数组合不支持,则生成一个 error 信息,然后判断 error 是否为 null,如果有错误信息,则停止启动,并在控制台输出错误信息。
参数校验通过之后,Jmeter 会进行运行环境初始化,虽然 NewDriver 已经初始化过一次(主要做类加载),但是 Jmeter 会做更细致的初始化动作,以下是 Jmeter 初始化内容
至此,让我们通过一张图来了解下 Jmeter 的启动过程
此时,Jmeter 算是真正的启动起来了,因为 GUI 模式启动涉及到大量关于 Java Swing 的内容,不在本文章讨论范围内,我会主要从 NON-GUI 模式来跟大家讲解 Jmeter 的运行原理,因为两种模式本质上都是通过 Jmeter 执行引擎来实现测试的。下一章开始,我们将继续深入了解使用无界面模式启动后,Jmeter 是如何开始测试的...
最后这个流程图是用什么画的