我正在设计一个jmeter负载测试脚本,它类似于以下内容:
Thread - 1
Login to the application : 1) JSESSIONID cookie is generated in this step
2) CSRF token is generated here
Thread - 2
Perform operations on the applications :
1) These steps requires CSRF token in the header.
所以我所做的是提取csrf令牌,并使用beanshell后处理器,并将其设置为一个属性,以便可以跨所有线程访问它。这部分工作正常。
问题是我无法与后续线程共享线程1中生成的JSESSIONID。
我尝试过的解决方案之一是,我从线程1的响应标头中提取了JSESSIONID,然后使用beanshell后处理器并将其设置为属性,然后在测试计划级别添加了HTTP Cookie管理器,然后添加了一个用户定义的Cookie,我在其中提取了Cookie其设置在上面。这没用。
任何帮助都将不胜感激。
-
最好的解决方案是将所有内容移动到一个线程组中,这样HTTP Cookie管理器将自动管理Cookie,您不必将变量转换为属性
-
很难说为什么在没有看到您的配置的情况下不添加cookie,请查看jmeter.log文件中的任何可疑条目。如果你必须在不同的线程组下处理请求(尽管这不是你真正应该做的事情(-如何使用BeanShell:JMeter最喜欢的内置组件建议使用以下代码片段:
-
在第一个线程组中:
import org.apache.jmeter.protocol.http.control.CookieManager; CookieManager manager = ctx.getCurrentSampler().getProperty("HTTPSampler.cookie_manager").getObjectValue(); props.put("cookiecount",String.valueOf(manager.getCookieCount())); for (int i=0;i<manager.getCookieCount();i++){ // code to convert Cookie information to JMeter Properties props.put("cookie_name_" + i, manager.get(i).getName()); ….. }
-
在第二线程组中:
import org.apache.jmeter.protocol.http.control.CookieManager; import org.apache.jmeter.protocol.http.control.Cookie; import org.apache.jmeter.testelement.property.JMeterProperty; CookieManager manager = ctx.getCurrentSampler().getProperty("HTTPSampler.cookie_manager").getObjectValue(); int count = Integer.parseInt(props.getProperty("cookiecount")); for (int i=0;i<count;i++) { Cookie cookie = new Cookie(props.getProperty("cookie_name"+i),props.getProperty("cookie_value"+i), props.getProperty("cookie_domain"+i),props.getProperty("cookie_path"+i), Boolean.parseBoolean(props.getProperty("cookie_secure"+i)), Long.parseLong(props.getProperty("cookie_expires"+i))); manager.add(cookie); } JMeterProperty cookieprop = ctx.getCurrentSampler().getProperty("HTTPSampler.cookie_manager"); cookieprop.setObjectValue(manager); ctx.getCurrentSampler().setProperty(myprop);
-
-
最后但并非最不重要的是,由于JMeter 3.1应该使用JSR223测试元素和Groovy语言进行脚本编写,因此相同的代码应该在Groovy中工作,而不需要任何更改
在同一线程组和不同线程组中的线程之间共享值的选项很少。
- 使用JMeter函数设置和检索值(属性(
设置属性:
${__setProperty(JSESSIONID,JSESSIONID_VALUE,(}
检索属性
${__property(JSESSIONID,DEFAULT_VALUE,(}
- 使用vars变量和JSR223组件来处理prosperity
设置属性vars.put('JSESSIONID','JSESSIONID_VALUE'(
检索属性vars.get('JSESSIONID'(
- 使用线程间通信插件共享值
注意在您的场景中,一个线程(即用户(中的以下请求可能需要JSESSIONID,而不是其他线程。因此,您应该将所有请求移动到一个单独的线程组中。使用JSESSIONID创建一个JMeter变量,并为后续请求设置头。