一、使用 Jmeter GUI 进行测试配置
我们在使用Jmeter做性能测试时,通常需要使用 GUI 来配置脚本,生成 jmx 文件,然后使用命令来执行。脚本的配置通常需要有以下几个步骤:
测试计划 → 线程组 → 循环控制器 → Java请求 → 结果统计
通过以上配置生成 jmx 文件后,再使用命令行执行,生成结果文件,如:jmeter -n -t testscript\test.jmx -l testresult\01-reslut.jtl
二、运行机制 && 源码分析
- NewDriver 是 Jmeter 程序的入口类,通过反射调用 JMeter 类的 start() 方法;
- JMeter 类的 start() 方法根据不同的命令来执行不同的启动方法,startGui() 和 startNonGui();
- startNonGui() 方法又调用了 runNonGui() 方法来执行脚本;
- HashTree 是 JMeter 执行测试依赖的数据结构,在执行测试之前进行配置测试数据,HashTree将数据组织到一个递归树结构中,并提供了操作该结构的方法;
- StandardJMeterEngine 执行JMeter 测试 ,直接用于本地 GUI 和非 GUI 调用,或者在服务器模式下运行时由 RemoteJMeterEngineImpl 启动;
- JMeterEngine 接口被运行 JMeter的测试类实现,此接口共8个方法,JMeterEngine本质就是一个线程;
源码分析
/** * The main program which actually runs JMeter. * mian方法 * @param args * the command line arguments */ public static void main(String[] args) { if(!EXCEPTIONS_IN_INIT.isEmpty()) { System.err.println("Configuration error during init, see exceptions:"+exceptionsToString(EXCEPTIONS_IN_INIT)); } else { Thread.currentThread().setContextClassLoader(loader); setLoggingProperties(args); try { // 加载JMeter类 Class<?> initialClass = loader.loadClass("org.apache.jmeter.JMeter"); // 获取JMeter类实例 Object instance = initialClass.getDeclaredConstructor().newInstance(); // 获取start方法类型实例 Method startup = initialClass.getMethod("start", new Class[] { new String[0].getClass() }); // 反射调用JMeter类的start方法 startup.invoke(instance, new Object[] { args }); } catch(Throwable e){ // NOSONAR We want to log home directory in case of exception e.printStackTrace(); // NOSONAR No logger at this step System.err.println("JMeter home directory was detected as: "+JMETER_INSTALLATION_DIRECTORY); } } }