18

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

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

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

4

7 回答 7

9

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

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

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

于 2014-06-25T15:29:47.803 回答
3

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

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

笔记。如果您确保All Threads为 CSV 数据集配置设置了默认值,那么数据在 JMeter 进程的范围内将是唯一的。

于 2013-09-22T18:01:32.470 回答
3

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

于 2018-07-19T12:00:48.730 回答
1

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

与其试图让 JMeter 即时处理这个问题,不如在开始测试之前随机化文件顺序本身?

诸如 perl 之类的脚本语言可以简化以下工作:

 cat unrandom.csv | perl -MList::Util=shuffle -e 'print shuffle<STDIN>' > random.csv
于 2016-01-07T00:23:27.673 回答
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]);

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

于 2021-09-15T08:46:26.200 回答
0

我不确定这是否可行,但无论如何我都会建议它。

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

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

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

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

于 2013-08-28T12:59:11.427 回答
0

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

于 2017-06-13T08:48:59.857 回答