jMeter - 正则表达式
正则表达式用于根据模式搜索和操作文本。JMeter 通过包含模式匹配软件Apache Jakarta ORO来解释整个 JMeter 测试计划中使用的正则表达式或模式的形式。
通过使用正则表达式,我们在创建或增强测试计划时当然可以节省大量时间并获得更大的灵活性。当不可能或很难预测结果时,正则表达式提供了一种从页面获取信息的简单方法。
使用表达式的标准用法示例是从服务器响应中获取会话 ID。如果服务器返回唯一的会话密钥,我们可以使用加载脚本中的表达式轻松获取它。
要在测试计划中使用正则表达式,您需要使用 JMeter 的正则表达式提取器。您可以将正则表达式放置在测试计划中的任何组件中。
值得强调contains和matches之间的区别,如响应断言测试元素中所使用的那样 -
contains表示正则表达式至少匹配目标的某些部分,因此 'alphabet' “包含” 'ph.b.' 因为正则表达式匹配子字符串“phabe”。
matches表示正则表达式匹配整个目标。因此,“alphabet”与“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 =“ID”>和</td>包围,并且它是具有这种模式的第二行数据。我们可以使用它来匹配我们想要从中提取信息的确切模式。由于我们想要从此页面中提取两条信息,人员 ID 和人员姓名,因此字段定义如下 -
启动JMeter,添加一个线程组测试计划→添加→线程(用户)→线程组。
接下来添加采样器 HTTP 请求,选择测试计划,右键单击添加 → 采样器 → HTTP 请求并输入详细信息,如下所示 -
名称- 管理
服务器名称或 IP - localhost
端口号- 8080
协议- 我们将保留此空白,这意味着我们希望 HTTP 作为协议。
路径- jmeter/index.html
接下来,添加正则表达式提取器。选择 HTTP 请求采样器(管理),右键单击添加 → 后处理器 → 正则表达式提取器。
下表提供了上面屏幕截图中使用的字段的描述 -
先生编号 | 字段和描述 |
---|---|
1 | 参考名称 将存储提取的测试的变量的名称(refname)。 |
2 | 正则表达式 将匹配要提取的文本的模式。将提取的文本组由字符“(”和“)”括起来。我们使用“.+?” 指示 <td..>..</td> 标记所包含的文本的单个实例。在我们的示例中,表达式为 - <td id = "ID">(+?)</td>\s*<td id = "Name">(+?)</td>\s* |
3 | 模板 每组提取的文本都作为变量 Person 的成员放置,遵循由“(”和“)”括起来的每组模式的顺序。每个组存储为 refname_g#,其中 refname 是您输入的引用名称字符串,# 是组编号。$1$ to 指组 1,$2$ to 指组 2,等等。$0$ 指整个表达式匹配的内容。在此示例中,我们提取的 ID 维护在 Person_g1 中,而 Name 值存储在 Person_g2 中。 |
4 | 比赛编号 由于我们计划仅提取该模式的第二次出现,以匹配第二个志愿者,因此我们使用值 2。值 0 将进行随机匹配,而负值需要与 ForEach 控制器一起使用。 |
5 | 默认 如果未找到该项目,这将是默认值。这是个可选的选项。您可以将其留空。 |
添加一个侦听器来捕获此测试计划的结果。右键单击线程组并选择“添加”→“侦听器”→“查看结果树”选项以添加侦听器。
将测试计划保存为reg_express_test.jmx并运行测试。输出将成功,如以下屏幕截图所示 -