我添加了两个请求登录以存储会话ID,另一个请求检查负载测试需要会话ID。我只将登录请求设置为一次,只需将其添加为仅限一次控制器的子项。但是当我通过添加大约100或200个线程测试它时,登录也运行了那么多时间。我想只运行启动线程的登录请求。可能吗?下面我添加了测试用例层次结构。
ThreadGroup:
Htp requestdefault
HTTP cookie manager
once only controller
login Http request
Http request for number of users
答案 0 :(得分:28)
“ONLY ONCE”控制器无法按照您的想法运行。
它只运行“一次”PER THREAD。因此,如果你有100个线程,它将运行100次。
如果您希望它运行ONCE PER TEST,请执行以下操作:
Test Plan (Set thread groups to "run consecutively"
- Cookie Manager
- Thread Group A (1 thread, 1 loop)
- - - Login Logic
- Thread Group B
- - - Rest of test
请注意,如果您需要在线程组A和B之间共享任何变量,则需要将它们设置为属性。变量不能在线程组之间共享,但属性可以。您需要使用属性函数。
函数__setProperty自动将值存储为全局变量。最简单的启动__setProperty的方法是创建一个POST处理器Beanshell脚本作为在THREAD A中创建cookie的采样器的子项。要在THREAD B中检索值,可以将__property函数添加为参数的VALUE。需要cookie值。
Beanshell脚本看起来像这样:
props.put("COOKIENAME","COOKIEVALUE"); //creates a property "COOKIENAME" with value "COOKIEVALUE"
print(props.get("COOKIENAME")); //prints the value out to the console
上面的代码对于COOKIENAME总是具有相同的值,少于想法。因此,我们需要确保“COOKIEVALUE”是动态的。我建议使用POST-PROCESSOR正则表达式来提取cookie值,然后将其传递给beanshell脚本。
所以,我们的测试计划现在看起来像这样:
Test Plan (Set thread groups to "run consecutively"
- Thread Group A (1 thread, 1 loop)
- - - Login Logic
- - - - - Regex to grab cookie, store as "regexCookie"
- - - - - Beanshell to set property
- Thread Group B
- - - Rest of test
我们的beanshell脚本现在看起来像:
props.put("COOKIENAME",vars.get("regexCookie")); //creates a property "COOKIENAME" with value from "regexCookie"
print(props.get("COOKIENAME")); //prints the value out to the console
用户手册的链接:
答案 1 :(得分:4)
在新版本的JMeter中,您可以添加一个“setUp Thread Group”,它可以完全满足您的需求。
可用于执行预测试操作的特殊类型的ThreadGroup。这些线程的行为与普通的Thread Group元素完全相同。区别在于这些类型的线程在测试进行到常规线程组的执行之前执行。
http://jmeter.apache.org/usermanual/component_reference.html#setUp_Thread_Group
答案 2 :(得分:2)
您可以将“登录HTTP请求”放在Once Only控制器中,将普通的“HTTP请求”放在Loop控制器中。现在,您可以设置循环以执行100或200次HTTP请求。看到: jmeter.apache.org/usermanual/component_reference.html#Loop_Controller
使用计时器进行更真实的测试。假设您希望在120秒内发生200个请求,那么您可以使每个请求暂停120/200秒。大多数计时器使用毫秒数,因此您可以使用该数字(120/200 * 1000)毫秒。看到: jmeter.apache.org/usermanual/component_reference.html#timers
您还可以创建一个单独的安装线程组,您可以在其中执行登录并在另一个线程组中执行200个线程。查看这篇文章: http://www.informit.com/guides/content.aspx?g=java&seqNum=520
所有这些信息都可以帮助您朝着正确的方向前进。祝你好运!
答案 3 :(得分:0)
只有一次控制器以BlackGaff解释它的方式工作。
您尝试做的事情似乎有误,因为这意味着您使用相同的登录名/密码对100位用户进行身份验证。
但是如果你仍然想要这样做,你可以将setupThread与一个用户一起使用,它通常对测试中的一些init任务很有用,但绝不会回答你的要求,这对我来说似乎是错误的。
答案 4 :(得分:0)
在Jmeter 2.9中,您可以使用“仅限控制器”和“循环控制器”来执行此操作。
太棒了!
弗兰克
答案 5 :(得分:0)
${__groovy(${__threadNum} == 1 && vars.getIteration() == 1)}