习惯于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$
相关推荐
Performance Testing with JMeter(2nd) 英文azw3 第2版 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
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 ...
本文将深入探讨如何使用Apache JMeter进行回归测试,这是一种开源的性能测试工具,主要用于测试Web应用的性能,但其强大的功能也使其成为回归测试的理想选择。 ### 回归测试的重要性 回归测试在软件开发周期中扮演...
Apache JMeter是一款开源的性能测试工具,专为测试静态和动态资源的性能而设计,可以用来测试静态或动态资源的性能,如静态文件、Java小服务程序、CGI脚本、Java对象、数据库、FTP服务器等。它可以进行包括负载测试...
### 关于JMeter的知识点详解 #### 一、概述 JMeter是一款100%纯Java桌面应用程序,专为测试CS架构(客户端/服务器)的软件而设计。它不仅可以用于测试静态和动态资源(如静态文件、Java Servlets、CGI脚本、Java...
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 for Dubbo的2.7.1版本,且包含所有依赖项,确保在运行时不会因为缺少库文件而出现问题。版本号后面的" (1)"可能是备份...
本文将深入探讨“jmeter-plugins-dubbo-2.7.1-jar-with-dependencies”这一系统压测工具包,它专门针对基于Java的Dubbo服务进行性能测试。了解并熟练掌握这一工具,能帮助我们更好地优化服务性能,提升系统的稳定性...
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 2.jar jmeter本身并不支持dubbo接口的测试,需要下载第三方插件,然后将jar包放入${JMETER_HOME}\lib\ext路径下,重启即可。
而业务测试中又需要能有一个支持接口级的压测工具(基于dubbo的测试工具之前有造过一个轮子详见:https://blog.csdn.net/qq355667166/article/details/78914453),经过测试同学选型最终确认了采用jmeter+插件化...
将 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 with-dependencies jmeter-plugins-dubbo-2.7.7-jar-with-dependencies.jar
Apache JMeter是一款强大的开源性能测试工具,主要用于模拟大量并发用户对Web应用进行负载和压力测试。JMeter 5.6.3是其一个版本,它提供了丰富的功能,可以帮助开发者、测试人员评估系统的稳定性和性能。以下是对...
【JMeter绿色包免安装详解】 JMeter,全称Apache JMeter,是一款开源、免费的性能测试工具,广泛应用于Web应用、FTP服务器、数据库和其他基于协议的服务的负载和性能测试。JMeter以其强大的功能和易用性,在软件...
jmeter插件助手 jmeter-plugins-manager
《Performance Testing with JMeter 2.9》是2013年7月由Packt Publishing出版的一本关于性能测试的专业书籍。这本书详细介绍了如何使用Apache JMeter进行性能测试,JMeter是一个开源的、功能强大的性能和负载测试...