jmeter下载地址:Apache JMeter - Download Apache JMeter
解压压缩文件,进入bin目录。双击ApacheJMeter.jar(客户端为中文)或jmeter.bat即可启动jmeter (jmeter依赖java8)
jmeter支持很多测试类型,下面只简单介绍web http的测试
打开jmeter后在测试计划下添加线程组
如下图
在线程组下添加一个http请求
如下(登陆接口)
在登陆接口下添加一个观察结果树
如下
执行(未保存时会提示先保存)
查看观察结果树
有些接口必须要登陆获取cookie中的JSESSIONID后才能访问。
jmeter可以通过Http Cookie管理器管理cookie,使其他的访问自动带上cookie而不用手动设置
在线程组下添加cookie管理器
如下
在线程组下添加一个需要登陆后才能访问的接口
注意上面的服务器名称或ip必须与登陆接口的服务器或名称相同,不能一个是localhost 一个是127.0.0.1。否则获取cookie会失败
在登陆后的接口下也添加一个观察结果树
为了测试方便我在login接口下返回一个自定义的cookie。如下
@RequestMapping("/login")
public Result login(HttpServletRequest request , HttpServletResponse response, @Validated UserDto dto, BindingResult result) throws IOException {
if(result.getErrorCount() >= 1){
return Result.fail(result.getAllErrors().get(0).getDefaultMessage());
}
UserVo userVo = dto.toUserVo();
UserVo queryResult = iUserMicroService.findUserByUserName(userVo.getUserName());
if(queryResult == null){
return Result.fail("该用户没有注册");
}
String password = DigestUtils.md5Hex(userVo.getPassword());
if(!queryResult.getPassword().equals(password)){
return Result.fail("密码不正确");
}
Cookie cookie = new Cookie("wl","hello");
cookie.setMaxAge(3600);
cookie.setPath("/");
response.addCookie(cookie);
sessionService.setUserSession(request,queryResult);
return Result.success(queryResult);
}
在次执行。查看登陆后接口的观察结果树的请求头信息
可以看到请求头上带了两个cookie
在单点登陆或跨域情况下Http Cookie管理器获取不到cookie
为了测试方便我们模拟跨域,直接将登陆接口的服务器或ip修改为:localhost。登陆后的接口的服务器或ip值依然是127.0.0.1
再次执行
登陆接口成功
但是登陆后的结果却失败了
请求头信息如下(没有cookie)
解决这个问题可以使用jemeter BeanShell后置处理器
在登陆接口下添加 后置处理器
编写脚本(日志可以去掉)
import org.apache.jmeter.samplers.SampleResult;
log.info("=====================");
SampleResult result = ctx.getPreviousResult();
String headers = result.getResponseHeaders();
String[] array = headers.split("\n");
for(int i=0;i<array.length;i++){
if(array[i].startsWith("Set-Cookie")){
String params = array[i].replace("Set-Cookie: ","");
String[] cookieArray = params.trim().split(";");
String[] cookieKeyValue = cookieArray[0].split("=");
String cookieKey = cookieKeyValue[0];
String cookieValue = cookieKeyValue[1];
if(cookieKey.equals("JSESSIONID")){
log.info(cookieValue);
props.put("JSESSIONID",cookieValue);
}
}
}
log.info(headers);
如下图
上面的脚本获取Cookie中JSESSIONID的值并赋值给Jemeter中JSESSIONID(名字可以自定义)这个全局变量
在Http Cookie管理器中添加一条JSESSIONID的cookie 并使用${__P(JSESSIONID,)}获取上面赋值的全局变量。
如下(注意安全不要勾选)
注意域必须与需要登陆的接口的服务器或ip的值相同
再次执行
登陆接口请求头如下(域名为localhost )
登陆后请求头如下(域名为127.0.0.1 cookie有值)
jemeter目录如下
BeanShell内置对象ctx javadoc JMeterContext (Apache JMeter dist API)
vars javadoc JMeterVariables (Apache JMeter dist API)
prev - (SampleResult) javadoc SampleResult (Apache JMeter dist API)
sampler javadoc Sampler (Apache JMeter dist API)