JMeter插件开发
最近在使用jmeter作为回环和压力测试工具。虽然jmeter自带的插件基本能满足大多数场景,但有时候也需要自定义一些插件来实现。网上的jmeter的插件开发文档稀少,官方的jmeter_tutorial也已经过时。通过本人的一些尝试,总结了一些jmeter插件开发相关的经验。
JMeter的核心组件
JMeter的核心组件主要有:
- Timer 这个比较简单,用于配置每次sampling之间的等待时间。实现例子:org.apache.jmeter.timers.RandomTimer
- Sampler 取样器,这个是最主要的组件。压力测试主要是靠Sampler实现的。通常用的有HttpSampler,用于测试http接口。如果是其他的协议需要实现其他协议的Sampler。
- ConfigElement 配置组件,主要用于定义前置配置。如数据库连接,csv输入数据集等。主要功能是将配置转换为变量设置到JMeter context中。
- Assertion 验证Sampler的结果是否符合预期。
- PostProcessor 一般用于对Sampler结果进行二次加工。
- Visualizer 将sampler的结果进行可视化展示。
- Controller 对sampler进行逻辑控制。
- SampleListener 监听sampler,基于事件机制。一般用于保存sampler的结果等耗费时间的操作。
JMeter的插件加载机制
JMeter加载插件的机制比较简单,扫描扩展下的的所有实现了JMeterGUIComponent和TestBean接口的类,然后进行初始化。
ClassFinder.findClassesThatExtend(
JMeterUtils.getSearchPaths(),
new Class[] {JMeterGUIComponent.class, TestBean.class }
所以只要确保插件的jar包在扩展路径下,默认路径是: JMETER_HOME/lib/ext
JMeter的GUI机制
由于jmeter是一个基于Swing的GUI工具,所以对它的GUI框架也需要有一定了解。 JMeter内部有两种GUI框架
-
直接继承JMeterGUIComponent接口的抽象实现类:
org.apache.jmeter.config.gui.AbstractConfigGui org.apache.jmeter.assertions.gui.AbstractAssertionGui org.apache.jmeter.control.gui.AbstractControllerGui org.apache.jmeter.timers.gui.AbstractTimerGui org.apache.jmeter.visualizers.gui.AbstractVisualizer org.apache.jmeter.samplers.gui.AbstractSamplerGui
-
通过Swing的Bean绑定机制
前者的好处是自由度高,可定制性强,但需要开发者关心GUI控件布局,以及从控件到Model的转换。
后者基本不需要开发者接触到GUI层的东西,定义好Bean以及BeanInfo即可。但SampleListener不支持BeanInfo方式定义。不知道没来得及改造还是其他原因,我在这个坑里浪费许多时间。
示例
本例子是一个jmeter mongodb 插件,主要功能是将http json接口的Sampler的结果保存到mongodb中,供查询分析。
主要扩展了JMeter的三个组件:
- MongoDBConfig 实现 ConfigElement,用于定义mongodb 数据库
- MongoDBResultSaver 实现 SampleListener,将结果保存到mongodb中
- JSONPathExtractor 实现 PostProcessor,用于通过json path抽取json sampler结果中的数据(只需要保存一部分结果的情况)
- JSONPathAssertion 实现Assertion,用于通过json path 方式校验 sampler结果。
XXXXBeanInfo类即Swing Bean绑定机制的定义类。注意命名规则,XXX类的BeanInfo定义类必须是同一package下的XXXBeanInfo类。
项目github地址: https://github.com/jolestar/jmeter-mongodb-plugin
示例截图
扩展话题
JMeter作为回环测试以及压力测试是一个非常不错的工具,但由于用例管理仅限于GUI客户端模式,输出的是xml文件,不便于团队共同维护。如果将JMeter的gui改造成web界面模式,然后用例保存到数据库中,作为自动化测试工具使用应该非常不错。