JMeter学习-008-JMeter 后置处理器实例之 - 正则表达式提取器(一)概述及简单实例

本文介绍如何使用JMeter的正则表达式提取器从HTTP响应中提取特定数据,通过具体示例详细展示了配置步骤及脚本实现。

上文我们讲述了如何对 HTTP请求 的响应数据进行断言,以判断响应是否符合我们的预期,敬请参阅:JMeter学习-007-JMeter 断言实例之一 - 响应断言

那么我们如何获取 HTTP请求 响应结果中的数据呢?此文以获取类目 手机数码-手机通讯-苹果 结果列表中的第一个商品的系统编号为例演示(脚本基于上篇文章,请知悉)。

如下为请求响应数据中的部分数据,我们最终要获取的数据为 "sysNo": "2142717" 中的 2142717。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
     "sysNo": "2142717",
     "skuid": "487626525247",
     "productID": "101-006-72958",
     "productTitle": "苹果(Apple)iPhone 6 Plus (A1524) 16GB 金色 移动联通电信4G手机",
     "price": "556600",
     "activePrice": "",
     "marketprice": "608800",
     "promotionDesc": "A1524、A1586为三网通版,支持移动\/联通\/电信4G\/3G\/2G。找水货?找翻新?没有!易迅网为国行正品代言!!",
     "manufacturerCode": "49",
     "manufacturerName": "苹果(Apple)",
     "evaluationNum": "1717",
     "gradeNum": "48",
     "onlineQty": "796",
     "shippingday": "0t0",
     "gift": 0,
     "promotionType": "0",
     "attribute": "2000000000e214处理器;< strong >(为保持样式美观,此处有删减文字,请知悉!)</ strong >;43257eFDD-LTE\/TD-LTE\-LTE)\/电信4G(FDD-LTE);移动3G(TD-SCDMA)\353e2;49e9?金色;42914?内存e1?16G;43246?制式e4?5.5寸三网通版",
     "saleNum": "454",
     "productTypeMasterid": "0",
     "areaCode": "1",
     "classid": "203320",
     "tag": "超薄手机 大屏手机 待机时间长 高清屏 女神手机 拍照功能强 商务手机 外观漂亮 指纹识别 主流潮机",
     "goodsUrl": "http:\/\/item.yixun.com\/item-2142717.html",
     "picUrl": "http:\/\/img3.wgimg.com\/qqbuy\/2295220799\/item-00000000000000000000007188CE4A3F.0.jpg\/200?55DAE367",
     "reachable": "0"
},

那么我们如何获取呢? JMeter 提供的后置处理器中提供了响应的获取方法,例如:正则表达式提取器、BeanShell PostProcessor、BSF PostProcessor 等。当下以 正则表达式提取器为例演示讲解,对应的添加路径为:【添加/后置处理器/正则表达式提取器】,添加后目录结果如下:

对应添加的正则表达式提取器如下所示:

正则表达式提取器说明:

  • Apply to:应用范围
  • 要检查的响应字段:样本数据源。
  • 引用名称:其他地方引用时的变量名称,引用方法:${引用名称}
  • 正则表达式:数据提取器,如上图的 "sysNo":"(.+?)"," 其中 (.+?) :为非贪婪匹配,建议均使用非贪婪匹配,除非特殊情况。不熟悉正则的,劳烦联系度娘或者谷大爷,谢谢!
  • 模板:对应正则表达式提取器类型,样式为:   。若为:   ,则为所有的匹配数据,例如:"sysNo":"123453463"," 其中 123453463 为 (.+?) 匹配的数据,即最终提取的目标部分。若模板为:   ,则 1 对应正则表达式中的 (.+?)
  • 匹配数字:正则表达式匹配数据的最终结果可以看做一个数组,匹配数字即可看做是数组的第几个元素。当为 0 时,随机返回匹配的数据,当为 1 时,表示返回匹配结果数组的第一个元素。
  • 缺省值:匹配失败时的默认值。通常用于后续的逻辑判断,一般通常为特定含义的英文大写单词组合,简单可写为 ERROR。

 

对应的脚本源码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<? xml version="1.0" encoding="UTF-8"?>
< jmeterTestPlan version="1.2" properties="2.8" jmeter="2.13 r1665067">
   < hashTree >
     < TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="接口自动化测试用例 - 非登录态" enabled="true">
       < stringProp name="TestPlan.comments"></ stringProp >
       < boolProp name="TestPlan.functional_mode">false</ boolProp >
       < boolProp name="TestPlan.serialize_threadgroups">false</ boolProp >
       < elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true">
         < collectionProp name="Arguments.arguments"/>
       </ elementProp >
       < stringProp name="TestPlan.user_define_classpath"></ stringProp >
     </ TestPlan >
     < hashTree >
       < ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="001-类目搜索验证" enabled="true">
         < stringProp name="ThreadGroup.on_sample_error">continue</ stringProp >
         < elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="循环控制器" enabled="true">
           < boolProp name="LoopController.continue_forever">false</ boolProp >
           < stringProp name="LoopController.loops">1</ stringProp >
         </ elementProp >
         < stringProp name="ThreadGroup.num_threads">1</ stringProp >
         < stringProp name="ThreadGroup.ramp_time">1</ stringProp >
         < longProp name="ThreadGroup.start_time">1419564228000</ longProp >
         < longProp name="ThreadGroup.end_time">1419564228000</ longProp >
         < boolProp name="ThreadGroup.scheduler">false</ boolProp >
         < stringProp name="ThreadGroup.duration"></ stringProp >
         < stringProp name="ThreadGroup.delay"></ stringProp >
       </ ThreadGroup >
       < hashTree >
         < HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="手机数码-手机通讯-苹果" enabled="true">
           < elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true">
             < collectionProp name="Arguments.arguments">
               < elementProp name="districtId" elementType="HTTPArgument">
                 < boolProp name="HTTPArgument.always_encode">false</ boolProp >
                 < stringProp name="Argument.name">districtId</ stringProp >
                 < stringProp name="Argument.value">29357</ stringProp >
                 < stringProp name="Argument.metadata">=</ stringProp >
                 < boolProp name="HTTPArgument.use_equals">true</ boolProp >
               </ elementProp >
               < elementProp name="exAppTag" elementType="HTTPArgument">
                 < boolProp name="HTTPArgument.always_encode">false</ boolProp >
                 < stringProp name="Argument.name">exAppTag</ stringProp >
                 < stringProp name="Argument.value">2045191607</ stringProp >
                 < stringProp name="Argument.metadata">=</ stringProp >
                 < boolProp name="HTTPArgument.use_equals">true</ boolProp >
               </ elementProp >
             </ collectionProp >
           </ elementProp >
           < stringProp name="HTTPSampler.domain">mb.51buy.com</ stringProp >
           < stringProp name="HTTPSampler.port"></ stringProp >
           < stringProp name="HTTPSampler.connect_timeout"></ stringProp >
           < stringProp name="HTTPSampler.response_timeout"></ stringProp >
           < stringProp name="HTTPSampler.protocol">http</ stringProp >
           < stringProp name="HTTPSampler.contentEncoding">GB2312</ stringProp >
           < stringProp name="HTTPSampler.path">/json.php?mod=Search&act=page&p=1&path=706188t706189&districtId=29357&areacode=1&dtype=list%7Cpage%7Cclasses&appSource=android&appVersion=45</ stringProp >
           < stringProp name="HTTPSampler.method">POST</ stringProp >
           < boolProp name="HTTPSampler.follow_redirects">true</ boolProp >
           < boolProp name="HTTPSampler.auto_redirects">false</ boolProp >
           < boolProp name="HTTPSampler.use_keepalive">true</ boolProp >
           < boolProp name="HTTPSampler.DO_MULTIPART_POST">false</ boolProp >
           < boolProp name="HTTPSampler.monitor">false</ boolProp >
           < stringProp name="HTTPSampler.embedded_url_re"></ stringProp >
         </ HTTPSamplerProxy >
         < hashTree >
           < HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP信息头管理器" enabled="true">
             < collectionProp name="HeaderManager.headers">
               < elementProp name="Charset" elementType="Header">
                 < stringProp name="Header.name">Charset</ stringProp >
                 < stringProp name="Header.value">UTF-8</ stringProp >
               </ elementProp >
               < elementProp name="Content-Type" elementType="Header">
                 < stringProp name="Header.name">Content-Type</ stringProp >
                 < stringProp name="Header.value">application/x-www-form-urlencoded</ stringProp >
               </ elementProp >
               < elementProp name="Accept-Encoding" elementType="Header">
                 < stringProp name="Header.name">Accept-Encoding</ stringProp >
                 < stringProp name="Header.value">gzip</ stringProp >
               </ elementProp >
               < elementProp name="User-Agent" elementType="Header">
                 < stringProp name="Header.name">User-Agent</ stringProp >
                 < stringProp name="Header.value">Dalvik/1.6.0 (Linux; U; Android 4.4.2; GT-I9502 Build/KOT49H)</ stringProp >
               </ elementProp >
             </ collectionProp >
           </ HeaderManager >
           < hashTree />
           < ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="01 - 判断类目搜索结果状态码" enabled="true">
             < collectionProp name="Asserion.test_strings">
               < stringProp name="71131476">"errno":0</ stringProp >
             </ collectionProp >
             < stringProp name="Assertion.test_field">Assertion.response_data</ stringProp >
             < boolProp name="Assertion.assume_success">false</ boolProp >
             < intProp name="Assertion.test_type">2</ intProp >
           </ ResponseAssertion >
           < hashTree />
           < RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="正则表达式提取器  --  获取类目搜索结果商品列表中商品的系统编号" enabled="true">
             < stringProp name="RegexExtractor.useHeaders">false</ stringProp >
             < stringProp name="RegexExtractor.refname">goodsid</ stringProp >
             < stringProp name="RegexExtractor.regex">"sysNo":"(.+?)","</ stringProp >
             < stringProp name="RegexExtractor.template">$1$</ stringProp >
             < stringProp name="RegexExtractor.default">ERROR</ stringProp >
             < stringProp name="RegexExtractor.match_number">1</ stringProp >
           </ RegexExtractor >
           < hashTree />
           < DebugPostProcessor guiclass="TestBeanGUI" testclass="DebugPostProcessor" testname="Debug PostProcessor  --  所属 :HTTP请求" enabled="true">
             < boolProp name="displayJMeterProperties">false</ boolProp >
             < boolProp name="displayJMeterVariables">true</ boolProp >
             < boolProp name="displaySamplerProperties">true</ boolProp >
             < boolProp name="displaySystemProperties">false</ boolProp >
           </ DebugPostProcessor >
           < hashTree />
         </ hashTree >
       </ hashTree >
       < ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="察看结果树" enabled="true">
         < boolProp name="ResultCollector.error_logging">false</ boolProp >
         < objProp >
           < name >saveConfig</ name >
           < value class="SampleSaveConfiguration">
             < time >true</ time >
             < latency >true</ latency >
             < timestamp >true</ timestamp >
             < success >true</ success >
             < label >true</ label >
             < code >true</ code >
             < message >true</ message >
             < threadName >true</ threadName >
             < dataType >true</ dataType >
             < encoding >false</ encoding >
             < assertions >true</ assertions >
             < subresults >true</ subresults >
             < responseData >false</ responseData >
             < samplerData >false</ samplerData >
             < xml >false</ xml >
             < fieldNames >false</ fieldNames >
             < responseHeaders >false</ responseHeaders >
             < requestHeaders >false</ requestHeaders >
             < responseDataOnError >false</ responseDataOnError >
             < saveAssertionResultsFailureMessage >false</ saveAssertionResultsFailureMessage >
             < assertionsResultsToSave >0</ assertionsResultsToSave >
             < bytes >true</ bytes >
             < threadCounts >true</ threadCounts >
           </ value >
         </ objProp >
         < stringProp name="filename"></ stringProp >
       </ ResultCollector >
       < hashTree />
     </ hashTree >
   </ hashTree >
</ jmeterTestPlan >

其中的 Debug PostProcessor 为调试所用,一般用于查看变量值,添加方法同 正则表达式提取器。

 

脚本执行结果如下所示:

 

至此, JMeter学习-008-JMeter 后置处理器实例之 - 正则表达式提取器(一) 顺利完结,希望此文能够给初学 JMeter 的您一份参考。

最后,非常感谢亲的驻足,希望此文能对亲有所帮助。热烈欢迎亲一起探讨,共同进步。非常感谢! ^_^

<think>好的,我现在需要帮助用户了解JMeter中如何使用正则表达式提取器作为后置处理器。首先,我需要回顾用户提供的引用内容,看看里面有哪些关键点可以利用。 根据引用[2],正则表达式提取器的作用是提取响应数据中的特定内容,这在用户登录或动态数据获取时很有用。引用[3]提到了使用Dummy Sampler模拟返回数据,并用Debug PostProcessor查看结果,这可以作为示例的基础。引用[4]解释了作用范围选项,比如Main sample and sub-samples,这些参数在配置时需要注意。 用户需要的是使用方法和示例,所以步骤应该分点清晰。首先应该介绍基本配置,比如添加位置、字段说明。然后可能需要个具体的例子,比如用户登录后的token提取,引用[3]中的购票网站例子可以参考。此外,引用[3]还提到如何拆分结果集,这点也可以作为示例之。 需要注意的是,用户可能对正则表达式语法不太熟悉,可以简要说明常用语法,如(.+?)匹配任意内容,并强调模板的使用。同时,变量的引用方法(如${token})也是关键点,需要提及。 还要确保示例中的步骤具体,比如使用Dummy Sampler模拟响应,配置正则表达式提取器,用Debug Sampler检查变量,以及如何在后续请求中使用变量。这些步骤在引用[3]中都有涉及,可以整合进来。 最后,常见问题部分可以参考引用[4]的作用范围设置,比如作用域选错导致提取不到数据,或者正则表达式不准确。这部分能帮助用户避免常见错误。 总结下,回答的结构应该是:简介、使用步骤、示例演示、常见问题,然后生成相关问题。需要确保LaTeX格式正确,行内公式用$...$,独立公式单独成段。同时引用标注要正确,比如在提到作用范围时引用[^4],示例部分引用[^3]。</think>JMeter后置处理器中的正则表达式提取器用于从服务器响应中提取动态数据,常用于接口测试的参数关联。以下为详细使用方法和示例: ### 正则表达式提取器配置步骤 1. **添加组件** 右键点击HTTP请求 -> 添加 -> 后置处理器 -> 正则表达式提取器 2. **核心字段说明** - 引用名称:自定义变量名(如`token`) - 正则表达式:编写匹配规则(如`"token":"(.+?)"`) - 模板:`$1$`表示提取第个捕获组 - 匹配数字:`0`随机,`1`第个匹配项 - 缺省值:匹配失败时的默认值 $$正则表达式公式示例:\\ R = \{(a,b) \mid a \in A,\ b = f(a)\} \quad \text{表示响应数据的映射关系}$$ ### 二、示例演示:登录token提取 1. **模拟登录响应** 使用Dummy Sampler返回模拟数据: ```json {"code":200,"data":{"token":"dXNlcjE6MTIzNDU2"}} ``` 2. **配置正则表达式提取器 - 引用名称:`token` - 正则表达式:`"token":"(.+?)"` - 模板:`$1$` - 作用范围选择`Main sample only` 3. **调试验证 添加Debug PostProcessor查看`token=${token}`的提取结果 4. **跨请求调用 在后续HTTP请求头中使用`${token}`变量 ### 三、常用正则语法 | 语法 | 说明 | 示例 | |-----------|------------------------|-------------------| | `(.+?)` | 非贪婪匹配任意字符 | `id=(.+?)&` | | `\d+` | 匹配数字 | `orderNo=(\d+)` | | `.*?` | 跨行匹配 | `total:(.*?)USD` | ### 四、常见问题处理 1. **提取失败检查** - 确认作用范围是否包含目标响应 - 检查正则表达式是否包含捕获组`()` - 使用View Results Tree查看原始响应 2. **多值处理** 当匹配多个值时,通过`${var_1}`,`${var_2}`访问,或设置匹配数字为`-1`获取全部匹配项
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值