jmeter 正则表达式
前言
在 jmeter 测试中,有时需要对返回结果进行一定的处理和筛选,而正则表达式则是一个功能强大的工具。本文将介绍如何在 jmeter 中使用正则表达式对返回结果进行处理和筛选。
正则表达式语法
正则表达式是用来匹配字符串的一种工具,可以用来检索、替换某些字符串,以及分割字符串等功能。常见的正则表达式符号和语法如下:
符号 | 描述 |
---|---|
. | 匹配任意单个字符 |
* | 匹配0个或多个相邻的前导字符 |
+ | 匹配1个或多个相邻的前导字符 |
? | 匹配0或1个相邻的前导字符 |
\ | 转义特殊字符 |
^ | 字符序列的开始 |
$ | 字符序列的结尾 |
[] | 匹配中括号内任意单个字符 |
[^] | 匹配中括号内除此之外的任意单个字符 |
() | 分组,可以改变优先级,也可用于后向引用 |
| | 匹配左右任一字符 |
常见的元字符和字符类:
字符 | 描述 |
---|---|
\d | 数字 |
\w | 字母数字和下划线 |
\s | 空白字符 |
. | 匹配所有字符,除了新行符 |
[..] | 匹配中括号内的任意单个字符 |
[^..] | 不匹配中括号内的任意单个字符 |
\b | 单词边界 |
\B | 非单词边界 |
jmeter 中的正则表达式
在 jmeter 中使用正则表达式可以有多种方式,比较常见的有以下三种:
- 通过 Regular Expression Extractor
Regular Expression Extractor 是 jmeter 中内置的一个后置处理器,可以用于提取正则表达式里的匹配项,并对其进行处理。它包含以下参数:
参数 | 描述 |
---|---|
Apply to | 应用于的选项(比如响应头、响应正文等等) |
Field to check | 需要验证正则表达式的字符串字段 |
Reference Name | 正则表达式提取器的引用名称 |
Regular Expression | 要提取的正则表达式 |
Template | 所需提取的分组。 $1 表示第一个匹配,以此类推 |
Match No | 匹配号,0 表示所有匹配项 |
示例:假设我们需要提取响应正文中的手机号,那么我们可以使用以下正则表达式:
1\d{10}
这个正则表达式可以表示以数字 1 开始,后面跟 10 个数字的字符串,即手机号。然后在 jmeter 中配置如下参数:
- 通过 BeanShell Sampler
BeanShell Sampler 是一个通用的 Sampler,它可以执行任意的 Java 代码。我们可以在它里面使用标准的 Java 正则表达式来匹配返回结果,并进行处理。
示例:假设我们需要对返回结果进行模板匹配,那么可以使用以下的 BeanShell Sampler:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
String response = prev.getResponseDataAsString();
Pattern pattern = Pattern.compile("<div class=\"user\">(.*?)</div>");
Matcher matcher = pattern.matcher(response);
while (matcher.find()) {
String user = matcher.group(1);
log.info("User found: " + user);
// 进行其他处理
}
这个示例用到了 Java 中的 Pattern 和 Matcher,它们可以在 BeanShell 中直接使用。这里的正则表达式表示匹配类似于 <div class="user">
开头,</div>
结尾,中间任意字符的字符串。然后使用 while 循环遍历所有匹配项,并对每个匹配项进行其他处理。
- 通过 JSR223 Sampler
JSR223 Sampler 是 jmeter 中另一个通用的 Sampler,它支持多种脚本语言,包括 Java、JavaScript、Groovy 等。因此我们也可以在它里面使用任意的正则表达式来进行处理。
示例:假设我们需要对返回结果进行 CSV 形式的处理,那么可以使用以下的 JSR223 Sampler:
String response = prev.getResponseDataAsString();
def pattern = /<a href="([^"]*)"[^>]*>(.*?)<\/a>/;
def matcher = pattern.matcher(response);
while (matcher.find()) {
String url = matcher.group(1);
String title = matcher.group(2);
log.info("URL: " + url + ", Title: " + title);
// 输出 CSV 形式的内容
println(url + "," + title);
}
这个示例用到了 Groovy 中的正则表达式,它的语法与 Java 类似。这里的正则表达式表示匹配类似于 <a href="...">...</a>
的链接标签,并提取出 href 属性和链接文本。然后使用 while 循环遍历所有匹配项,并对每个匹配项进行 CSV 处理。
注意事项
使用正则表达式时,需要注意以下几点:
- 正则表达式符号需要与被匹配的字符串完全符合(不包含换行符)。
-
如果使用组匹配,则匹配到的结果包括组匹配项和整个匹配项两个部分。
-
如果使用贪婪匹配,则会尽量匹配更长的字符串。使用非贪婪匹配可以避免这个问题。
-
不同语言和不同工具中的正则表达式语法略有不同,需要注意语法差异。
结论
在 jmeter 测试中,正则表达式是一个非常强大的工具,可以用来筛选、提取和处理返回结果。我们通过介绍 jmeter 中 Regular Expression Extractor、BeanShell Sampler 和 JSR223 Sampler 的使用方法,并给出了一些示例来说明如何在 jmeter 中使用正则表达式。同时,我们也注意到了使用正则表达式时需要注意的一些事项。通过对正则表达式的学习和运用,可以使我们的测试工作更加准确和高效。