在Jmeter中从CSV文件中随机选择数据

19

我有一个非常大的CSV文件(8000+项)包含URL,我通过CSV Data Set Config元素读取它。它正在填充HTTP请求采样器的路径,并使用while控制器进行迭代。

这很好,但我希望每个用户(线程)从CSV URL列表中随机选择一个URL。我不希望每个线程按顺序使用CSV项。

我尝试使用具有多个HTTP请求采样器的随机顺序控制器来实现此目的,但是8000+ HTTP采样器会导致jmeter变得难以使用。因此,我将HTTP采样器URL放入了CSV文件中。然而,似乎无法使用Random Order Controller与CSV文件数据。那么,如何实现每个线程随机选择CSV数据项?

9个回答

9
有另外一种方法可以实现这个:
  • 创建一个单独的线程组
  • 根据您想要实现的目标:
    • 添加一个(随机)循环计数器 -> 这将为执行工作的线程组设置一个起始偏移量
    • 添加循环计数器或永久循环以及计时器,并让它在另一个线程组运行时循环。这个线程组将读取“伪”随机行

它不是真正的随机,文件仍然按顺序读取,但您的工作线程在文件中跳跃。对我有用;-)


4

3
OP需要解决的是“一个非常大的文件”的问题,但是这个插件在这种情况下无法很好地工作,因为它只能在测试初始化时将文件读入内存(插件自己的文档证实了这个问题)。虽然这是方便的方法,但是它不具有可扩展性。 - Oliver Lloyd

3

在读取csv数据时,没有随机选择功能。原因是需要先将整个文件读入内存才能进行此操作,对于任何负载测试工具(任何负载测试工具)来说,这都是一个不好的想法。

其他商业工具通过自动重新处理数据来解决这个问题。在JMeter中,您可以通过使用任意字段简单地对数据进行排序来手动实现相同的效果。如果按姓氏排序,则结果就是有效的随机分布。

请注意。如果确保CSV数据集配置的默认 All Threads 设置,则该数据将在JMeter进程的范围内是唯一的。


我建议采用Oliver Lloyd提出的答案。可以通过使用JSR223采样器或编写一个在jmeter之前运行并随机csv文件中的行的小程序来随机化csv数据集文件。 - dina

1

针对我的情况:

  • 单列
  • 小数据集
  • 不变的CSV文件

我只需放弃使用CSV并参考https://dev59.com/_nzaa4cB1Zd3GeqPWfCK#22042337,使用Bean预处理器代替,类似于以下内容:

String[] query = new String[]{"csv_element1", "csv_element2", "csv_element3"};
Random random = new Random();
int i = random.nextInt(query.length);
vars.put("randomOption",query[i]);

性能似乎还不错,如果你遇到了同样的问题可以尝试这个方法。


1
作为其他答案所述,你无法随机选择一行的原因是因为你需要将整个文件读入内存,这是低效的。
与其试图让JMeter即时处理这个问题,为什么不在测试开始之前随机化文件顺序呢?
像perl这样的脚本语言可以轻松解决这个问题:
 cat unrandom.csv | perl -MList::Util=shuffle -e 'print shuffle<STDIN>' > random.csv

0
一个可能的解决方案,可能会起作用,但尚未讨论的是将测试分布到运行JMeter的多个代理上。(这就是基于云的JMeter负载测试的基本概念。)您可以将大型CSV文件分割成多个部分,然后将每个部分分发给并行运行的JMeter实例。随机CSV数据集配置对于较小的分割CSV文件的文件大小问题会更少。至少有一个流行的基于云的平台允许您将CSV文件在负载生成器实例之间分割- 只需单击一次 - 每个实例都运行您的JMeter负载测试的相同副本。

0
一个非常简单的解决方案。 在 CSV 文件中,添加另一列(比如 B 列) 在第一个单元格(比如 B1)应用 =RAND() 函数。这将创建一个随机浮点数。 将该单元格(比如 B1)的角拖动以应用于所有相应的 URL。 对 B 列进行排序。 您的 URL 将随机排序。 删除 B 列。

0

我不确定这个方法是否可行,但我还是建议一下。

为什么不将您的URL分成100个不同的CSV文件。然后在每个线程中生成随机数,并使用该数字来识别要使用__CSVRead函数读取的CSV文件。

CSVRead">http://jmeter.apache.org/usermanual/functions.html#_CSVRead

现在我唯一不确定的部分是 __CSVRead 函数是否每次重新打开文件还是在线程之间共享相同的文件句柄。

您可以尝试一下,请分享您的发现。


0
这是我的解决方法。我知道这是一个旧的帖子,但还是发表一下,因为jMeter仍然没有一种原生的方法来从参数文件中选择随机值。
你可以将文件转换为json列表。如果你有一个CSV文件,你只需要用双引号括起每一行,并用方括号括起整个列表。例如,像这样的CSV文件将变成以下的json列表。
param1,
param2,
param3

["param1",
"param2",
"param3"]

在执行此操作之后,可以使用HTTP请求采样器来读取此文件,如下所示: enter image description here 现在,在此HTTP请求中添加一个JSON提取器后处理器,并解析一个随机的JSON值!JSON路径表达式字段应包含$.*,匹配编号应为0

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