如何使用Java开发自定义Apache JMeter Sampler

如何使用Java开发自定义Apache JMeter Sampler

有时业务测试在做性能/接口测试时,现有JMeter不能满足其需求时,需要一些自定义开发的实例来解决这个问题时,我们就可以开发自定义Apache JMeter Sampler来达到预期的要求

一. 自定义Apache JMeter Sampler包含两部分

        1. AbstractSamplerGui该类是编写JMeter Sampler的UI界面的,可以定义Sampler需要的入参

        2. AbstractSampler这里实现接受界面配置参数的的类处理业务逻辑的方法代码

二. 创建MAVEN项目,在pom文件中引入JMeter的核心依赖包

核心依赖

三. 创建一个类继承AbstractSamplerGui

package hg.auto.sampler;

import org.apache.jmeter.gui.util.HorizontalPanel;

import org.apache.jmeter.gui.util.VerticalPanel;

import org.apache.jmeter.samplers.gui.AbstractSamplerGui;

import org.apache.jmeter.testelement.TestElement;

import javax.swing.*;

import java.awt.*;

/** *@author derrick */

public class HgPushSamplerUi extends AbstractSamplerGui {

    private static final long serialVersionUID = 1L;

    privateJTextField server;

    privateJTextField port;

    privateJTextField code;

    privateJTextField routing;

    privateJTextArea remark;

    publicHgPushSamplerUi() {

        super();

        init();

    }

    private void init() {

        createPanel();

    }

    private JPanel getServerPanel() {

        server = new JTextField(10);

        JLabel label = new JLabel("HostServer:");

        label.setLabelFor(server);

        JPanel panel = new HorizontalPanel();

        panel.add(label, BorderLayout.WEST);

        panel.add(server, BorderLayout.CENTER);

        returnpanel;

    }

    private JPanel getPortPanel() {

        port = new JTextField(10);

        JLabel label = new JLabel("ServerPort:");

        label.setLabelFor(port);

        JPanel panel = new HorizontalPanel();

        panel.add(label, BorderLayout.WEST);

        panel.add(port, BorderLayout.CENTER);

        returnpanel;

    }

    private JPanel getCodePanel() {

        code = new JTextField(10);

        JLabel label = new JLabel("Code:");

        label.setLabelFor(code);

        JPanel panel = new HorizontalPanel();

        panel.add(label, BorderLayout.WEST);

        panel.add(code, BorderLayout.CENTER);

        returnpanel;

    }

    private JPanel getRoutingPanel() {

        routing = new JTextField(10);

        JLabel label = new JLabel("Routing:");

        label.setLabelFor(routing);

        JPanel panel = new HorizontalPanel();

        panel.add(label, BorderLayout.WEST);

        panel.add(routing, BorderLayout.CENTER);

        returnpanel;

    }

    private JPanel getRemarkPanel() {

        remark = new JTextArea(20, 20);

        JLabel label1 = new JLabel("Remark:");

        label1.setLabelFor(remark);

        JPanel panel1 = new HorizontalPanel();

        panel1.add(label1, BorderLayout.WEST);

        panel1.add(remark, BorderLayout.CENTER);

        returnpanel1;

    }

    private void createPanel() {

        JPanel settingPanel =new VerticalPanel(5, 0);

        settingPanel.add(getServerPanel());

        settingPanel.add(getPortPanel());

        settingPanel.add(getCodePanel());

        settingPanel.add(getRoutingPanel());

        settingPanel.add(getRemarkPanel());

        JPanel dataPanel = new JPanel(new BorderLayout(5, 0));

        dataPanel.add(settingPanel, BorderLayout.NORTH);

        setLayout(new BorderLayout(0, 5));

        setBorder(makeBorder());

        // Add the standard title

        add(makeTitlePanel(), BorderLayout.NORTH);

        add(dataPanel, BorderLayout.CENTER);

    }

    @Override

    public String getLabelResource() {

        throw new IllegalStateException("This shouldn't be called");

    }

    @Override

    public TestElement createTestElement() {

        HgPushSampler sampler =new HgPushSampler();

        modifyTestElement(sampler);

        returnsampler;

    }

    @Override

    public void modifyTestElement(TestElement arg0) {

        arg0.clear();

        configureTestElement(arg0);

        arg0.setProperty(HgPushSampler.SERVER, server.getText());

        arg0.setProperty(HgPushSampler.PORT, port.getText());

        arg0.setProperty(HgPushSampler.CODE, code.getText());

        arg0.setProperty(HgPushSampler.ROUTING_ADDRESS, routing.getText());

        arg0.setProperty(HgPushSampler.REMARK, remark.getText());

    }

    @Override

    public String getStaticLabel() {

        return "HgPushSamplerUi";

    }

    @Override

    public void clearGui() {

        super.clearGui();

        server.setText("");

        port.setText("");

        code.setText("");

        routing.setText("");

        remark.setText("");

    }

    @Override

    public void configure(TestElement element) {

        super.configure(element);

        server.setText(element.getPropertyAsString(HgPushSampler.SERVER));

        port.setText(element.getPropertyAsString(HgPushSampler.PORT));

        code.setText(element.getPropertyAsString(HgPushSampler.CODE));

        routing.setText(element.getPropertyAsString(HgPushSampler.ROUTING_ADDRESS));

        remark.setText(element.getPropertyAsString(HgPushSampler.REMARK));

    }

}

四.创建Sampler继承自AbstractSampler

package hg.auto.sampler;

import hg.auto.tools.GetUrlData;

import org.apache.jmeter.samplers.AbstractSampler;

import org.apache.jmeter.samplers.Entry;

import org.apache.jmeter.samplers.SampleResult;

import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

/**

 *@author derrick

 */

public class HgPushSampler extends AbstractSampler {

    private static final long serialVersionUID = 1L;

    public static finalString SERVER = "server.text";

    public static finalString PORT = "port.text";

    public static finalString CODE = "code.text";

    public static finalString ROUTING_ADDRESS= "routing.text";

    public static finalString REMARK = "remark.text";

    private static finalString CHARSET_UTF_8= "UTF-8";

    publicString getPropertyData(String param) {

        return getPropertyAsString(param);

    }

    private String getTitle() {

        return this.getName();

    }

    public HgPushSampler(){

        setName("HgPushSampler");

    }

    private void trace(String s) {

        String tl = getTitle();

        String tn = Thread.currentThread().getName();

        String th = this.toString();

    }

    public SampleResultverify() {

        String url = getPropertyData(SERVER)+":"+getPropertyData(PORT)+"/"+getPropertyData(ROUTING_ADDRESS)+"?c="+getPropertyData(CODE);

        try{

            String result = GetUrlData.getString(url);

            Document parse = null;

            parse = Jsoup.parse(result, "utf-8");

            String red = parse.getElementsByClass("red").text();

            SampleResult mainRes = new SampleResult();

            mainRes.sampleStart();

            mainRes.setSampleLabel("HgPushSampler");

            if(!"".equals(red)){

                mainRes.setResponseCode("500");

                mainRes.setSuccessful(false);

                mainRes.setResponseMessage("setResponseMessage");

                mainRes.setResponseData(red,CHARSET_UTF_8);

                mainRes.sampleEnd();

                returnmainRes;

            }

            mainRes.setResponseCode("200");

            mainRes.setSuccessful(true);

            mainRes.setResponseCodeOK();

            mainRes.setResponseOK();

            mainRes.setResponseData(parse.getElementsByClass("text-green").text(),CHARSET_UTF_8);

            mainRes.sampleEnd();

            returnmainRes;

        } catch (Exception e) {

            e.printStackTrace();

        }

        return null;

    }

    @Override

    public SampleResultsample(Entry e) {

        trace("sample()");

        returnverify();

    }

}


 五. 打开JMeter界面,创建线程组——>创建取样器,可以看到我们自定义开发的Sampler已经存在,图2就是我们的【自定义UI 】显示效果

六.  测试结果

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容