我有以下设置:
Thread A
- Http Cookie Manager
- Login Page
Thread B
- Http Cookie Manager
- Page to hit
- Another page to hit
我一直在尝试将登录页面中设置的cookie转换为全局属性,然后将其设置为线程B中的Http Cookie管理器。但是我一直无法做到正确。我已经尝试过BeanShell PostProcessors等,但是无法正确设置它。
===添加澄清===
我无法在线程B中拥有登录页面和cookie管理器的原因是由于所需的行为。目标是登录,获取cookie,然后一遍又一遍地打一堆页面。这使我们能够登录一次,然后模拟该用户的大量点击。通过将cookie管理器和登录页面放入用户登录的同一个线程中,点击一堆页面然后登录并再次执行。
答案 0 :(得分:22)
我的问题应该更加明确,但我们已经解决了这个问题。这是我们的解决方案:
Http Cookie Manager
Thread A - 1 Thread - 1 Loop Count
- Login Page
- BeanShell PostProcessor
- props.put("MyCookie","${COOKIE_<INSERT ACTUAL COOKIE NAME>}");
Thread B - 50 Threads - Infinite Loop Count
- BeanShell PreProcessor
- import org.apache.jmeter.protocol.http.control.CookieManager;
import org.apache.jmeter.protocol.http.control.Cookie;
CookieManager manager = sampler.getCookieManager();
Cookie cookie = new Cookie("<INSERT ACTUAL COOKIE NAME>",props.get("MyCookie"),"<INSERT DOMAIN NAME>","<INSERT COOKIE PATH>",false,0);
manager.add(cookie);
- Page to hit
- Another page to hit, repeat as needed
然后需要对JMeter进行配置更改:
打开jmeter.properties文件,然后转到&#34; CookieManager.save.cookies = false&#34;并使它=真。
这将允许第一个线程中的登录cookie用于第二个线程。
答案 1 :(得分:6)
这里没有其他解决方案适合我,但他们都有一部分解决方案。这里最终将cookie(JSESSIONID,在我的例子中)从一个线程组传递到另一个线程组的工作原理。注意我不需要将CookieManager.save.cookies
设置为任何内容。
Http Cookie Manager
Thread A - 1 Thread - 1 Loop Count
- Login Page
- BeanShell PostProcessor
- import org.apache.jmeter.protocol.http.control.CookieManager;
import org.apache.jmeter.protocol.http.control.Cookie;
import org.apache.jmeter.testelement.property.PropertyIterator;
import org.apache.jmeter.testelement.property.JMeterProperty;
CookieManager manager = ctx.getCurrentSampler().getCookieManager();
PropertyIterator iter = manager.getCookies().iterator();
while (iter.hasNext()) {
JMeterProperty prop = iter.next();
Cookie cookie = prop.getObjectValue();
if (cookie.getName().equals("JSESSIONID")) {
props.put("MySessionCookie", cookie);
break;
}
}
Thread B - 50 Threads - Infinite Loop Count
- BeanShell PreProcessor
- import org.apache.jmeter.protocol.http.control.CookieManager;
import org.apache.jmeter.protocol.http.control.Cookie;
CookieManager manager = sampler.getCookieManager();
manager.add(props.get("MySessionCookie"));
- Page to hit
- Another page to hit, repeat as needed
答案 2 :(得分:2)
我有与你相同的用例,但我认为有一个更简单的解决方案:在线程组中你可以使用循环控制器。
因此...
Thread Group
Login
Loop Controller
- Page to hit
- Another page to hit
那说我仍然会使用你描述的技巧,因为我认为我们想要登录一次,然后从不同的线程组中并行打几个不同的页面。因此我们将首先登录,然后几个不同的线程组将同时命中服务器。所以你的技巧绝对有用。但是对于简单的情况,我认为循环控制器可以做到这一点。
答案 3 :(得分:1)
为什么不将Http Cookie Manager添加到测试计划级别而不是线程组1并将所有采样器分组到一个线程组中?
Test Plan
Http Cookie Manager
Thread Group
- Login Page
- Page to hit
- Another page to hit
这可以在没有任何其他额外采样器的情况下解决您的问题 或者也许有一些客观的理由来实现你的方式?
...请同时查看this。
答案 4 :(得分:0)
上面的答案确实帮助了我,但HTTP cookie管理器却是 错过了我需要让它工作的细节。 通过设置如下的cookie管理器,它对我有用
Http Cookie Manager
NAME $<ACTUAL_COOKIE_NAME>
VALUE ${COOKIE_<INSERT_ACTUAL_COOKIE_NAME>}
DOMAIN ${SITE}
PATH /
Thread A - 1 Thread - 1 Loop Count
....
Thread B - 50 Threads - Infinite Loop Count
....
答案 5 :(得分:0)
CookieManager
不会在线程之间共享Cookie。出于某种原因,@ ClarenceKlopfstein的方法对我不起作用(jmeter 3.0)。出于某种原因,"${COOKIE_<INSERT ACTUAL COOKIE NAME>}"
似乎没有评估传递的字符串。
所以,这是另一个执行Login的解决方案,然后传递.ASPXAUTH
cookie。它应该没有任何配置更改工作:
在 setUp Thread Group
(重要):
BeanShell PostProcessor:
import org.apache.jmeter.protocol.http.control.CookieManager;
import org.apache.jmeter.protocol.http.control.Cookie;
CookieManager manager = ctx.getCurrentSampler().getCookieManager();
Cookie cookie = manager.get(3); //Find the '.ASPXAUTH' cookie
log.info("Cookie:" + cookie);
props.put("MyCookie",cookie.getValue());
然后在正常的线程组中:
BeanShell PreProcessor:
import org.apache.jmeter.protocol.http.control.CookieManager;
import org.apache.jmeter.protocol.http.control.Cookie;
CookieManager manager = sampler.getCookieManager();
Cookie cookie = new Cookie(".ASPXAUTH",props.get("MyCookie"),"<DOMAIN>","/",false,0);
manager.add(cookie);
答案 6 :(得分:0)
您可以将单个线程组与仅限一次控制器一起使用,而不是使用单独的线程组来记录用户。在 Once Only Controller 下添加 Samplers 以登录并获取会话cookie(当然只会运行一次)。从那时起,线程组将运行其他采样器将会话cookie传递给每个请求。我在测试计划范围内有 HTTP Cookie管理器。
答案 7 :(得分:0)
这对我有用。
Http Cookie Manager
Thread A - 1 Thread - 1 Loop Count
- Login Page
here you get the cookie from the browser and save it to a variable MY_COOKIE)
- JSR223 PostProcessor
props.put("MY_COOKIE",vars.get("MY_COOKIE"))
Thread B - 50 Threads - Infinite Loop Count
- JSR223 PreProcessor
vars.put("MY_COOKIE",props.get("MY_COOKIE"))
- Page to hit
答案 8 :(得分:-2)
对于Cookie中的多个字段我尝试了它的工作
BeanShell Post Processor
props.put("MyCookie","${COOKIE_<FIRST FIELD>}");
props.put("MyCookie1","${COOKIE_<SECOND FIELD>}");
BeanShell Pre Processor
import org.apache.jmeter.protocol.http.control.CookieManager;
import org.apache.jmeter.protocol.http.control.Cookie;
CookieManager manager = sampler.getCookieManager();
Cookie cookie = new Cookie("<FIRST FIELD>",props.get("MyCookie"),"DOMAIN","/",false,0);
manager.add(cookie);
Cookie cookie1 = new Cookie("<SECOND FIELD>",props.get("MyCookie1"),"DOMAIN NAME","/",false,0);
manager.add(cookie1);