JMeter-为什么仅一次控制器运行多次

JMeter-为什么仅一次控制器运行多次,jmeter,Jmeter,我添加了两个请求,一个用于登录以存储会话id,另一个用于检查需要会话id的负载测试 ThreadGroup: HTTP request default HTTP cookie manager once only controller login HTTP request HTTP request for number of users 通过将其添加为一次性控制器的子级,我以一次性方式发出了登录请求 ThreadGroup: HTTP request defaul

我添加了两个请求,一个用于登录以存储会话id,另一个用于检查需要会话id的负载测试

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 
通过将其添加为一次性控制器的子级,我以一次性方式发出了登录请求

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 
但是当我通过添加大约100或200个线程来测试它时,登录也运行了那么多时间。我只想为启动线程运行登录请求。可能吗?下面我添加了我的测试用例层次结构

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 
您可以将“登录HTTP请求”放在一次性控制器中,将正常的“HTTP请求”放在循环控制器中。现在,您可以将循环设置为执行HTTP请求100或200次。见: jmeter.apache.org/usermanual/component_reference.html#Loop_Controller

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 
使用计时器进行更真实的测试。假设您希望200个请求在120秒内发生,那么您可以让每个请求暂停120/200秒。大多数计时器都是以毫秒为单位工作的,因此您可以将该数字设为(120/200*1000)毫秒。见: jmeter.apache.org/usermanual/component_reference.html#timers

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 
您还可以创建一个单独的安装线程组,在其中登录,并在另一个线程组中执行200个线程。检查这篇文章:

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 
所有这些信息都将帮助您朝着正确的方向前进。祝你好运

只有一次的控制器不能像你想象的那样工作

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 
每个线程“只运行一次”。因此,如果您有100个线程,它将运行100次

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 
如果希望每个测试运行一次,请执行以下操作:

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 
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之间共享任何变量,则需要将它们设置为属性。变量不能在线程组之间共享,但属性可以。您需要为此使用properties函数

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 
函数_setProperty会自动将该值存储为全局变量。启动_setProperty最干净的方法是创建一个后处理器Beanshell脚本,作为在线程a中创建cookie的采样器的子级。要检索线程B中的值,请添加_属性函数作为需要cookie值的参数的值

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 
Beanshell脚本如下所示:

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 
props.put("COOKIENAME","COOKIEVALUE");   //creates a property "COOKIENAME" with value "COOKIEVALUE" 
print(props.get("COOKIENAME"));   //prints the value out to the console
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
上面的代码对于COOKIENAME总是具有相同的值,小于idea。因此,我们需要确保“COOKIEVALUE”是动态的。我建议使用后处理器正则表达式来提取cookie值,然后将其传递到beanshell脚本中

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 
因此,我们的测试计划如下所示:

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 
props.put("COOKIENAME","COOKIEVALUE");   //creates a property "COOKIENAME" with value "COOKIEVALUE" 
print(props.get("COOKIENAME"));   //prints the value out to the console
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脚本现在看起来像:

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 
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
指向用户手册的链接:

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 

只有一次控制器按照BlackGaff解释的方式工作

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 
您试图做的似乎是错误的,因为这意味着您要用相同的登录名/密码验证您的100个用户

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 

但是,如果您仍然想这样做,您可以对一个用户使用setupThread,它通常对测试中的某些init任务有用,但并不意味着它满足了您的要求,这在我看来是错误的。

在Jmeter 2.9中,您可以使用“一次性控制器”和“循环控制器”来实现这一点

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 
太棒了

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 

Frankie

在新版本的JMeter中,您可以添加一个“设置线程组”,它完全满足您的需要

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 
一种特殊类型的螺纹组,可用于执行测试前操作。这些线程的行为与普通线程组元素完全相同。区别在于,这些类型的线程在测试继续执行常规线程组之前执行

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 

     ThreadGroup: 
     HTTP request default 
     HTTP cookie manager
         once only controller
     login HTTP request
     HTTP request for number of users 
    
  • 每根线一次:放在下面
  • 测试开始时一次:将其置于
  • 一旦测试结束,你可以把它放在下面
  • 一次过测试

我想一次发送所有请求,如果我把“普通HTTP请求”放在循环控制器中,那么每个请求都会一个接一个地执行,这意味着在完成第一个请求后,它只会启动第二个请求。因此,我无法找到有多少请求将导致连接崩溃。我对一次性控制器还有一个疑问,我仍然无法理解一次性控制器的功能。在我的测试用例中,它正在为线程组中提到的所有线程运行。它应该只为测试用例运行一次,对吗?。请在此方面提供帮助。非常感谢您的回复,但我仍在为如何存储和获取财产价值而挣扎。你能告诉我在哪里存储属性值以及如何在另一个线程中获取它们吗。我想存储来自“线程A”的cookie管理器值,并在“线程B”中获取它。通过使用function helper,我通过选择function u属性得到一个字符串,但我不知道在哪里存储该字符串以使其成为全局字符串。function u属性自动将其存储为全局变量。启动_setProperty最干净的方法是创建一个后处理器Beanshell脚本,作为在线程a中授予cookie的采样器的子级。要检索线程B中的值,请添加_属性函数作为需要cookie值的参数的值。希望这有帮助(编辑原始回复以反映这一点)这是一个很好的答案。我想补充一点,您可以像这样从其他线程组检索属性值:${uuuu属性(COOKIENAME)}