jMeter 里 CSV Data Set Config Sharing Mode 的含义详解
CSV Data Set Config in Sharing Mode - Made Easy
为了使性能测试更加真实,最好不要在每个线程组中使用相同的用户。因此,您需要一种方法来配置 Apache JMeter™ 以使用具有唯一用户数据的不同用户,并提出有关如何有效存储将在测试运行期间使用的用户数据的想法。
为此,JMeter 有一个非常有用的配置元素,称为 CSV 数据集配置。 “CSV 数据集配置”允许使用 CSV 文件作为外部数据源,您可以在其中保留唯一的用户数据,如姓名、电子邮件和密码。借助这个配置元素,JMeter 能够逐行读取 CSV 文件,然后使用拆分参数为不同的线程分配不同的值。
乍一看,所有“CSV 数据集配置”参数似乎都是不言自明的。但其中之一可能并不像您想象的那么简单。此参数为“共享模式”。这篇博文将解释您需要了解的有关此选项的所有信息。
Understanding the JMeter CSV Data Config Element
创建一个包含五个线程的 user group:
创建一个用户登录的 HTTP 请求:
您将看到“线程组”中的所有 5 个用户都使用相同的电子邮件和密码执行了登录。 发生这种情况是因为这些值是在请求采样器中硬编码的,并且它们与该线程组中的所有 5 个用户相关:
Multiple Users With Multiple Requests
但是如果你想在不同的用户下登录怎么办?要模拟真实的 Web 应用程序负载,您可能希望使用具有不同凭据的不同用户。为此,JMeter 具有“CSV 数据集配置”元素,旨在帮助解决此类情况。
此元素的主要思想是它逐行读取 CSV 文件并将其值提供给当前线程组的线程。有许多有用的文章和实践会议通过不同的示例解释了这个 JMeter 元素。
但首先,让我们创建一个简单的 CSV 文件,其中包含一个用户列表(每个用户在单独的一行),电子邮件和密码在每行之间用逗号分隔:
csv 文件的内容:
JMeterSharingModeUser1@example.com,123qwe JMeterSharingModeUser2@example.com,234wer JMeterSharingModeUser3@example.com,345ert JMeterSharingModeUser4@example.com,456rty JMeterSharingModeUser5@example.com,567tyu JMeterSharingModeUser6@example.com,678yui JMeterSharingModeUser7@example.com,789uio JMeterSharingModeUser8@example.com,890ipo JMeterSharingModeUser9@example.com,901opq JMeterSharingModeUser10@example.com,012pqw
'All threads’ Sharing Mode
让我们将“CSV 数据集配置”元素添加到我们的性能脚本中(右键单击“测试计划” -> 添加 -> 配置元素 -> CSV 数据集配置)。 在此元素中,您需要指定包含用户详细信息和变量名称的文件名,这些文件名将用作从文件中获取的这些值的容器。
请记住,有两个选项:您需要指定 CSV 文件的完整路径,或者您可以只使用文件名。 但在这种情况下,该文件应与 JMX 性能脚本位于同一文件夹中。 这次您将使用默认共享模式:所有线程。
重新运行我们的脚本后,您可以看到所有用户根据顺序和行号分别获取了电子邮件和密码:
第一个用户使用了第一行的电子邮件和密码
第二个使用了第二行的电子邮件和密码
“所有线程”共享模式意味着文件将在所有线程之间共享,并且每个请求将按顺序读取 CSV 文件中的一行。 这种方式是“CSV 数据集配置”的默认方式。 它看起来像这样:
'Current thread’ Sharing Mode
当我们希望每个线程分别打开和读取 CSV 文件时,应使用“当前线程”共享模式。 在这种情况下,每个用户都会从头到尾读取 CSV 文件
。 让我们将共享模式更改为“当前线程”值并验证性能脚本这次的行为。
如您所见,这次所有线程都尝试在同一用户下运行登录请求。 原因很简单。 由于每个线程从头到尾分别读取文件,我们线程组的所有 5 个线程都使用第一行的值执行登录请求。
目前,您在线程组中只配置了 1 个循环。 如果你想确保在下一个循环中每个线程都会读取第二行,让我们用“循环计数”中的“2”值更新我们的线程组。
由于您有 5 个线程和 2 个循环,因此总共应该有 10 个请求。 前 5 个请求应该在第一个用户(CSV 文件的第一行)下执行登录操作,而接下来的 5 个请求应该在第二个用户(CSV 文件的第二行)下执行登录操作。
让我们运行脚本并确认。 但在此之前,在当前线程组中添加一个“Constant Timer”可能会很有用。 由于您想显示两个循环使用来自 csv 文件的不同行,因此您需要避免第一个线程执行第一个循环并启动第二个循环而第二个线程刚刚开始第一个循环执行的情况。 在这种情况下,“查看结果树”侦听器中的请求将是混合的。 让我们为此添加一个 2 秒的超时时间(右键单击“测试组”-> 添加 -> 计时器 -> 恒定计时器)。
如您所见,前 5 个请求使用 CSV 文件的第一行,而后 5 个请求使用第二行。 它看起来像这样:
'Current thread group’ Sharing Mode
在'Current thread group'共享模式下,每个文件由每个线程组单独打开(不要与每个线程单独读取文件的“当前线程”混淆。这基本上意味着每个线程组中的每个线程 从头到尾读取 CSV 文件,互不影响。
要实际展示这种共享模式,您需要再创建一个线程组。 您可以复制粘贴现有的并适当地重命名线程组和登录采样器。
把 sharing mode 改成:Current thread group
运行脚本后,可以发现每个线程组分别使用了CSV文件:
这个案例的工作流图看起来更复杂,但主要思想是这样的:
'Edit’ Sharing Mode
这种共享模式通常会给很多 JMeter 用户带来很多困惑。 当您选择“共享模式”配置元素下的“编辑”选项时,此字段将转换为输入。 然后,您可以在此字段中提供您自己的字符串,而不是使用预定义的字符串。
这种共享模式的主要思想是您可以在多个线程组中使用同一个 CSV 文件,但只有指定的线程组才会在彼此之间共享该文件。 好像有点复杂吧? 让我们举一个例子来说明这一点。
首先,您需要添加一个额外的线程组(您可以按照我们在上一段中所做的相同方式复制粘贴),这次让我们将“CSV 数据集配置”元素复制粘贴到每个线程组下:
现在您需要以这种方式配置每个“CSV 数据集配置”:
线程组 1:“共享模式”=“SharedWithThreadGroup1and3” 线程组 2:“共享模式”=“所有线程” 线程组 3:“共享模式”=“SharedWithThreadGroup1and3”
“线程组 1”配置示例:
在这种情况下,第一个和第三个线程组的值应该相互匹配。 这样的配置告诉 JMeter 在两者之间共享一个 CSV 文件,而第二个线程组将使用它自己的 CSV 副本。 让我们再次运行脚本并再次验证正在进行的请求:
第一线程组:
第二线程组:
第三线程组:
如您所见,前两个线程组从头开始读取 CSV 文件并使用第一行,而第三个线程组则没有。 由于第三个线程组与第一个线程组具有相同的“共享模式”值,因此它继续从第一个线程组结束的行(提供的示例中的第一行)读取文件。
通过提供这种共享模式“CSV 数据集配置”元素,您可以非常灵活地以任何您想要的方式控制 CSV 文件共享。 这种当前模式可以这样形象化:
如您所见,“CSV 数据集配置”非常可配置并提供了极大的灵活性,因此您始终可以根据需要控制 CSV 文件的使用。