如何使用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 】显示效果
六. 测试结果