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.运行后,查看执行结果
******************************************************************************************************************************************
作者:乔叶叶
博客地址:http://www.cnblogs.com/qiaoyeye/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
******************************************************************************************************************************************
作者:乔叶叶
博客地址:http://www.cnblogs.com/qiaoyeye/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
******************************************************************************************************************************************