jMeter - 正则表达式

  • 简述

    正则表达式用于基于模式搜索和操作文本。JMeter 通过包含模式匹配软件Apache Jakarta ORO 来解释整个 JMeter 测试计划中使用的正则表达式或模式的形式。
    通过使用正则表达式,我们当然可以在创建或增强测试计划时节省大量时间并获得更大的灵活性。当不可能或很难预测结果时,正则表达式提供了一种从页面获取信息的简单方法。
    使用表达式的标准用法示例是从服务器响应中获取会话 ID。如果服务器返回一个唯一的会话密钥,我们可以使用加载脚本中的表达式轻松获取它。
    要在测试计划中使用正则表达式,您需要使用 JMeter 的正则表达式提取器。您可以在测试计划的任何组件中放置正则表达式。
    值得强调两者之间的区别 containsmatches,用于响应断言测试元素 -
    • 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 服务器上部署它时,此页面将如下面的屏幕截图所示 -
    HTML页面
    在我们的测试计划中,我们将在上面的人员列表页面中看到的人员表的第一行中选择人员。要捕获此人的 ID,让我们首先确定在第二行中找到此人的模式。
    如下图所示,第二个人的ID被<td id = "ID">和</td>包围,是具有这种模式的第二行数据。我们可以使用它来匹配我们想要从中提取信息的确切模式。由于我们要从该页面中提取两条信息,人员 ID 和人员姓名,因此字段定义如下 -
    HTML 页面源代码
    启动JMeter,添加一个线程组 Test Plan → Add→ Threads(Users)→ Thread Group.
    接下来添加一个sampler HTTP Request,选择测试计划,右键 Add → Sampler → HTTP Request 并输入如下所示的详细信息 -
    • Name − 管理
    • Server Name or IP - 本地主机
    • Port Number − 8080
    • Protocol - 我们将其保留为空白,这意味着我们希望使用 HTTP 作为协议。
    • Path - jmeter/index.html
    HTTP 请求采样器
    接下来,添加一个正则表达式提取器。选择 HTTP Request Sampler (Manage),右击Add → Post Processor → Regular Expression Extractor.
    正则表达式提取器
    下表提供了上述屏幕截图中使用的字段的描述 -
    序号 字段和描述
    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并运行测试。输出将是成功的,如下面的屏幕截图所示 -
    正则表达式输出