如何开发一个简单的Sampler
创建maven项目,并选择对应版本的jmeter核心依赖
在这里,我先选择5.4.1版本的jmeter,如果有其他的依赖jar包,可以一并放在这里
<properties>
<jmeter.version>5.4.1</jmeter.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>${jmeter.version}</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>${jmeter.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMeter_http -->
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_http</artifactId>
<version>${jmeter.version}</version>
</dependency>
<!-- other dependencies -->
...
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
创建对应的GUI类(基于SWING)
本例中 ,先尝试生成一个简单的Http请求的取样器,期望元素包括名称、注释、请求地址、请求参数:
public class MyHttpSenderGui extends AbstractSamplerGui {
private JTextField urlField;
private HTTPArgumentsPanel argumentsPanel;
public MyHttpSenderGui() {
init();
}
@Override
public String getLabelResource() {
return null;
}
@Override
public String getStaticLabel() {
return "我的HTTP请求";
}
@Override
public TestElement createTestElement() {
return new MyHttpSampler();
}
@Override
public void modifyTestElement(TestElement element) {
element.clear();
configureTestElement(element);
element.setProperty("url", urlField.getText());
element.setProperty("requestBody", JSON.toJSONString(argumentsPanel.getParameters().getArgumentsAsMap()));
}
public void init() {
argumentsPanel = new HTTPArgumentsPanel();
setLayout(new VerticalLayout(30, 50));
setBorder(makeBorder());
Box box = Box.createVerticalBox();
box.add(makeTitlePanel());
box.add(makeUrlPanel());
box.add(argumentsPanel);
add(box,BorderLayout.NORTH);
}
private Container makeUrlPanel() {
JPanel urlPanel = new JPanel(new BorderLayout(5, 0));
urlField = new JTextField(150);
JLabel label = new JLabel("请求地址:");
label.setLabelFor(urlField);
urlPanel.add(label, "West");
urlPanel.add(urlField, "Center");
HorizontalPanel vp = new HorizontalPanel();
vp.add(urlPanel);
return vp;
}
}
关键方法和代码说明
getStaticLabel
:页面上展示的名称
getLabelResource
: 和 getStaticLabel
的差别在于,getLabelResource
会根据properties文件进行语言的国际化,优先采用getStaticLabel。需要和makeTitlePanel
配合使用
modifyTestElement
:在取样器提交的时候,通过该方法将界面的参数传递给Sampler
。缺少element.clear();configureTestElement(element);
会导致icon无法找到,并导致取样器无法使用
createTestElement
:创建该取样器的处理方法。
init
:创建GUI,具体请参考Swing。
创建取样器处理类
public class MyHttpSampler extends AbstractSampler {
@Override
public SampleResult sample(Entry e) {
String url = getPropertyAsString("url");
String requestBody = getPropertyAsString("requestBody");
SampleResult sampleResult = new SampleResult();
// 设置请求参数
sampleResult.setSamplerData(
String.format("url:%s\n\trequestBody:%s", url, requestBody)
);
sampleResult.sampleStart();
try {
String body = HttpClientUtil.getPostJsonBody(url, requestBody);
sampleResult.setSuccessful(true);
sampleResult.setResponseData(body, "utf-8");
sampleResult.setSampleLabel("我的HTTP请求-成功");
} catch (Exception exception){
sampleResult.setSuccessful(false);
sampleResult.setResponseData("请求失败,没为什么", "utf-8");
sampleResult.setSampleLabel("我的HTTP请求-失败");
} finally {
sampleResult.sampleEnd();
}
return sampleResult;
}
}
集成取样器
- 将程序打包生成对应的jar包
- 将对应的jar包放到%JMETER_HOME%/lib/ext下,重新打开JMeter,取样器会自动加载
功能简述
将一个普通的HTTP请求,参数转化成json格式后,通过POST的方式传到目标服务器
相关补充见下: