Cookie 不会在 JMeter 'Loop Controller' 中的迭代中重置?

Cookies won't reset on iteration in JMeter 'Loop Controller'?

使用 Jmeter 2.12,什么会导致 cookie 在 JMeter 循环控制器期间无法重置?我已经尝试了所有我能想到的方法,但每次循环时,上一次登录的 cookie 之一仍然存在。它似乎并没有真正清除cookies。

下面是我如何组合我的循环:

Thread Group 1
  -- Loop Controller (3x)
    -- Simple Controller
      -- HTTP Header Manager
      -- HTTP Cookie Manger (with 'Clear cookies each iteration?' enabled)
      -- BeanShell sampler - with code that tries to clear all cookies
      -- HTTP /login (gets cookies and auth headers)
      -- ... various HTTP Samplers ...
      -- HTTP /logout

我尝试用这段代码添加一个 Beanshell 采样器(如上所示),但它似乎没有做任何事情:

import org.apache.jmeter.protocol.http.control.CookieManager;
import org.apache.jmeter.protocol.http.control.HeaderManager;

CookieManager cManager = sampler.getCookieManager();
cManager.clear();
HeaderManager hManager = sampler.getHeaderManager();
hManager.clear();

好的,我找到问题了。尽管 'HTTP Cookie Manager' 有一个名为 'Clear cookies each iteration' 的选项,但它提到的 'iteration' 不包括循环控制器。它所指的只是 'Thread Group' iterations/loops。这还不清楚,我浪费了半天时间才弄明白。如果复选框显示 'Clear cookies each Thread Group iteration' 就不会造成混淆。非常失望。

  1. 循环控制器不递增迭代。您可以通过在任何支持 Beanshell 的测试元素(采样器、Pre/Post 处理器、断言等)
  2. 中评估 vars.getIteration() Beanshell code line. Iteration is being incremented on Thread Group level. To override this you can call vars.incIteration() 方法来测试它
  3. 您用于清除 cookie 的 Beanshell 代码实际上什么都不做,因为 cManager 实例没有被传回采样器。您需要修改您的代码如下:

    CookieManager cManager = sampler.getCookieManager();
    cManager.clear();
    sampler.setCookieManager(cManager);
    

    所以 sampler 可以让 "cManager" 实例清除 cookie

有关 Apache JMeter 中 Beanshell 脚本的更多信息,请参阅 How to use BeanShell: JMeter's favorite built-in component 指南。