jMeter - 正则表达式

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

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

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

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

值得强调的是 containsmatches 之间的区别,如在响应断言测试元素 − 上使用的一样

  • 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 服务器上部署后,此页面将如以下屏幕截图所示 −

HTML Page

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

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

HTML 页面源代码

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

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

  • 名称 − 管理

  • 服务器名称或 IP − localhost

  • 端口号 − 8080

  • 协议 − 我们将保留此空白,这意味着我们希望 HTTP 作为协议。

  • 路径 − jmeter/index.html

HTTP 请求采样器

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

正则表达式提取器

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

Sr.No 字段和描述
1

Reference Name

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

2

Regular Expression

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

3

Template

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

4

Match No.

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

5

Default

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

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

将测试计划另存为 reg_express_test.jmx 并运行测试。输出将成功,如以下屏幕截图所示 −

正则表达式输出