本主题解释了用于匹配消息响应程序和 SQL 响应程序工具中值的标准表达式。本章包含: 标准表达式是一个精确的语法,用于匹配以下内容中的值: 此标准表达式语法支持比较字符串和数字,也支持使用通配符和正则表达式匹配字符串。该语法适用于: Virtualize 根据响应程序提供的输入值计算表达式。如果表达式返回 true,则该值视为匹配项。 若要了解该语法及其实用性,请考虑一个简单的 SQL 响应程序。将设 Virtualize 在记录数据库流量时捕获到以下两个 SQL 查询: 这两个声明语句都与 SQL 响应程序中以下 SQL 查询模板相对应: 使用所记录的数据,Virtualize 生成了一个查询模板,其参数条件如下表所示。感兴趣的是 "yearCreated” 和 "category” 列,它对应于 SQL 语句的 WHERE 子句中看到的值。 按照配置,SQL 响应程序将只能返回 Virtualize 在记录期间捕获到的两个 SQL 语句的结果集。Virtualize 将参数条件配置为匹配记录期间看到的实际值。响应程序没有 2005 年创建的“too-metal”小部件的结果集。也没有 2011 年创建的小部件的结果集(除了那些分类为 "construction-molding” 的小部件)。 你可以通过按小部件创建的年份对它们进行分组来实现这一点。关于 2008 年前创建的所有 "tool-metal”小部件,你可以返回一个结果集。关于 2008 前期间或之后的所有 "tool-metal” 小部件,你可以返回另一个结果集(在录制过程中 Virutalize 捕获的结果集)。为此,可以对 "yearCreated” 参数参数使用数值比较。对于 2008 年前创建的小部件,你将需要手动添加另一个结果集到响应程序。最后,你的参数条件表将如下所示: 注意“yearCreated”列中“category”为“tool-metal”行的条目。这两个条目都用方括号括起来,其表明不应将条目视为要匹配的文字字符串,而应将条目视为更复杂的标准表达式。括号中包含的表达式的计算结果为 true 或 false。如果输入值小于数 2008,则表达式 [< 2008] 返回 true。传入值从传入 SQL 语句中获得:SQL 响应程序解析 SQL,找到对应于查询模板中 "${yearCreated}” 的值,并:并提供该值作为 [< 2008] 表达式的输入值。 在很多编程语言中,小于比较在小于运算符的两边都有值,如 除了 < 和 >=,标准表达式支持 <=, >, == (等号), 和 != (不等号)。可以使用相同的比较操作符对数字和字符串进行比较。 在参数标准表前两行中, "category” 值为 tool-metal。表达式 tool-metal 等价于表达式 [== "tool-metal"]。为了简洁起见,Virutalize 使用表达式作为文字字符串进行匹配,除非表达式以 [ 字符开始。这样的副作用是,若要匹配以“[”开始的文字字符串,则必须明确使用 == 操作符。若要匹配文字字符串 "[xyz",则必须使用表达式 [== "[xyz"]。 除了可以用于数字和字符串的比较操作符之外,Virtualize 支持分析字符串的其他操作符。假设你想为 2011 年创建的所有小部件使用另一个结果集,其中的类别以“construction-”开头。为此,你可以向响应程序添加另一个结果集,并使用表达式 [like "construction-*"] 用于 "category” 参数;这将匹配诸如 construction-support 和 construction-something-misc 之类的输入。类似操作符使用 * 和 ? 作为通配符。* 通配符匹配零个或多个字符。? 通配符只匹配一个字符。 假设你想仍然想为 2011 年创建的所有小部件使用另一个结果集,其中类别 "circuit”或 "circuit-”后跟着任意字符串,但不包括 "circuitbreaker”之类的类别。为此,可以使用正则表达式向响应器添加另一个结果集,以匹配“category”参数。可以使用标准表达式 [=~ /^circuit(-.+)?$/]。正则表达式将匹配 circuit 或 circuit ,其后面跟着 - 和一个或多个字符串,如 circuit-electric。 你的参数条件表现在看起来像这样: 假设始终希望 SQL 响应程序为与你使用的查询模板匹配的任何 SQL 语句返回一个结果集。对于在 2000 年至 2007 年间创建的、没有与其他参数条件匹配的任何小部件,你都有一个结果集;对于任何其他不匹配的小部件,你都有一个最终的结果集。 若要匹配 2000 年至 2007 年间的 "yearCreated" ,你可以使用用 and 操作符组合的两个数字比较。该表达式将匹配所需范围:[>= 2000 and <= 2007].这个 and 操作符组合两个标准表达式,并当且仅当两个表达式都返回 true 时返回 true。这个 or 操作符的工作原理类似,但当且仅当一个或两个表达式都返回 true 时返回 true。 若要匹配 "category” 参数的任何值,可以使用标准表达式 [*],其中匹配任何输入。作为一种选择,可以使用表达式 [],它意味着没有标准,因此通常计算为 true。Virtualize 支持 [*] ,因为它的意思更明显。注意,空表达式(其可能以空表单元格形式出现在参数条件表中)不匹配任何输入。相反,它匹配的输入是一个零长度的字符串。 最后,若要匹配任何其他不匹配的小部件,可以添加最终结果集作为标准表中最后一行,并在该行中对每个 "yearCreated" 和 "category" 参数使用表达式 [*] 。 你的参数条件表现在看起来像这样: 虽然设置数据源关联性不同于配置 SQL 响应程序,但 Virtualize 中的数据源关联性支持相同的标准表达式语法。 标准表达式可以解释为要匹配的文字字符串,也可以解释为更复杂的表达式。 如果表达式没有以 [开始,则 Virtualize 将把表达式解释为要匹配的文字字符串。以 [ 开始却没有以 ] 结尾的表达式是无效的:无法被解析。方括号包含的表达式支持根据输入值求值的多个操作符(多个比较操作符),以及使用 like 操作符和规则表达式进行字符串模式匹配,以及组合标准表达式的布尔操作符。 Virtualize 根据输入值计算表达式,该输入值可以是一个数字也可以是一个字符串。每个标准计算结果为 true 或 false。True 表示成功匹配。 Virtualize 支持多个比较操作符,你可以使用它们来比较数字和字符串。所支持的操作符有: 例如,若要检查输入,将其假设为一个小于 57 的数字,则使用 [< 57]。输入值隐式地表示左操作数。右操作数是希望与之比较输入值的值。 字符串包含在双引号中。例如: 表达式 Virtualize 按词法比较字符串。例如, A < AA < Z < Zoo < a < aa < z < zoo。注意,此比较区分大小写。Virtualize 比较每个字符的 Unicode 值;如果两个字符串除了一个字符串较长外,其他都相同,则较短字符串小于较长字符串。 双引号内的字符串可以包含以下转义序列: Java 支持相同的转义序列。这个用于单引号字符的 \’ 转义序列是完全不必要的,但它提供了与 Java 字符串语法的兼容性。 数字和字符串的处理方式不同。表达式 [== "30"] 匹配输入字符串 30,但不匹配输入字符串 30.0。然而, [== 30] 同时匹配这两个字符串。右操作值和输入值具有一个类型:要么是数字,要么是字符串。如果两边都为数字,则 Virtualize 指定数值比较。如果其中一个操作数恰好是数字,则 Virtualize 将尝试把其他操作符转换为数字。如果成功,Virtualize 执行数值比较;如果没有成功,Virtualize 将操作数转换为字符串并执行字符串比较。 双引号的存在与否决定了右操作数是否是一个数字。SQL 响应程序通过解析 SQL 语句决定输入值类型:SQL 语句中包含在单引号中的值是字符串;没有包含在单引号中的值是数字。在消息响应程序的数据源关联性中,所有输入值都是字符串:若要进行数值比较,右操作数必须是数字。 下表中显示了如何使用比较操作符和匹配的输入值。 数字或字符串:55, 55.0 数字:55, 55.0 字符串:55 数字:60 字符串:55.0, 60 数字:56, 56.0, 3.1e24 数字:55, 55.0, 10 字符串:55, 050, 3.1e24, abc 为了进一步阐述语法,下表中显示了一些不可解析的表达式。 除了比较操作符外,你可以使用 like 操作符和正则表达式进行更复杂的字符串匹配。 Like 操作符支持使用 [like alpha?beta*"]形式的表达式的简单模式匹配。通配符 ? 匹配任何单个字符。通配符 * 匹配零个或多个字符。如果输入值是一个数字,则 Virtualize 将输入转为字符串。 正则表达式支持使用 [~= /pat-tern/]形式的表达式的更强大模式匹配。如果输入值是一个数字,则 Virtualize 将输入转为字符串。类似于 Perl,=~ 表示正则表达式比较,模式本身用斜线分隔。Virtualize 使用与 Java 正则表达式使用的相同模式语法。关于 Java 模式语法上完整的文档,请查阅 java.util.regex.Pattern 类的 Javadoc。一点不同于 Java 模式语法的是匹配一个 / 字符,必须用反斜杠转义它。 如果输入字符串的某个子字符串匹配模式,则正则表达式比较返回 true。如果希望匹配 abc 而不是 abc123 或 123abc ,则必须使用 [=~ /^abc$/] 代替 [=~ /abc/ ]。^ 和 $ 分别匹配字符串的开始和结尾。 下表中显示了如何使用比较操作符和匹配的输入值。 Virtualize 支持使用 and 和 or 操作符组合标准表达式。例如,如果输入值介于 0 和 0 之间, [>= 0 and <= 9] 返回 true。 这个 and 操作符具有比 or 操作符更高的优先级。可以在表达式周围使用括号。表达式 [like "*b*" or like "*a*" and like "*z*"] 等价于 [like "*b*" or (like "*a*" and like "*z*")]。 操作符名称区分大小写。该表达式造成一个解析错误,因为 AND 不是一个有效的操作符。[> 0 AND < 10]。 下表中显示了如何使用比较操作符和匹配的输入值。 在消息响应程序中设置数据源关联的整个过程(配置请求中的值以与数据源列中的值进行比较),在 Data Source Correlation Tab中有所描述。 注意,本主题所描述的语法是在 Virtualize 9.2 中引入的,并特定于虚拟资产(.pva 文件)。不再支持 Virtualize 9.1 的语法。 而且,如果将任何带桩函数的 Parasoft .tst 文件导入到 Virtualize 环境中,Virtualize 将使用遗留的语法来处理这些项的数据源关联。标准表达式概要
使用 SQL 响应程序的标准表达式
select id, name from widget where yearCreated = 2008 and category = 'tool-metal'
select id, name from widget where yearCreated = 2011 and category = 'construction-molding'
select id, name from widget where yearCreated = ${yearCreated} and category = ${category}
yearCreated category ResultSet File Response Time (ms) 2008 tool-metal database_widgets\file1.csv 0 2011 construction-molding database_widgets\file2.csv 0 yearCreated category ResultSet File Response Response [< 2008] tool-metal database_widgets\file3.csv 0 [>= 2008] tool-metal database_widgets\file1.csv 0 2011 construction-molding database_widgets\file2.csv 0 variable1 < variable2
。在标准表达式中,运算符左侧不会显示任何值:操作符做测试值是隐式的输入值。表达式 [< 2008] 检查输入值是否小于 2008,而 [>= 2008] 检查输入值是否大于或等于 2008。yearCreated category ResultSet File Response Time (ms) [< 2008] tool-metal database_widgets\file3.csv 0 [>= 2008] tool-metal database_widgets\file1.csv 0 2011 construction-molding database_widgets\file2.csv 0 2011 [like "construction-*"] database_widgets\file4.csv 0 2011 [=~ /^circuit(-.+)?$/] database_widgets\file5.csv 0 yearCreated category ResultSet File Response Time (ms) [< 2008] tool-metal database_widgets\file3.csv 0 [>= 2008] tool-metal database_widgets\file1.csv 0 2011 construction-molding database_widgets\file2.csv 0 2011 [like "construction-*"] database_widgets\file4.csv 0 2011 [=~ /^circuit(-.+)?$/] database_widgets\file5.csv 0 [>= 2000 and <= 2007] [*] database_widgets\file6.csv 0 [*] [*] database_widgets\file7.csv 0 标准表达式语法
比较操作符
操作符 含义 <= 小于或等于 < 小于 == 等于 >= 大于或等于 > 大于 != 不等于 [< "xyz"]
abc
等价于下述表达式: [== "abc"]
转义序列 含义 ASCII 字符编码(十六进制) \b 退格键 0x08 \t tab 0x09 \n newline 0x0A \f formfeed 0x0C \r carriage return 0x0D \" 双引号字符 0x22 \' 单引号字符 0x27 \\ 反斜杠字符 0x5C 表达式 匹配 不匹配 [== 55] 数字或字符串:60 [> 55] 数字或字符串:56, 56.0, 3.1e24 数字或字符串:55, 10 [== "55"] [> "55"]
字符串:56, 55.0[== "greetings"] greetings xyz greetings greetings xyz [>= "abc"] abc, abca, greetings ABC, ab, 11 [== "this is \"quoted\""] this is "quoted" this is \"quoted\" this is "quoted" this is "quoted" this is \"quoted\" 不可解析表达式 解析错误 [xyz 文字文本以括号开始。使用 == 操作符。 [55] 没有操作符。Use == operator. ["something"] 没有操作符。Use == operator. [== 55 缺失闭括号。 字符串模式匹配
表达式 匹配 不匹配 [like "a*b"] ab, axb, axxb,axyzb abx [like "a?b"] axb, aab, abb ab, axxb, axyzb [=~ /^a.*b$/] ab, axb, axxb,axyzb abx [=~ /^a.b$/] axb, aab, abb ab, axxb, axyzb [=~ /^id-\d+$/] id-1, id-456 id-, id-xyz, id-2b [=~ /beta/] beta, alpha-beta, alpha-beta-gamma alpha, BETA [=~ /^beta$/] beta alpha, BETA, alpha-beta, alpha-beta-gamma [=~ /(?i)^beta$/] beta, BETA alpha, alpha-beta, alpha-beta-gamma [=~ /^.*\/.*$/] alpha/beta, / alpha, alpha\beta [=~ /^.*\\.*$/] alpha\beta, \ alpha, alpha/beta [=~ /^a\Q.*\Eb$/] a.*b ab, axb, axxb, axyzb, abx 组合表达式
表达式 匹配 不匹配 [>= 0 and <= 9] 字符串或数字:0, 3.14159, 5, 9.0 字符串或数字:-1, 10.12, 5.7e+12 [like "*b*" or like "*a*" and like "*z*"] b, mnb, ba, bz, za a, z [like "*b*" or (like "*a*" and like "*z*")] b, mnb, ba, bz, za a, z [(like "*b*" or like "*a*") and like "*z*"] bz, za, zaabxyz a, b, z, mnb, ba [(((== "abc")))] abc xyz 在消息响应程序中使用标准表达式
Overview
Content Tools