jMeter - 正则表达式



正则表达式用于基于模式搜索和操作文本。jMeter 通过包含模式匹配软件Apache Jakarta ORO来解释在整个 jMeter 测试计划中使用的正则表达式或模式。

通过使用正则表达式,我们当然可以节省大量时间并在创建或增强测试计划时获得更大的灵活性。当无法或很难预测结果时,正则表达式提供了一种简单的方法来从页面获取信息。

使用表达式的标准用法示例是从服务器响应中获取会话 ID。如果服务器返回唯一的会话密钥,我们可以使用负载脚本中的表达式轻松获取它。

要在测试计划中使用正则表达式,您需要使用 jMeter 的正则表达式提取器。您可以将正则表达式放置在测试计划中的任何组件中。

值得强调一下响应断言测试元素中使用的包含匹配之间的区别:

  • 包含表示正则表达式至少匹配目标的一部分,因此'alphabet'“包含”'ph.b.',因为正则表达式匹配子字符串'phabe'。

  • 匹配表示正则表达式匹配整个目标。因此,'alphabet'由'al.*t'“匹配”。

假设您要匹配网页的以下部分:

name = "file" value = "readme.txt" 

并且您想提取 readme.txt。合适的正则表达式为:

name = "file" value = "(.+?)">

上面的特殊字符为:

  • () - 这些括号包含要返回的匹配字符串的部分

  • . - 匹配任何字符

  • + - 一次或多次

  • ? - 第一次匹配成功时停止

创建 JMeter 测试计划

让我们通过编写一个测试计划来了解正则表达式在正则表达式提取器(一个后处理器元素)中的使用。此元素使用正则表达式从当前页面提取文本,以识别所需元素符合的文本模式。

首先,我们编写一个包含人员列表及其电子邮件 ID 的 HTML 页面。我们将其部署到我们的 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;">[email protected]</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;">[email protected]</td>
         </tr>
			
      </table>
   </body>
</html>

在将其部署到 Tomcat 服务器上后,此页面将如下面的屏幕截图所示:

HTML Page

在我们的测试计划中,我们将选择人员列表页面上显示的人员表的第一行中的那个人。要捕获此人的 ID,让我们首先确定我们将找到第二行人员的模式。

从下面的快照中可以看到,第二人的 ID 位于<td id = "ID">和</td >之间,并且它是具有此模式的第二行数据。我们可以使用它来匹配我们想要从中提取信息的精确模式。由于我们想要从此页面提取两条信息,即人员 ID 和人员姓名,因此字段定义如下:

HTML Page Source code

启动 JMeter,添加一个线程组测试计划 → 添加 → 线程(用户) → 线程组

接下来添加一个采样器 HTTP 请求,选择测试计划,右键单击添加 → 采样器 → HTTP 请求并输入如下所示的详细信息:

  • 名称 - 管理

  • 服务器名称或 IP - localhost

  • 端口号 - 8080

  • 协议 - 我们将保持为空,这意味着我们希望 HTTP 作为协议。

  • 路径 - jmeter/index.html

HTTP Request Sampler

接下来,添加一个正则表达式提取器。选择 HTTP 请求采样器(管理),右键单击添加 → 后处理器 → 正则表达式提取器

Regular Expression Extractor

下表提供了上面屏幕截图中使用的字段的描述:

序号 字段及描述
1

引用名称

存储提取的测试结果的变量名称(refname)。

2

正则表达式

要提取的文本将与其匹配的模式。将提取的文本组括在字符'('和')'之间。我们使用'.+?'来指示由<td..>..</td>标签括起来的文本的单个实例。在我们的示例中,表达式为:<td id = "ID">(+?)</td>\s*<td id = "Name">(+?)</td>\s*

3

模板

每个提取的文本组作为变量 Person 的成员放置,遵循由'('和')'括起来的每个模式组的顺序。每个组都存储为 refname_g#,其中 refname 是您输入的引用名称的字符串,# 是组号。$1$ 指的是组 1,$2$ 指的是组 2,依此类推。$0$ 指的是整个表达式匹配的内容。在此示例中,我们提取的 ID 保存在 Person_g1 中,而 Name 值存储在 Person_g2 中。

4

匹配编号。

由于我们计划仅提取此模式的第二个出现(匹配第二个志愿者),因此我们使用值 2。值 0 将进行随机匹配,而负值需要与 ForEach 控制器一起使用。

5

默认值

如果未找到该项目,则将为默认值。这是一个可选字段。您可以将其留空。

添加一个监听器来捕获此测试计划的结果。右键单击线程组,然后选择添加 → 监听器 → 查看结果树选项以添加监听器。

将测试计划保存为reg_express_test.jmx并运行测试。输出将成功,如下面的屏幕截图所示:

Regular Expression Output
广告