如何与多个线程共享JSESSIONID



我正在设计一个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其设置在上面。这没用。

任何帮助都将不胜感激。

  1. 最好的解决方案是将所有内容移动到一个线程组中,这样HTTP Cookie管理器将自动管理Cookie,您不必将变量转换为属性

  2. 很难说为什么在没有看到您的配置的情况下不添加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);
      
  3. 最后但并非最不重要的是,由于JMeter 3.1应该使用JSR223测试元素和Groovy语言进行脚本编写,因此相同的代码应该在Groovy中工作,而不需要任何更改

在同一线程组和不同线程组中的线程之间共享值的选项很少。

  1. 使用JMeter函数设置和检索值(属性(

设置属性:

${__setProperty(JSESSIONID,JSESSIONID_VALUE,(}

检索属性

${__property(JSESSIONID,DEFAULT_VALUE,(}

  1. 使用vars变量和JSR223组件来处理prosperity

设置属性vars.put('JSESSIONID','JSESSIONID_VALUE'(

检索属性vars.get('JSESSIONID'(

  1. 使用线程间通信插件共享值

注意在您的场景中,一个线程(即用户(中的以下请求可能需要JSESSIONID,而不是其他线程。因此,您应该将所有请求移动到一个单独的线程组中。使用JSESSIONID创建一个JMeter变量,并为后续请求设置头。

最新更新