如何在JMeter中为每个线程发送唯一的数据

6
我正在使用JMeter测试我的REST API,进行了10000次访问,每个HTTP访问都会在数据库中存储一些数据。我遵循了以下测试计划。

enter image description here

我正在并行运行10个线程,每个线程的启动时间为20秒,并循环1000次以达到相同的效果。

enter image description here

但问题在于我的线程没有使用唯一的数据集。而我的后端HTTP URL需要每次http请求都有唯一的字符串。
现在我已经尝试了以下方法。
1. 使用单个CSV数据集配置,其中包含10000个唯一值,并且线程组中的所有线程都读取相同的数据。 2. 为每个线程使用不同的CSV数据集,并使用filename $ {__threadNum} .csv分配csv文件。 3. 使用jmeter _RandomString方法在运行时生成随机字符串以进行每个http请求,在http post body中传递如下内容: {"tenantName":"${__RandomString(15,abcdefghijklmnofqrst1234567#@#%^&*,)}"} 4. 在HTTP Request采样器中使用BeanShell预处理器调用Java方法并始终生成唯一模式。
现在以上方法都对我无效。在运行测试计划时,经过一段时间后,2个线程尝试使用相同的数据并命中我的HTTP URL。我从http响应中得到冲突错误。我的错误计数不断增加。
现在我真的不明白这两个线程如何尝试使用相同的数据来命中http?

请有人解释一下问题,并帮助我设置正确的测试计划配置。

编辑:

所有线程的CSV数据集配置:

enter image description here

HTTP请求:

enter image description here


使用CSV数据集添加测试计划:

enter image description here


这个问题解决了吗?如果解决了,请分享解决方案,谢谢! - Helping Hands
“sharing mode = all threads” 应该为每次迭代提供唯一的值。例如,如果有两个线程,则线程1将读取第一个条目,线程2将读取第二个条目,然后在下一次迭代中,线程1将读取第三个条目,线程2将读取第四个条目,以此类推。 - shonky linux user
6个回答

4

2
除了Ubik和DmitrT的所有建议之外,我会将CSV配置元素放在线程组之外。让我知道。

1
我曾经遇到过一个用户定义变量元素的同样问题。在其中,我创建了一个UUID并将其分配给一个变量。我期望每个线程生成不同的UUID,但事实并非如此。
解决方案(适用于我) 添加一个Beanshell采样器。在其中,使用UUID生成唯一值,并使用put方法将该值存储在“vars”中。每个线程都将执行代码并拥有自己的唯一值。
示例:生成和存储每个线程都可以使用的唯一accountId。
String uniqueId = "${__UUID()}";
vars.put("accountId", uniqueId);

我希望这有所帮助!

1
CSV方法可以,但是你如何配置csv数据集并将其放入方案中?
确保将“EOF后重复利用”设置为false以确保不重复使用任何数据。
你能展示一下吗?
你也能显示HTTP请求内容吗?
编辑2015年9月1日:
您的csv配置未声明变量名称,其中应包含tenantName。
还要将fileName路径字段替换为\或/。

嗨,已经编辑了问题,并附上了CSV数据集和HTTP请求。请查看。 - bagui
已添加带有CSV数据集的测试计划,请检查。 - bagui
我已经在HTTP请求中定义了变量,并且相同的变量名是CSV标题,因此正在替换。此外,我认为这不是文件路径分隔符的问题,因为文件内容正在被处理。 - bagui

1
将csv数据集配置放在线程组外部,并将共享模式设置为“所有线程”,这是最简单的方法,可以解决您的问题。即使有多个线程组,您也可以在共享模式下使用此csv数据,并且每个线程将自动选择唯一的数据。

1
如果您需要发送随机的独特数据,我相信 __UUID()函数可以帮助您。每次调用时,它会生成随机的独特GUID结构,似乎正是您要寻找的。有关此功能以及更多JMeter函数的说明和演示,请参见如何使用JMeter函数系列文章。

嗨,我在我的请求参数中尝试了__uuid。但有时候当发出HTTP请求时,两个线程向我传递相同的数据。 - bagui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接