jmeter源码---核心JMeterEngine

本文详细介绍了JMeterEngine接口的功能及其实现类StandardJMeterEngine的工作原理,包括配置测试计划、执行测试、停止测试等核心方法的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

JMeterEngine接口被运行Jmeter的测试类实现,此接口共8个方法,其中无参stopTest()是调用的stopTest(boolean now),也可说是7个方法

  • void configure(HashTree testPlan);
  • void runTest() throws JMeterEngineException;
  • default void stopTest(){stopTest(true);}
  • void stopTest(boolean now);
  • void reset();
  • void setProperties(Properties p);
  • void exit();
  • boolean isActive();

介绍

configure(HashTree testPlan)

HashTree是JMeter执行测试依赖的数据结构,configure在执行测试之前进行配置测试数据。可以参考接口JMeterEngine的实现类StandardJMeterEngine

public void configure(HashTree testTree) {
    // Is testplan serialised?
    SearchByClass<TestPlan> testPlan = new SearchByClass<>(TestPlan.class);
    testTree.traverse(testPlan);
    Object[] plan = testPlan.getSearchResults().toArray();
    if (plan.length == 0) {
        throw new RuntimeException("Could not find the TestPlan class!");
    }
    TestPlan tp = (TestPlan) plan[0];
    serialized = tp.isSerialized();
    tearDownOnShutdown = tp.isTearDownOnShutdown();
    active = true;
    test = testTree;
}

从HashTree中解析出TestPlan, 获取TestPlan的serialized和tearDownOnShutdown并保存为local属性,同时把整个HashTree也保存到local。

    /** Thread Groups run sequentially */
    private volatile boolean serialized = false;

    /** tearDown Thread Groups run after shutdown of main threads */
    private volatile boolean tearDownOnShutdown = false;

StandardJMeterEngine依赖线程组ThreadGroup, 一个测试中可能会有多个线程组,如果serialized为true,则StandardJMeterEngine会串行的去执行这些线程组,每启动一个ThreadGroup主线程都会等它结束;否则就并行执行所有的线程组。
tearDownOnShutdown与PostThreadGroup配合使用的,这个Special Thread Group专门用来做清理工作

/**
 * PostThreadGroup is a special type of ThreadGroup that can be used for
 * performing actions at the end of a test for cleanup and such.
 */
public class PostThreadGroup extends ThreadGroup {
    private static final long serialVersionUID = 240L;
}

如果在HashTree配置中有PostThreadGroup,那么在主线程组(ThreadGroup)执行完之后,StandardJMeterEngine检查tearDownOnShutdown属性,若该属性值true就启动PostThreadGroup。

runTest()

调用该方法用来执行测试。参考StandardJMeterEngine的实现

public void runTest() throws JMeterEngineException {
    if (host != null) {
        long now = System.currentTimeMillis();
        System.out.println("Starting the test on host " + host + " @ " + new Date(now) + " (" + now + ")"); 
    }
    try {
        Thread runningThread = new Thread(this, "StandardJMeterEngine");
        runningThread.start();
    } catch (Exception err) {
        stopTest();
        throw new JMeterEngineException(err);
    }
}

启动一个线程并触发它的run()方法,若报异常则调用stopTest(),抛出JMeterEngineException。

stopTest(boolean now)

停止测试,若now为true则停止动作立即执行;若为false则停止动作缓刑,它会等待当前正在执行的测试至少执行完一个iteration。

public synchronized void stopTest(boolean now) {
    shutdown = !now;
    Thread stopThread = new Thread(new StopTest(now));
    stopThread.start();
}

private class StopTest implements Runnable{……}

stopTest()

public synchronized void stopTest() {
    stopTest(true);
}

reset()

重置。在StandardJMeterEngine中就是直接调用stopTest(true).

public void reset() {
    if (running) {
        stopTest();
    }
}

setProperties(Properties p)

设置属性,可以将额外的配置文件通过该方法添加进去。它会保存在JMeterUtils中,该类保存了JMeterEngine runtime所需要的所有配置参数。

public void setProperties(Properties p) {
    log.info("Applying properties " + p);
    JMeterUtils.getJMeterProperties().putAll(p);
}

exit()

是为Remote Test准备的,如果当前的测试是从一个客户端的JMeter执行远程JMeterEngine的remote samples,则应该调用该exit()方法来关闭远程的测试.被RemoteJMeterEngineImpl.rexit()调用和exitAfterTest为真时被notifyTestListenersOfEnd()调用 ;

public void exit() {
    ClientJMeterEngine.tidyRMI(log); 
    if (REMOTE_SYSTEM_EXIT) {
        log.warn("About to run System.exit(0) on " + host);
        Thread t = new Thread() {
            @Override
            public void run() {
                pause(1000); 
                log.info("Bye from " + host);
                System.out.println("Bye from " + host); 
                System.exit(0); 
            }
        };
        t.start();
    }
}

boolean isActive()

引擎是否有效的标识,在测试结束时设为false

public boolean isActive() {
    return active;
}

在confgiure()的时候设该值为true,在执行完测试(指的是该JMeterEngine所有ThreadGroup)之后设置为false。如果active==true,则说明该JMeterEngine已经配置完测试并且还没执行完,我们不能再进行configure或者runTest了;若active == false, 则该JMeterEngine是空闲的,我们可以重新配置HashTree,执行新的测试.

学习备忘

原文连接 http://blog.youkuaiyun.com/yue530tomtom/article/details/78016823

Apache JMeter 源码(apache-jmeter-5.4.3_src.zip)可用于测试静态和动态资源、Web 动态应用程序的性能。 它可用于模拟服务器、服务器组、网络或对象上的重负载,以测试其强度或分析不同负载类型下的整体性能。 Apache JMeter 功能包括: 能够加载和性能测试许多不同的应用程序/服务器/协议类型: 网络 - HTTP、HTTPS(Java、NodeJS、PHP、ASP.NET,...) SOAP/REST 网络服务 FTP 通过 JDBC 数据库 LDAP 通过 JMS 的面向消息的中间件 (MOM) 邮件 - SMTP(S)、POP3(S) 和 IMAP(S) 本机命令或 shell 脚本 TCP Java 对象 全功能测试 IDE,允许快速记录测试计划(来自浏览器或本机应用程序)、构建和调试。 CLI 模式(命令行模式(以前​​称为非 GUI)/无头模式)从任何 Java 兼容操作系统(Linux、Windows、Mac OSX 等)加载测试 完整且可随时呈现的动态 HTML 报告 通过从最流行的响应格式、HTML、JSON、 XML或任何文本格式中提取数据的能力轻松关联 完全可移植性和100% Java 纯度。 完整的多线程框架允许多个线程并发采样和不同线程组同时采样不同功能。 缓存和离线分析/重放测试结果。 高度可扩展的核心: 可插拔采样器允许无限的测试功能。 可编写脚本的采样器(与 JSR223 兼容的语言,如Groovy和 BeanShell) 可以使用可插拔计时器选择多个负载统计信息。 数据分析和可视化插件允许极大的可扩展性和个性化。 函数可用于为测试提供动态输入或提供数据操作。 通过适用于 Maven、Gradle 和 Jenkins 的第3方开源库轻松实现持续集成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值