取样器是用来模拟用户操作的,向服务器发送请求以及接收服务器的响应数据。jmeter提供的取样器种类如下图。在测试工作中用的最多的可能就是“HTTP请求”、“调试取样器” 、“java请求”。

1.http请求
get请求

post请求

关于http请求的的属性参数说明:
1)名称:用于标识一个sample。建议使用一个有意义的名称
2)注释:对于测试没任何影响,仅用来记录用户可读的注释信息
3)服务器名称或IP:http请求发送的目标服务器名称或者IP地址,比如https://www.blued.com
4)端口号:目标服务器的端口号,默认值为80,可不填
5)协议:向目标服务器发送http请求时的协议,http/https,大小写不敏感,默认http
6)方法:发送http请求的方法
7)Content encoding:内容的编码方式(Content-Type=application/json;charset=utf-8)
8)路径:目标的URL路径(不包括服务器地址和端口)
9)自动重定向:如果选中该项,发出的http请求得到响应是301/302,jmeter会重定向到新的界面
10)Use keepAlive:jmeter 和目标服务器之间使用 Keep-Alive方式进行HTTP通信(默认选中)
11)Use multipart/from-data for HTTP POST :当发送HTTP POST 请求时,使用
12)Parameters、Body Data以及Files Upload的区别:
1. parameter是指函数定义中参数
2、Body Data指的是实体数据,就是请求报文里面主体实体的内容,一般我们向服务器发送请求,携带的实体主体参数,可以写入这里
3、Files Upload指的是:从HTML文件获取所有有内含的资源:被选中时,发出HTTP请求并获得响应的HTML文件内容后还对该HTML
进行Parse 并获取HTML中包含的所有资源(图片、flash等):(默认不选中)
如果用户只希望获取特定资源,可以在下方的Embedded URLs must match 文本框中填入需要下载的特定资源表达式,只有能匹配指定正则表达式的URL指向资源会被下载
代理服务器(ip欺骗): 不想用本机的地址来发送Http请求而想使用代理服务器则填写
- 服务器名称或IP:代理服务器的名称或者IP地址;
- 端口号:该代理的端口号;
- 用户名:使用该代理的用户名;
- 密码:用户密码
2.Debug Sampler


3.java请求
创建一个maven工程引入以下包
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>4.0</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>4.0</version>
</dependency>如果不是maven工程,只需要将jmeter/lib/ext目录下,以下jar包添加进工程的build path
ApacheJMeter_components-4.0.jar
ApacheJMeter_functions-4.0.jar
ApacheJMeter_http-4.0.jar
ApacheJMeter_java-4.0.jar
ApacheJMeter_jdbc-4.0.jar导入jmeter相关的类
- import org.apache.jmeter.config.Arguments; // 请求参数
- import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient; // 请求基类
- import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; // 请求上下文,可以理解为Jmeter传过来的内容
- import org.apache.jmeter.samplers.SampleResult; // 请求结果
创建java请求类
1.请求类继承 AbstractJavaSamplerClient
2. 为请求创建需要的参数,实现public Arguments getDefaultParameters() 方法
3. 编写请求初始化方法,只执行一次,实现public void setupTest(JavaSamplerContext context) 方法
4. 编写请求循环执行方法,执行多次,实现public SampleResult runTest(JavaSamplerContext context) 方法
5. 编写请求结束方法,实现public void teardownTest(JavaSamplerContext context) 方法
样例代码
一个http get请求
package com.max.javarequest;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import java.io.IOException;
public class CsyTestHttpRequest extends AbstractJavaSamplerClient {
private String reqUrl;
private String city_id;
private CloseableHttpClient httpClient;
private CloseableHttpResponse response;
private HttpPost httpPost;
private HttpGet httpGet;
/**
* 定义可用参数及默认值
* @return
*/
public Arguments getDefaultParameters()
{
Arguments params = new Arguments();
params.addArgument("reqUrl", "");
params.addArgument("city_id", "");
return params;
}
/**
* 可选,测试前执行,做一些初始化工作,在Jmeter执行的时候,一个Thread只执行一次setupTest方法
* @param context
*/
public void setupTest(JavaSamplerContext context)
{
reqUrl = context.getParameter("reqUrl");
city_id = context.getParameter("city_id");
httpClient = HttpClientBuilder.create().build();
httpGet = new HttpGet(reqUrl + "?city_id=" + city_id);
}
/**
* 必选实现自定义请求
* @param context
* @return
*/
public SampleResult runTest(JavaSamplerContext context)
{
SampleResult results = new SampleResult();
results.sampleStart();
try
{
String res = doGet();
results.setResponseData(res, "utf-8");
results.setDataType(SampleResult.TEXT);
if("true".equals(res)){
results.setSuccessful(true);
}else{
results.setSuccessful(false);
}
}
catch (Exception e)
{
e.printStackTrace();
results.setSuccessful(false);
}
results.sampleEnd();
return results;
}
/**
* 可选测试结束时调用,用于自然释放
* @param context
*/
public void teardownTest(JavaSamplerContext context)
{
if (httpClient != null){
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (response != null) {
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
}
httpGet.releaseConnection();
super.teardownTest(context);
}
/**
* send http post request
* @param reqData requests data
* @return response data
*/
private String doPost(String reqData){
String reseContent = "";
try {
httpPost.setEntity(new StringEntity(reqData == null ? "" : reqData, "utf-8"));
CloseableHttpResponse response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
if (null != entity)
{
reseContent = EntityUtils.toString(entity, ContentType.getOrDefault(entity).getCharset());
EntityUtils.consume(entity);
}
}
catch (Exception e)
{
throw new IllegalStateException(e);
}
return reseContent;
}
/**
* send http get request
* return response data
*/
private String doGet(){
String reseContent = "";
try {
response = httpClient.execute(httpGet);
HttpEntity entity = response.getEntity();
if (null != entity)
{
reseContent = EntityUtils.toString(entity, ContentType.getOrDefault(entity).getCharset());
// System.out.println("响应内容为:" + reseContent);
EntityUtils.consume(entity);
}
}
catch (Exception e)
{
throw new IllegalStateException(e);
}
return reseContent;
}
public static void main(String[] args) {
Arguments params = new Arguments();
params.addArgument("reqUrl","http://www.emao.com/json/home/gethome");
params.addArgument("city_id","1");
JavaSamplerContext context = new JavaSamplerContext(params);
CsyTestHttpRequest sttest = new CsyTestHttpRequest();
sttest.setupTest(context);
sttest.runTest(context);
sttest.teardownTest(context);
}
}
打jar包 导入jmeter
将写好的代码调试完毕后,打成jar包导入jmeter/lib/ext目录重启jmeter
使用
在Jmeter中 add -> sampler -> Java Request
class name 中出现自己写的Java类了,选择后下面会出现类中设置的参数。
填写对应的参数执行,在结果观察树中就可以查看到请求的发送信息,响应信息,还有是否成功。

在classname处如果不显示你写的方法,请检查打好的jar是否有问题
结果






Comments | NOTHING