zoukankan      html  css  js  c++  java
  • 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.运行后,查看执行结果

  • 相关阅读:
    Window 7 + Ubuntu 双系统安装
    Android Proguard
    windows管理方式
    开启Telnet服务
    java中的Date类
    java中String字符串
    java自定义异常和throw、throws的使用
    java异常的嵌套和级联
    java中各种常见的异常
    java异常的基本概念和处理流程
  • 原文地址:https://www.cnblogs.com/qiaoyeye/p/8146483.html
Copyright © 2011-2022 走看看