`
songzi0206
  • 浏览: 158766 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
Group-logo
All are from ...
浏览量:33800
Group-logo
Programming w...
浏览量:19663
社区版块
存档分类
最新评论

Programming with JMeter

 
阅读更多

 

习惯于JUnit做功能方面unit test,而对于有些Test需要有一定的压力来模拟一定并发的读和写,借助JMeter来实现这样的测试框架是很不错的一个选择,一来减少很多工作量 (只需少量的定制:比如实现自己的ThreadGroup来定制并发线程的创建和执行,实现自己的Sampler来定制测试目标类的实例化和运行),二来可以很方便使用Hudson进行持续集成, 这对于利用Hudson进行持续集成的项目是再方便不过了,每次build之后除了JUnit报告之外,还能看到jtl报告来监视的性能状况。如果要这样做,首先要研究一下JMeter代码。

咋看JMeter框架,貌似挺复杂的,其实不然,基于上面的需求,我们只需要Java Sampler的测试,所以大部分的Jar包就可以排除,只需区区10个JAR包:

commons-logging-1.1.1.jar

xstream-1.4.2.jar

commons-lang3-3.1.jar

ApacheJMeter_java.jar

xmlpull-1.1.3.1.jar

logkit-2.0.jar

commons-io-2.2.jar

avalon-framework-4.1.4.jar

ApacheJMeter_core.jar

jorphan.jar

     好吧,要研究10个JAR包的代码也不算少!幸运的是,剔除commons/xml/log相关的,真正需要研究的只有ApacheJMeter_core.jar/ApacheJMeter_java.jar,最多再了解下jorphan.jar。

首先,从JMeter的headless运行入手:$ jmeter -n -p user.properties -t my_test_plan.jmx -l my_results.jtl

其实就是调用 NewDriver.main("-n -p user.properties -t my_test_plan.jmx -l my_results.jtl").NewDriver类位于ApacheJMeter.jar中,之所以该jar没有列入上面10个之中是因为这个jar 包非常简单,只是一个headless运行的入口而已,真正项目要集成JMeter跟本不会去用这个类。作为CommandLine运行入 口,NewDriver只做两件事情,一是设置一些JMeter路径(主要是为了程序能找到 user.properties,saveservice.properties,和相关JAR的classpath),二是去反射运行 JMeter.start方法。 

再来看位于ApacheJMeter_core.jar中JMeter类,抛开GUI和Remote test相关的代码,简单说,JMeter做的事情主要有

1. 解析命令行参数,加载user.properties(初始化log)

2. 查找并加载saveservice.properties

3. 将测试文件(.jmx文件)解析成HashTree

4. 创建一个StandardJMeterEngine,并把测试的工作交给JMeterEngine

当然,他还有其他重要的职责,比如监听所有的JMeterEngine,当接收到GUI的StopTestNow/Shutdown等命令时候来调用JMeterEngine相应的方法。

       接下来研究下JMeterEngine,很简单的一个接口:

 

public interface JMeterEngine {
    void configure(HashTree testPlan);

    void runTest() throws JMeterEngineException;

    void stopTest(boolean now);

    void reset();

    void setProperties(Properties p);

    void exit();
    
    boolean isActive();
}

         JMeterEngine只依赖HashTree, 只要能够构造一个HashTree, 就可以简单的调用其runTest方法完成所有的测试工作了. 而HashTree是由执行的测试文件如my_test_plan.jmx解析而来,其结构一般如下:

 



      从xml tree看,对JMeter内部类应该有这样的直觉:



 

       单纯从数据结构上可以这么理解,一个testplan包含多个ThreadGroup,每个ThreadGroup可以起一组线程跑相应JavaSampler测试,每个测试由相应的ResultCollector收集结果并生产report。其实并没有这么简单,这里有最重要的两个类可以进行扩展,实现和自己项目的集成,就是ThreadGroup和JavaSampler,这在本文开头就提过,至于如何扩展等分析完这些组件再写。本文接下来简单的以实例代码结束:

 1. 构建一个Mockup HashTree,这样就能摆脱以命令行跑需要提供一个JMX测试文件的依赖:

public static HashTree createMockHashTree() throws IOException{
		TestPlan tp = testPlan();
		ThreadGroup group = threadGroup();
		JavaSampler sampler = javaSampler();
		ResultCollector resultCol = resultCollector();
		
		HashTree tree = new HashTree();
		tree.add(tp);
		
		HashTree groupTree = new HashTree();
		groupTree.add(group);

		HashTree samplerTree = new HashTree();
		samplerTree.add(sampler);
		
		HashTree resultTree = new HashTree();
		resultTree.add(resultCol);
		
		
		samplerTree.add(samplerTree.getArray()[0], resultTree);
		groupTree.add(groupTree.getArray()[0],samplerTree);
		
		
		tree.add(tree.getArray()[0], groupTree);
		
        return tree;
	}

	public static TestPlan testPlan() throws IOException{
		TestPlan tp = new TestPlan();
		tp.setName("MyTest");
		tp.setProperty(TestElement.TEST_CLASS, "TestPlan");
		tp.setProperty(TestElement.GUI_CLASS,"TestPlanGui");
		tp.setProperty(TestElement.ENABLED, true);
		tp.setComment("");
		tp.setFunctionalMode(false);
		tp.setSerialized(false);
		return tp;
	}
	
	public static ThreadGroup threadGroup() throws IOException{
		ThreadGroup tp = new ThreadGroup();
		tp.setName("PerformanceGroup");
		tp.setProperty(TestElement.TEST_CLASS, "ThreadGroup");
		tp.setProperty(TestElement.GUI_CLASS,"ThreadGroupGui");
		tp.setProperty(TestElement.ENABLED, true);
		tp.setProperty(AbstractThreadGroup.ON_SAMPLE_ERROR, "continue");
		LoopController lc = new LoopController();
		lc.setName("Loop Controller");
		lc.setLoops(10);
		tp.setSamplerController(lc);
		tp.setNumThreads(5);
		tp.setRampUp(1);
		tp.setStartTime(System.currentTimeMillis());
		tp.setEndTime(System.currentTimeMillis());
		tp.setScheduler(false);
		return tp;
	}
	
	public static JavaSampler javaSampler() throws IOException{
		JavaSampler tp = new JavaSampler();
		tp.setName("PerformanceTest");
		tp.setProperty(TestElement.TEST_CLASS, "JavaSampler");
		tp.setProperty(TestElement.GUI_CLASS,"JavaTestSamplerGui");
		tp.setProperty(TestElement.ENABLED, true);
		tp.setClassname("app.PerformanceTest");
		return tp;
	}
	
	public static ResultCollector resultCollector() throws IOException{
		ResultCollector tp = new ResultCollector();
		tp.setName("Aggregate Report");
		tp.setProperty(TestElement.TEST_CLASS, "ResultCollector");
		tp.setProperty(TestElement.GUI_CLASS,"StatVisualizer");
		tp.setProperty(TestElement.ENABLED, true);
		tp.setErrorLogging(false);
		tp.setFilename("/home/wilson.wu/unittest/report/performentce2.jtl");
		return tp;
	}

 

  2. 有了HashTree, 最简单的做法:

StandardJMeterEngine jmeterEngine = new StandardJMeterEngine();
jmeterEngine .configure(tree);
jmeterEngine .runTest();

 

最后,要注意一点,在编程调用JMeter相关JAR之前,运行相关配置文件的设置,例如:

JMeterUtils.loadJMeterProperties(userProperties);
		JMeterUtils.initLogging(); 
		JMeterUtils.initLocale(); 
		JMeterUtils.setJMeterHome("");
		// Set some (hopefully!) useful properties
        long now=System.currentTimeMillis();
        JMeterUtils.setProperty("START.MS",Long.toString(now));// $NON-NLS-1$
        Date today=new Date(now); // so it agrees with above
        JMeterUtils.setProperty("START.YMD",new SimpleDateFormat("yyyyMMdd").format(today));// $NON-NLS-1$ $NON-NLS-2$
        JMeterUtils.setProperty("START.HMS",new SimpleDateFormat("HHmmss").format(today));// $NON-NLS-1$ $NON-NLS-2$

 

 

1
2
分享到:
评论

相关推荐

    Performance Testing with JMeter(2nd) azw3

    Performance Testing with JMeter(2nd) 英文azw3 第2版 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    Performance Testing with Jmeter

    Apache JMeter is a free open source, cross-platform, performance testing tool that has been around since the late 90s. It is mature, robust, portable, and highly extensible. It has a large user base ...

    Regression Testing With JMeter

    本文将深入探讨如何使用Apache JMeter进行回归测试,这是一种开源的性能测试工具,主要用于测试Web应用的性能,但其强大的功能也使其成为回归测试的理想选择。 ### 回归测试的重要性 回归测试在软件开发周期中扮演...

    performance testing with jmeter

    Apache JMeter是一款开源的性能测试工具,专为测试静态和动态资源的性能而设计,可以用来测试静态或动态资源的性能,如静态文件、Java小服务程序、CGI脚本、Java对象、数据库、FTP服务器等。它可以进行包括负载测试...

    Jmeter Jmeter Jmeter Jmeter Jmeter

    ### 关于JMeter的知识点详解 #### 一、概述 JMeter是一款100%纯Java桌面应用程序,专为测试CS架构(客户端/服务器)的软件而设计。它不仅可以用于测试静态和动态资源(如静态文件、Java Servlets、CGI脚本、Java...

    JMeter中文手册 JMeter中文手册

    JMeter中文手册JMeter中文手册JMeter中文手册JMeter中文手册JMeter中文手册JMeter中文手册JMeter中文手册JMeter中文手册JMeter中文手册JMeter中文手册JMeter中文手册JMeter中文手册JMeter中文手册JMeter中文手册...

    jmeter-plugins-dubbo-2.7.1-jar-with-dependencies (1)

    "jmeter-plugins-dubbo-2.7.1-jar-with-dependencies (1)" 这个版本号表明这是JMeter Plugins for Dubbo的2.7.1版本,且包含所有依赖项,确保在运行时不会因为缺少库文件而出现问题。版本号后面的" (1)"可能是备份...

    jmeter-plugins-dubbo-2.7.1-jar-with-dependencies

    本文将深入探讨“jmeter-plugins-dubbo-2.7.1-jar-with-dependencies”这一系统压测工具包,它专门针对基于Java的Dubbo服务进行性能测试。了解并熟练掌握这一工具,能帮助我们更好地优化服务性能,提升系统的稳定性...

    jmeter-plugins-dubbo-2.7.8-jar-with-dependencies.jar

    jmeter的dubbo插件,jmeter-plugins-dubbo-2.7.8-jar-with-dependencies.jar,适用于JMeter5.4.1版本,将解压后的文件jmeter-plugins-dubbo-2.7.8-jar-with-dependencies放在Jmeter安装目录下的\lib\ext文件夹中,...

    jmeter-plugins-dubbo-2.7.1-jar-with-dependencies.jar.zip

    jmeter-plugins-dubbo-2.7.1-jar-with-dependencies 2.jar jmeter本身并不支持dubbo接口的测试,需要下载第三方插件,然后将jar包放入${JMETER_HOME}\lib\ext路径下,重启即可。

    jmeter-plugins-dubbo-2.7.4-jar-with-dependencies.jar

    而业务测试中又需要能有一个支持接口级的压测工具(基于dubbo的测试工具之前有造过一个轮子详见:https://blog.csdn.net/qq355667166/article/details/78914453),经过测试同学选型最终确认了采用jmeter+插件化...

    jmeter-plugins-cmn-jmeter-0.3

    将 jpgc-graphs-basic-2.0.zip 解压缩后只有一个 lib 目录,该目录下有一个 ext 文件夹和一个 jmeter-plugins-cmn-jmeter-0.3.jar 包,ext 文件夹中有 jmeter-plugins-graphs-basic-2.0.jar 和 jmeter-plugins-...

    jmeter-plugins-dubbo-2.7.7-jar-with-dependencies.jar

    jmeter-plugins-dubbo with-dependencies jmeter-plugins-dubbo-2.7.7-jar-with-dependencies.jar

    jmeter5.6.3压测工具 jmeter压测工具 jmeter压测工具

    Apache JMeter是一款强大的开源性能测试工具,主要用于模拟大量并发用户对Web应用进行负载和压力测试。JMeter 5.6.3是其一个版本,它提供了丰富的功能,可以帮助开发者、测试人员评估系统的稳定性和性能。以下是对...

    jmeter绿色包免安装

    【JMeter绿色包免安装详解】 JMeter,全称Apache JMeter,是一款开源、免费的性能测试工具,广泛应用于Web应用、FTP服务器、数据库和其他基于协议的服务的负载和性能测试。JMeter以其强大的功能和易用性,在软件...

    jmeter插件助手 jmeter-plugins-manager

    jmeter插件助手 jmeter-plugins-manager

    acktPub.Performance.Testing.With.JMeter.2.9.Jul.2013

    《Performance Testing with JMeter 2.9》是2013年7月由Packt Publishing出版的一本关于性能测试的专业书籍。这本书详细介绍了如何使用Apache JMeter进行性能测试,JMeter是一个开源的、功能强大的性能和负载测试...

Global site tag (gtag.js) - Google Analytics