1.问题原因
jmeter自带cookie管理器, 勾选每次自动清除cookie, 无法清除线程内循环控制器等cookie. 它只会对线程间起效果,所以你在线程级别设置了多线程或者循环,这个cookie管理器都会帮你自动清除.
有时候我们在批量操作api的时候,需要隔断时间去更新cookie,这时候就会出现cookie无法更新的问题.下面亲测有效的两种方案,大家可以试试.
2.方案一: 不使用循环/while控制器,该用线程循环或多线程
- 这两个都可以让cookie自动清除.
3.方案二: 使用JSR223预处理程序
方案一会破坏我们原有的项目结构,变动会比较大,而方案二相对来说便捷,但需要有一定的代码基础,能查看和编辑.
- 项目结构
- cookie管理器设置
- 逻辑说明: 这里为了让cookie不断更新,我们使用了计数器,让它不断变大,如果不做任何处理,执行的结果如下:
- 可以看到上面的结果,cookie中的值并没有随着count的变化而改变.现在使用我们的JSR223处理器,运行结果如下:
- 可以看到,这里的cookie已经开始跟着count变化了.
- 先上具体的代码
import org.apache.jmeter.protocol.http.control.CookieManager;
import org.apache.jmeter.protocol.http.control.Cookie;
// 第一次不修改
String count = vars.get("count")
if(!"1".equals(count)){
CookieManager cManager = sampler.getCookieManager();
//获取cookie
Cookie cookie = cManager.get(0);
log.info("这是我目前存储的cookie:" + cookie.toString());
//删除cookie
cManager.remove(0);
//设置最新的cookie
cookie.setValue(count.toString())
//更新cookie
cManager.add(cookie);
}
使用步骤:
1.在你需要清除的请求添加前置处理器或者后置处理器(个人觉得添加前置处理器吧)中的JSR223预处理程序
2.然后脚本语言选择 groovy(Groovy 3.0.11 / Groovy Scripting Engine2.0)
3.在将脚本粘贴进去
如下图:
因为我们用的计数器测试,所以忽略第一次执行.如果要运用此脚本,需要你稍作修改.比如获取cookie, 已经是否忽略第一次运行等等.
4.总结
我更推荐方案二,因为它能最大程度不破坏我们的项目结构.
JSR223常用变量:
变量 | 功能 |
---|---|
ctx | 访问当前线程的上下文 |
vars | 读写当前变量 |
props | 读写当前属性 |
sampler | 访问当前取样器 |
prev | 访问当前取样器结果 |
log | 写日志文件 |
参考链接:
CookieManger方法
Cookie方法
Jmeter之后置处理器JSR223 PostProcessor