正则表达式(Regular Expressions)
正则表达式用于根据模式搜索和操作文本。 JMeter通过包含模式匹配软件Apache Jakarta ORO来解释整个JMeter测试计划中使用的正则表达式或模式的形式。
通过使用正则表达式,我们可以在创建或增强测试计划时节省大量时间并获得更大的灵活性。 正则表达式提供了一种在不可能或很难预测结果时从页面获取信息的简单方法。
使用表达式的标准用法示例是从服务器响应中获取会话ID。 如果服务器返回唯一的会话密钥,我们可以使用加载脚本中的表达式轻松获取它。
要在测试计划中使用正则表达式,需要使用JMeter的正则表达式提取器。 您可以将正则表达式放在测试计划的任何组件中。
值得强调的是,在响应断言测试元素上使用的contains和matches之间的区别 -
contains表示正则表达式至少与目标的某些部分匹配,因此'alphabet'“包含”'ph.b.' 因为正则表达式匹配子字符串'phabe'。
matches表示正则表达式与整个目标匹配。 因此''字母'与'al。* t'“匹配”。
假设您要匹配网页的以下部分 -
name="file" value="readme.txt"
并且您想要提取readme.txt。 一个合适的正则表达式是 -
name="file" value="(.+?)">
上面的特殊字符是 -
(和) - 这些包含要返回的匹配字符串的部分
. - 匹配任何角色
+ - 一次或多次
? - 第一场比赛成功时停止
创建JMeter测试计划
让我们通过编写测试计划来理解正则表达式提取器 - 后处理器元素中正则表达式的使用。 此元素使用正则表达式从当前页面提取文本,以标识所需元素符合的文本模式。
首先,我们编写一个HTML页面,其中列出了人员及其电子邮件ID。 我们将它部署到我们的tomcat服务器。 html(index.html)的内容如下 -
<html>
<head>
</head>
<body>
<table style="border: 1px solid #000000;">
<th style="border: 1px solid #000000;">ID</th>
<th style="border: 1px solid #000000;">name</th>
<th style="border: 1px solid #000000;">Email</th>
<tr>
<td id="ID" style="border: 1px solid #000000;">3</td>
<td id="Name" style="border: 1px solid #000000;">Manisha</td>
<td id="Email" style="border: 1px solid #000000;">manisha@domain.com</td>
</tr>
<tr>
<td id="ID" style="border: 1px solid #000000;">4</td>
<td id="Name" style="border: 1px solid #000000;">joe</td>
<td id="Email" style="border: 1px solid #000000;">joe@domain.com</td>
</tr>
</table>
</body>
</html>
在tomcat服务器上部署它时,此页面将如下面的屏幕截图所示 -
在我们的测试计划中,我们将选择在上面的人员列表页面中看到的人员表的第一行中的人。 要捕获此人的ID,让我们首先确定我们将在第二行中找到该人的模式。
从下面的快照中可以看出,第二个人的ID被
和 td>包围,它是具有这种模式的第二行数据。我们可以使用它来匹配我们想要从中提取信息的确切模式。 由于我们想从这个页面提取两条信息,人员ID和人名,这些字段定义如下 -启动JMeter,添加一个线程组Test Plan 》 Add》 Threads(Users)》 Thread Group 。
接下来添加一个采样器HTTP请求,选择测试计划,右键单击Add 》 Sampler 》 HTTP Request并输入详细信息,如下所示 -
Name - 管理
Server Name or IP - localhost
Port Number - 8080
Protocol - 我们将此保持为空,这意味着我们希望HTTP作为协议。
Path - jmeter/index.html
接下来,添加正则表达式提取器。 选择HTTP Request Sampler(Manage),右键单击Add 》 Post Processor 》 Regular Expression Extractor 。
下表提供了上述屏幕截图中使用的字段的说明 -
领域 | 描述 | |||
---|---|---|---|---|
参考名称 | 将存储提取的测试的变量的名称(refname)。 | |||
正则表达式 | 要提取的文本将与之匹配的模式。 将提取的文本组由字符'('和')'括起来。 我们用'。+?' 指示 | .. td>标记所包含的文本的单个实例。 | 在我们的例子中,表达式是 -(+?) td>\s * | (+?) td>\s * |
Template | 每组提取的文本作为变量Person的成员放置,遵循由'('和')'包围的每组模式的顺序。 每个组都存储为refname_g#,其中refname是您输入的字符串作为引用名称,#是组号。 $ 1 $表示组1,$ 2 $表示组2等。$ 0 $表示整个表达式匹配的任何内容。 在此示例中,我们提取的ID保留在Person_g1中,而Name值保存在Person_g2中。 | |||
比赛号码 | 由于我们计划仅提取此模式的第二次出现,匹配第二个志愿者,我们使用值2.值0将进行随机匹配,而负值需要与ForEach控制器一起使用。 | |||
Default | 如果找不到该项,则这将是默认值。 这是个可选的选项。 你可以留空。 |
添加侦听器以捕获此测试计划的结果。 右键单击“线程组”,然后选择“添加”>“侦听器”>“查看结果树”选项以添加侦听器。
将测试计划保存为reg_express_test.jmx并运行测试。 输出将成功,如以下屏幕截图所示 -