当前位置: 首页 > 后端技术 > Java

jMeter中CSVDataSetConfigSharingMode意义详解

时间:2023-04-01 19:14:01 Java

CSVDataSetConfiginSharingMode-MadeEasy为了让性能测试更真实,最好不要在每个线程组使用同一个用户。因此,您需要一种方法来配置ApacheJMeter?以使用具有唯一用户数据的不同用户,并想出如何有效存储将在测试运行期间使用的用户数据的想法。为此,JMeter有一个非常有用的配置元素,称为CSV数据集配置。“CSV数据集配置”允许使用CSV文件作为外部数据源,您可以在其中保存唯一的用户数据,例如姓名、电子邮件和密码。有了这个配置元素,JMeter就可以逐行读取一个CSV文件,然后使用split参数为不同的线程分配不同的值。乍一看,所有“CSV数据集配置”参数似乎都是不言自明的。但是其中之一可能并不像您想象的那么简单。这个参数是“共享模式”。这篇博文将解释您需要了解的有关此选项的所有信息。了解JMeterCSV数据配置元素创建一个具有五个线程的用户组:创建一个用户登录的HTTP请求:您将看到“线程组”中的所有5个用户都使用相同的电子邮件和密码执行了登录。发生这种情况是因为这些值在请求采样器中是硬编码的,并且它们与该线程组中的所有5个用户相关:MultipleUsersWithMultipleRequests但是如果你想在不同的用户下登录怎么办?要模拟真实的Web应用程序负载,您可能希望使用具有不同凭据的不同用户。为此,JMeter有一个“CSV数据集配置”元素,旨在帮助解决此类情况。这个元素的主要思想是逐行读取一个CSV文件,并将它的值提供给当前线程组的线程。有许多有用的文章和实践课程通过不同的示例解释了这个JMeter元素。但首先,让我们创建一个简单的CSV文件,其中包含一个用户列表(每个用户单独一行),每行之间用逗号分隔电子邮件和密码:csv文件的内容:JMeterSharingModeUser1@example.com,123qweJMeterSharingModeUser2@example。com,234werJMeterSharingModeUser3@example.com,345ertJMeterSharingModeUser4@example.com,456rtyJMeterSharingModeUser5@example.com,567tyuJMeterSharingModeUser6@example.com,678yuiJMeterSharingModeUser7@example.com,789uioJMeterSharingModeUser8@example.com,890ipoJMeterSharingModeUser9@example.com,901opqJMeterSharingModeUser10@example.com,012pqw'Allthreads'SharingMode允许我们将“CSVDatasetConfiguration”元素添加到我们的性能脚本中(右键单击TestPlan->Add->ConfigurationElement->CSVDatasetConfiguration)。在此元素中,您需要指定包含用户详细信息和变量名的文件名,这些文件名将用作从文件中获取的这些值的容器。请记住,有两个选项:您需要指定CSV文件的完整路径,或者您可以只使用文件名。但在这种情况下,该文件应该与JMX性能脚本位于同一文件夹中。这次您将使用默认的共享模式:所有线程。重新运行我们的脚本后,可以看到所有用户都按照顺序和行号得到了自己的邮箱和密码:第一个用户使用了第一行的邮箱和密码,第二个使用了第二行的邮箱Mail和password"Allthreads"共享模式表示文件将在所有线程之间共享,每个请求将顺序读取CSV文件中的一行。此方法是“CSV数据集配置”的默认方法。看起来像这样:'Currentthread'共享模式当我们希望每个线程分别打开和读取CSV文件时,应该使用'Currentthread'共享模式。在这种情况下,每个用户都从头到尾读取CSV文件。让我们将共享模式更改为“当前线程”值并验证这次性能脚本的行为。如您所见,这次所有线程都试图在同一用户下运行登录请求。原因很简单。由于每个线程从头到尾分别读取文件,所以我们线程组中的所有5个线程都使用第一行的值执行登录请求。目前,您在线程组中只配置了1个循环。如果您想确保在下一个循环中每个线程都将读取第二行,让我们用“循环计数”中的值“2”更新我们的线程组。由于您有5个线程和2个循环,因此总共应该有10个请求。前5个请求应以第一个用户(CSV文件的第一行)登录,接下来的5个请求应以第二个用户(CSV文件的第二行)登录。让我们运行脚本并确认。但在此之前,向当前线程组添加一个“ConstantTimer”可能会有用。由于要显示两个循环使用csv文件中的不同行,因此需要避免第一个线程执行第一个循环并启动第二个循环而第二个线程刚刚开始执行第一个循环的情况。在这种情况下,ViewResultsTree侦听器中的请求将混合在一起。让我们为此添加2秒超时(右键单击测试组->添加->计时器->常量计时器)。如您所见,前5个请求使用CSV文件的第一行,而接下来的5个请求使用第二行。看起来像这样:'Currentthreadgroup'SharingMode在'Currentthreadgroup'共享模式下,每个文件由每个线程组单独打开(不要与每个线程单独读取文件的'currentthread'混淆。这基本上意味着每个线程组中的每个线程都从头到尾读取CSV文件,彼此独立。要实际演示这种共享模式,您需要创建另一个线程组。您可以复制粘贴现有的并适当重命名线程group和loginsampler,将共享方式改为:当前线程组运行脚本后,可以发现每个线程组使用一个CSV文件:这个案例的流程图看起来比较复杂,但是主要思路是这样的:'Edit'共享模式这种共享模式通常会给许多JMeter用户带来很多困惑。当您选择'SharingMode'配置元素下的'Edit'选项时,该字段将转换为输入。然后,您可以在此字段中提供自己的字符串,而不是使用预定义的字符串。这种共享模式的主要思想是,你可以在多个线程组中使用同一个CSV文件,但只有指定的线程组之间才会共享该文件。似乎有点复杂,对吧?让我们举个例子来说明这一点。首先,你需要添加一个额外的线程组(你可以像我们在上一段中那样复制粘贴),这次让我们复制粘贴每个线程组下的“CSV数据集配置”元素:现在你需要配置每个“CSV数据集配置”这样:线程组1:“SharedMode”=“SharedWithThreadGroup1and3”线程组2:“SharedMode”=“所有线程”ThreadGroup3:“SharedMode”=“SharedWithThreadGroup1and3”“线程组1”配置示例:在这个在这种情况下,第一个和第三个线程组的值应该相互匹配。这样的配置告诉JMeter在两者之间共享一个CSV文件,而第二个线程组将使用它自己的CSV副本。让我们再次运行脚本并再次验证正在进行的请求:第一个线程组:第二个线程组:第三个线程组:如您所见,前两个线程组从头读取CSV文件并使用第一行,而第三个线程组没有。由于第三个线程组与第一个线程组具有相同的“共享模式”值,因此它继续从第一个线程组结束的行(提供的示例中的第一行)读取文件。通过提供这种共享模式“CSV数据集配置”元素,您可以非常灵活地以任何您想要的方式控制CSV文件共享。当前模式可以这样形象化:如您所见,“CSV数据集配置”具有很强的可配置性并提供很大的灵活性,因此您始终可以根据需要控制CSV文件的使用。更多Jerry原创文章在这里:《王子熙》: