jmeter开发自己的sampler插件
1. 新建maven工程
2.pom文件引入jmeter的核心包
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>jmeterplugntest</groupId>
<artifactId>jmeterplugntest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>jmeterplugntest</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jmeter-version>3.1</jmeter-version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>${jmeter-version}</version>
<scope>provided</scope>
</dependency> <dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>${jmeter-version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>ssmtest</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
3. 新建一个类继承AbstractSamplerGui
package com.test.gui; import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component; import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField; import org.apache.jmeter.gui.util.HorizontalPanel;
import org.apache.jmeter.gui.util.JSyntaxTextArea;
import org.apache.jmeter.gui.util.JTextScrollPane;
import org.apache.jmeter.gui.util.VerticalPanel;
import org.apache.jmeter.samplers.gui.AbstractSamplerGui;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.testelement.property.BooleanProperty;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.gui.JLabeledChoice;
import com.test.sampler.MyPluginSampler; public class MypluginGUI extends AbstractSamplerGui { private static final long serialVersionUID = 240L; private JTextField domain;
private JTextField port;
private JTextField contentEncoding;
private JTextField path;
private JCheckBox useKeepAlive;
private JLabeledChoice method; // area区域
private JSyntaxTextArea postBodyContent = JSyntaxTextArea.getInstance(30, 50);
// 滚动条
private JTextScrollPane textPanel = JTextScrollPane.getInstance(postBodyContent);
private JLabel textArea = new JLabel("Message"); private JPanel getDomainPanel() {
domain = new JTextField(10);
JLabel label = new JLabel("IP"); // $NON-NLS-1$
label.setLabelFor(domain); JPanel panel = new HorizontalPanel();
panel.add(label, BorderLayout.WEST);
panel.add(domain, BorderLayout.CENTER);
return panel;
} private JPanel getPortPanel() {
port = new JTextField(10); JLabel label = new JLabel(JMeterUtils.getResString("web_server_port")); // $NON-NLS-1$
label.setLabelFor(port); JPanel panel = new HorizontalPanel();
panel.add(label, BorderLayout.WEST);
panel.add(port, BorderLayout.CENTER); return panel;
} protected JPanel getContentEncoding() { // CONTENT_ENCODING
contentEncoding = new JTextField(10);
JLabel contentEncodingLabel = new JLabel("contentEncoding"); // $NON-NLS-1$
contentEncodingLabel.setLabelFor(contentEncoding); JPanel panel = new HorizontalPanel();
panel.setMinimumSize(panel.getPreferredSize());
panel.add(Box.createHorizontalStrut(5)); panel.add(contentEncodingLabel,BorderLayout.WEST);
panel.add(contentEncoding,BorderLayout.CENTER);
panel.setMinimumSize(panel.getPreferredSize());
return panel;
} protected Component getPath() {
path = new JTextField(15); JLabel label = new JLabel(JMeterUtils.getResString("path")); //$NON-NLS-1$
label.setLabelFor(path); JPanel pathPanel = new HorizontalPanel();
pathPanel.add(label);
pathPanel.add(path); JPanel panel = new HorizontalPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(pathPanel); return panel;
} protected Component getMethodAndUseKeepAlive() {
useKeepAlive = new JCheckBox(JMeterUtils.getResString("use_keepalive")); // $NON-NLS-1$
useKeepAlive.setFont(null);
useKeepAlive.setSelected(true);
JPanel optionPanel = new HorizontalPanel();
optionPanel.setMinimumSize(optionPanel.getPreferredSize());
optionPanel.add(useKeepAlive);
String Marry[] = { "GET", "POST" };
method = new JLabeledChoice(JMeterUtils.getResString("method"), // $NON-NLS-1$
Marry, true, false);
// method.addChangeListener(this);
JPanel panel = new HorizontalPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(optionPanel,BorderLayout.WEST);
panel.add(method,BorderLayout.WEST);
return panel;
} protected Component getpostBodyContent() { JPanel panel = new HorizontalPanel();
JPanel ContentPanel = new VerticalPanel();
JPanel messageContentPanel = new JPanel(new BorderLayout());
messageContentPanel.add(this.textArea, BorderLayout.NORTH);
messageContentPanel.add(this.textPanel, BorderLayout.CENTER);
ContentPanel.add(messageContentPanel);
ContentPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.gray), "Content"));
panel.add(ContentPanel);
return panel;
} public MypluginGUI() {
super();
init();
} private void init() { // WARNING: called from ctor so must not be overridden (i.e. must be private or
// final)
creatPanel();
} public void creatPanel() {
JPanel settingPanel = new VerticalPanel(5, 0);
settingPanel.add(getDomainPanel());
settingPanel.add(getPortPanel());
settingPanel.add(getContentEncoding());
settingPanel.add(getPath());
settingPanel.add(getMethodAndUseKeepAlive());
settingPanel.add(getpostBodyContent());
JPanel dataPanel = new JPanel(new BorderLayout(5, 0)); dataPanel.add(settingPanel, BorderLayout.NORTH);
setLayout(new BorderLayout(0, 5));
setBorder(makeBorder());
add(makeTitlePanel(), BorderLayout.NORTH); // Add the standard title
add(dataPanel, BorderLayout.CENTER);
} /*
* 创建一个新的Sampler,然后将界面中的数据设置到这个新的Sampler实例中
* */
@Override
public TestElement createTestElement() {
// TODO Auto-generated method stub
MyPluginSampler sampler = new MyPluginSampler();
modifyTestElement(sampler);
return sampler;
} @Override
public String getLabelResource() {
// TODO Auto-generated method stub
throw new IllegalStateException("This shouldn't be called");
// return "example_title";
// 从messages_zh_CN.properties读取
} @Override
public String getStaticLabel() {
return "Qiao jiafei";
} /*
* 把界面的数据移到Sampler中,与configure方法相反
* */
@Override
public void modifyTestElement(TestElement arg0) {
// TODO Auto-generated method stub
arg0.clear();
configureTestElement(arg0); arg0.setProperty(MyPluginSampler.domain, domain.getText());
arg0.setProperty(MyPluginSampler.port, port.getText());
arg0.setProperty(MyPluginSampler.contentEncoding, contentEncoding.getText());
arg0.setProperty(MyPluginSampler.path, path.getText());
arg0.setProperty(MyPluginSampler.method, method.getText());
arg0.setProperty(MyPluginSampler.postBodyContent, postBodyContent.getText());
arg0.setProperty(new BooleanProperty(MyPluginSampler.useKeepAlive, useKeepAlive.isSelected())); } /*
* reset新界面的时候调用,这里可以填入界面控件中需要显示的一些缺省的值
* */
@Override
public void clearGui() {
super.clearGui(); domain.setText("");
port.setText("");
contentEncoding.setText("");
path.setText("");
method.setText("GET");
postBodyContent.setText("");
useKeepAlive.setSelected(true); } /*
* 把Sampler中的数据加载到界面中
* */
@Override
public void configure(TestElement element) { super.configure(element);
// jmeter运行后,保存参数,不然执行后,输入框会情况 domain.setText(element.getPropertyAsString(MyPluginSampler.domain));
port.setText(element.getPropertyAsString(MyPluginSampler.port));
contentEncoding.setText(element.getPropertyAsString(MyPluginSampler.contentEncoding));
path.setText(element.getPropertyAsString(MyPluginSampler.path));
method.setText("GET");
postBodyContent.setText(element.getPropertyAsString(MyPluginSampler.postBodyContent));
useKeepAlive.setSelected(true); } }
4. 接受界面配置参数的的类,处理业务逻辑,继承AbstractSampler
package com.test.sampler; import java.util.concurrent.atomic.AtomicInteger; import org.apache.jmeter.samplers.AbstractSampler;
import org.apache.jmeter.samplers.Entry;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger; public class MyPluginSampler extends AbstractSampler{
private static final long serialVersionUID = 240L; private static final Logger log = LoggingManager.getLoggerForClass(); // The name of the property used to hold our data
public static final String domain = "domain.text";
public static final String port = "port.text";
public static final String contentEncoding = "contentEncoding.text";
public static final String path = "path.text";
public static final String method = "method.text";
public static final String postBodyContent = "postBodyContent.text";
public static final String useKeepAlive = "useKeepAlive.text"; private static AtomicInteger classCount = new AtomicInteger(0); // keep track of classes created private String getTitle() {
return this.getName();
} /**
* @return the data for the sample
*/
public String getdomain() {
return getPropertyAsString(domain);
//从gui获取domain输入的数据
} public String getport() {
return getPropertyAsString(port);
//从gui获取port输入的数据
} public String getcontentEncoding() {
return getPropertyAsString(contentEncoding); } public String getpath() {
return getPropertyAsString(path); } public String getmethod() {
return getPropertyAsString(method); } public String getpostBodyContent() {
return getPropertyAsString(postBodyContent); } public String getuseKeepAlive() {
return getPropertyAsString(useKeepAlive); } public MyPluginSampler() {
//getTitle方法会调用getName方法,setName不写会默认调用getStaticLabel返回的name值
setName("qiaojiafei");
classCount.incrementAndGet();
trace("FirstPluginSampler()");
}
private void trace(String s) {
String tl = getTitle();
String tn = Thread.currentThread().getName();
String th = this.toString();
log.debug(tn + " (" + classCount.get() + ") " + tl + " " + s + " " + th);
} @Override
public SampleResult sample(Entry arg0) {
// TODO Auto-generated method stub
trace("sample()");
SampleResult res = new SampleResult();
boolean isOK = false; // Did sample succeed? String response = null;
String sdomain = getdomain(); // Sampler data
String sport = getport();
String scontentEncoding = getcontentEncoding();
String spath = getpath();
String smethod = getmethod();
String spostBodyContent = getpostBodyContent();
String suseKeepAlive = getuseKeepAlive(); res.setSampleLabel(getTitle());
/*
* Perform the sampling
*/
res.sampleStart(); // Start timing
try { // Do something here ... response = Thread.currentThread().getName(); /*
* Set up the sample result details
*/
res.setSamplerData("setSamplerData!!!");
res.setResponseData(response+sdomain+sport+scontentEncoding+spath+smethod+spostBodyContent+suseKeepAlive, null);
res.setDataType(SampleResult.TEXT); res.setResponseCodeOK();
res.setResponseMessage("OK");// $NON-NLS-1$
isOK = true;
} catch (Exception ex) {
log.debug("", ex);
res.setResponseCode("500");// $NON-NLS-1$
res.setResponseMessage(ex.toString());
}
res.sampleEnd(); // End timimg res.setSuccessful(isOK); return res;
} }
5.工程目录结构如下,到处jar包,存放在jmeter的lib/ext目录下

6.启动jmeter,添加自己增加的sample插件

7.运行后,查看执行结果

jmeter开发自己的sampler插件的更多相关文章
- 用阿里巴巴官方给Jmeter开发的Dubbo sampler取样器进行dubbo接口测试【图解剖析】
自:https://blog.csdn.net/cyjs1988/article/details/84258046 [一]Dubbo sampler下载地址: 该插件支持jmeter 3.2及3.2以 ...
- JMeter开发插件——图片验证码识别
我们在性能测试中总会时不时地遭遇到来自于应用系统的各种阻碍,图片验证码就是一类最常见的束缚,登录或交易时需要按照图片中的内容输入正确的验证信息后,数据才可以提交成功,这使得许多性能测试工具只能望而却步 ...
- 如何为Apache JMeter开发插件(二)—第一个JMeter插件
文章内容转载于:http://lib.csdn.net/article/softwaretest/25700,并且加上个人一些截图 本篇将开启为JMeter开发插件之旅,我们选择以Function(函 ...
- (十)Jmeter中的Debug Sampler介绍
一.Debug Sampler介绍: 使用Jmeter开发脚本时,难免需要调试,这时可以使用Jmeter的Debug Sampler,它有三个选项:JMeter properties,JMeter v ...
- Notepad++进行php开发所必需的插件
Notepad++进行php开发所必需的插件有那些呢? 1. Compare: 可以用来比较两个文件不同之处. 2. Explorer:文件浏览器插件,包含收藏夹.Session保存功能.可与NppE ...
- 我利用网上代码开发的JQuery图片插件
我利用网上代码开发的JQuery图片插件 代码如下 (function($){ $.fn.FocusPic = function(options){ var defaults = { interval ...
- Cordova - 与iOS原生代码交互2(使用Swift开发Cordova的自定义插件)
在前一篇文章中我介绍了如何通过 js 与原生代码进行交互(Cordova - 与iOS原生代码交互1(通过JS调用Swift方法)),当时是直接对Cordova生成的iOS工程项目进行编辑操作的(添加 ...
- (转)jQuery Mobile 移动开发中的日期插件Mobiscroll 2.3 使用说明
(原)http://www.cnblogs.com/hxling/archive/2012/12/12/2814207.html jQuery Mobile 移动开发中的日期插件Mobiscroll ...
- MS CRM 2011的自定义和开发(11)——插件(plugin)开发(三)
http://www.cnblogs.com/StoneGarden/archive/2012/02/06/2340661.html MS CRM 2011的自定义和开发(11)——插件(plugin ...
随机推荐
- [转]基于WorldWind平台的建筑信息模型在GIS中的应用
1 引言 随着BIM(Building Information Modeling)的不断发展,建筑信息建模的理念贯穿着建筑.结构.施工.运行维护以及拆迁再规划的整个建筑的生命周期,这种理念不仅使得 ...
- 解决iOS项目根目录下文件乱七八糟的问题
对于一个刚做项目的新手来说,肯定会碰到一个相当蛋疼的问题,那就是你在项目中建立的文件夹与你在根目录下的文件夹完全对应不起来,说直接点就是你通过group的方式在项目中建立的文件夹在本目录下根本就没有. ...
- [LuoguP2900] [USACO08MAR]土地征用(Land Acquisition)
土地征用 (Link) 约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地.如果约翰单买一块土 地,价格就是土地的面积.但他可以选择并购一组土地,并购的价格为这些土地中最大的长 乘以最大的宽.比 ...
- mysql数据库迁移到oracle数据库后 如何删除相同的数据
mysql数据库迁移到oracle数据库后 如何删除相同的数据 首先搞清楚有多少数据是重复的 select pid from product group by pid having count(pid ...
- App升级iOS7体会
本文转自App升级iOS7体会. xcode5 GM版已经发布,虽然还是pre-release版,但离最终版不远了.对于没有用到新特性的app面临的最大问题就是UI的变化.Apple提供了UI Tra ...
- Java九阳真经论述及愿景
Java九阳真经论述及愿景 “他强由他强,清风拂山冈,他横由他横,明月照大江.” <倚天屠龙记>中张无忌被玄冥二老的玄冥神掌打伤后,体寒难耐,到处求解决之法.一次被韦蝠王打下山谷后,偶遇一 ...
- ORACLE GOLDEN GATE oracle同步数据至kafka
一.服务器信息 ip 软件版本 ogg版本 软件包 操作系统版本 OGG安装路径 10.1.50.52 源 oracle11.2.0.4 12.2.0.1.1 V100692-01.zip cen ...
- CentOS 7.x eth0
1:Test Environment [root@linux-node1 ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server rel ...
- MVC action过滤器验证登录
方法一 : 1.创建一个全局action过滤器 (在appstart 的filterconfig中注册 filters.Add(new LoginAttribute());) 2.不需要登 ...
- collections.Counter类统计列表元素出现次数
# 使用collections.Counter类统计列表元素出现次数 from collections import Counter names = ["Stanley", &qu ...