一、使用 Jmeter GUI 进行测试配置

我们在使用Jmeter做性能测试时,通常需要使用 GUI 来配置脚本,生成 jmx 文件,然后使用命令来执行。脚本的配置通常需要有以下几个步骤:

测试计划 → 线程组 → 循环控制器 → Java请求 → 结果统计

Jmeter执行流程分析

通过以上配置生成 jmx 文件后,再使用命令行执行,生成结果文件,如:jmeter -n -t testscript\test.jmx -l testresult\01-reslut.jtl

二、运行机制 && 源码分析

Jmeter执行流程分析

  • 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);
            }
        }
    }
NewDriver类的main方法

相关文章: