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.运行后,查看执行结果

原文地址:https://www.cnblogs.com/qiaoyeye/p/8146483.html