从 Jmeter 中的 CSV 文件中随机选择

问题描述 投票:0回答:8

我有一个非常大的 CSV 文件(8000 多个项目),我正在使用 CSV 数据集配置元素读取该文件。它填充 HTTP 请求采样器的路径并使用 while 控制器进行迭代。

这很好,除了我想要的是让每个用户(线程)从 CSV URL 列表中选择一个随机 URL。我不想要的是每个线程依次使用 CSV 项目。

我能够使用带有多个 HTTP 请求采样器的随机顺序控制器来实现这一点,但是 8000 多个 HTTP 采样器确实使 jmeter 陷入了无法使用的状态。这就是我将 HTTP 采样器 URL 放入 CSV 文件中的原因。然而,我似乎无法将随机顺序控制器与 CSV 文件数据一起使用。那么如何实现每个线程随机选择 CSV 数据项呢?

csv random jmeter performance-testing
8个回答
9
投票

还有另一种方法可以实现这一目标:

  • 创建一个单独的线程组
  • 取决于您想要实现的目标:
    • 添加(随机)循环计数 -> 这将为执行该工作的线程组设置起始偏移量
    • 添加循环计数或永远和计时器,并让它在另一个线程组运行时循环。该线程组将读取“伪”随机行

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


3
投票

读取csv数据时没有随机选择功能。原因是您需要首先将整个文件读入内存才能执行此操作,这对于负载测试工具(任何负载测试工具)来说是一个坏主意。

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

注意。如果您确保为 CSV 数据集配置设置默认的

All Threads
,那么数据在 JMeter 进程的范围内将是唯一的。


3
投票

BlazeMeter 插件的新随机 CSV 数据集配置应该完全满足您的需求。


1
投票

正如其他答案所述,您无法随机选择一行的原因是您必须将整个文件读入内存,这是低效的。

与其尝试让 JMeter 动态处理这个问题,为什么不在开始测试之前随机化文件顺序本身呢?

Perl 等脚本语言可以轻松完成此任务:

 cat unrandom.csv | perl -MList::Util=shuffle -e 'print shuffle<STDIN>' > random.csv

1
投票

对于我的情况:

  • 单栏
  • 小数据集
  • 不变的 CSV

我只是放弃使用 CSV 并参考 https://stackoverflow.com/a/22042337/6463291 并使用 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]);

性能似乎还可以,如果您遇到同样的问题可以尝试一下。


0
投票

我不确定这是否有效,但无论如何我会建议它。

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

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

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

您可能想尝试一下。请分享您的发现。


0
投票

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


0
投票

上面建议的 blazemeter 插件效果很好。预计它必须加载整个文件,但对于我的应用程序来说,这正是我所需要的。我将其与 Jmeter 5.6.2 一起使用

© www.soinside.com 2019 - 2024. All rights reserved.