本主题解释了用于匹配消息响应程序和 SQL 响应程序工具中值的标准表达式。本章包含:

标准表达式概要

标准表达式是一个精确的语法,用于匹配以下内容中的值:

  • SQL Responder 参数匹配。
  • Message Responder 数据源关联。

此标准表达式语法支持比较字符串和数字,也支持使用通配符和正则表达式匹配字符串。该语法适用于:

  • 用于关联的数据源列中的每个条目
  • SQL 响应程序的参数标准。

Virtualize 根据响应程序提供的输入值计算表达式。如果表达式返回 true,则该值视为匹配项。

使用 SQL 响应程序的标准表达式

若要了解该语法及其实用性,请考虑一个简单的 SQL 响应程序。将设 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'

这两个声明语句都与 SQL 响应程序中以下 SQL 查询模板相对应:

select id, name from widget where yearCreated = ${yearCreated} and category = ${category}

使用所记录的数据,Virtualize 生成了一个查询模板,其参数条件如下表所示。感兴趣的是 "yearCreated” 和 "category” 列,它对应于 SQL 语句的 WHERE 子句中看到的值。

yearCreatedcategoryResultSet FileResponse Time (ms)
2008tool-metaldatabase_widgets\file1.csv0
2011construction-moldingdatabase_widgets\file2.csv0

按照配置,SQL 响应程序将只能返回 Virtualize 在记录期间捕获到的两个 SQL 语句的结果集。Virtualize 将参数条件配置为匹配记录期间看到的实际值。响应程序没有 2005 年创建的“too-metal”小部件的结果集。也没有 2011 年创建的小部件的结果集(除了那些分类为 "construction-molding” 的小部件)。

你可以通过按小部件创建的年份对它们进行分组来实现这一点。关于 2008 年前创建的所有 "tool-metal”小部件,你可以返回一个结果集。关于 2008 前期间或之后的所有 "tool-metal” 小部件,你可以返回另一个结果集(在录制过程中 Virutalize 捕获的结果集)。为此,可以对 "yearCreated” 参数参数使用数值比较。对于 2008 年前创建的小部件,你将需要手动添加另一个结果集到响应程序。最后,你的参数条件表将如下所示:

yearCreatedcategoryResultSet FileResponse Response 
[< 2008]tool-metaldatabase_widgets\file3.csv0
[>= 2008]tool-metaldatabase_widgets\file1.csv0
2011construction-moldingdatabase_widgets\file2.csv0

注意“yearCreated”列中“category”为“tool-metal”行的条目。这两个条目都用方括号括起来,其表明不应将条目视为要匹配的文字字符串,而应将条目视为更复杂的标准表达式。括号中包含的表达式的计算结果为 true 或 false。如果输入值小于数 2008,则表达式 [< 2008] 返回 true。传入值从传入 SQL 语句中获得:SQL 响应程序解析 SQL,找到对应于查询模板中 "${yearCreated}” 的值,并:并提供该值作为 [< 2008] 表达式的输入值。

在很多编程语言中,小于比较在小于运算符的两边都有值,如 variable1 < variable2。在标准表达式中,运算符左侧不会显示任何值:操作符做测试值是隐式的输入值。表达式 [< 2008] 检查输入值是否小于 2008,而 [>= 2008] 检查输入值是否大于或等于 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(-.+)?$/]。正则表达式将匹配 circuitcircuit ,其后面跟着 - 和一个或多个字符串,如 circuit-electric

你的参数条件表现在看起来像这样:

yearCreatedcategoryResultSet FileResponse Time (ms)
[< 2008]tool-metaldatabase_widgets\file3.csv0
[>= 2008]tool-metaldatabase_widgets\file1.csv0
2011construction-moldingdatabase_widgets\file2.csv0
2011[like "construction-*"]database_widgets\file4.csv0
2011[=~ /^circuit(-.+)?$/]database_widgets\file5.csv0

假设始终希望 SQL 响应程序为与你使用的查询模板匹配的任何 SQL 语句返回一个结果集。对于在 2000 年至 2007 年间创建的、没有与其他参数条件匹配的任何小部件,你都有一个结果集;对于任何其他不匹配的小部件,你都有一个最终的结果集。

若要匹配 2000 年至 2007 年间的 "yearCreated" ,你可以使用用 and 操作符组合的两个数字比较。该表达式将匹配所需范围:[>= 2000 and <= 2007].这个 and 操作符组合两个标准表达式,并当且仅当两个表达式都返回 true 时返回 true。这个 or 操作符的工作原理类似,但当且仅当一个或两个表达式都返回 true 时返回 true。

若要匹配 "category” 参数的任何值,可以使用标准表达式 [*],其中匹配任何输入。作为一种选择,可以使用表达式 [],它意味着没有标准,因此通常计算为 true。Virtualize 支持 [*] ,因为它的意思更明显。注意,空表达式(其可能以空表单元格形式出现在参数条件表中)不匹配任何输入。相反,它匹配的输入是一个零长度的字符串。

最后,若要匹配任何其他不匹配的小部件,可以添加最终结果集作为标准表中最后一行,并在该行中对每个 "yearCreated" 和 "category" 参数使用表达式 [*]

你的参数条件表现在看起来像这样:

yearCreatedcategoryResultSet FileResponse Time (ms)
[< 2008]tool-metaldatabase_widgets\file3.csv0
[>= 2008]tool-metaldatabase_widgets\file1.csv0
2011construction-moldingdatabase_widgets\file2.csv0
2011[like "construction-*"]database_widgets\file4.csv0
2011[=~ /^circuit(-.+)?$/]database_widgets\file5.csv0
[>= 2000 and <= 2007][*]database_widgets\file6.csv0
[*][*]database_widgets\file7.csv0

虽然设置数据源关联性不同于配置 SQL 响应程序,但 Virtualize 中的数据源关联性支持相同的标准表达式语法。

标准表达式语法

标准表达式可以解释为要匹配的文字字符串,也可以解释为更复杂的表达式。 

如果表达式没有以 [开始,则 Virtualize 将把表达式解释为要匹配的文字字符串。以 [ 开始却没有以 ] 结尾的表达式是无效的:无法被解析。方括号包含的表达式支持根据输入值求值的多个操作符(多个比较操作符),以及使用 like 操作符和规则表达式进行字符串模式匹配,以及组合标准表达式的布尔操作符。 

Virtualize 根据输入值计算表达式,该输入值可以是一个数字也可以是一个字符串。每个标准计算结果为 true 或 false。True 表示成功匹配。

比较操作符

Virtualize 支持多个比较操作符,你可以使用它们来比较数字和字符串。所支持的操作符有:

操作符含义
<=小于或等于
<小于
==等于
>=大于或等于
>大于
!=不等于

例如,若要检查输入,将其假设为一个小于 57 的数字,则使用 [< 57]。输入值隐式地表示左操作数。右操作数是希望与之比较输入值的值。

字符串包含在双引号中。例如:

[< "xyz"] 

表达式 abc 等价于下述表达式: 

[== "abc"]

Virtualize 按词法比较字符串。例如, A < AA < Z < Zoo < a < aa < z < zoo。注意,此比较区分大小写。Virtualize 比较每个字符的 Unicode 值;如果两个字符串除了一个字符串较长外,其他都相同,则较短字符串小于较长字符串。

双引号内的字符串可以包含以下转义序列:

转义序列含义ASCII 字符编码(十六进制)
\b退格键0x08
\ttab0x09
\nnewline0x0A
\fformfeed0x0C
\rcarriage return0x0D
\"双引号字符0x22
\'单引号字符0x27
\\反斜杠字符0x5C

Java 支持相同的转义序列。这个用于单引号字符的 \’ 转义序列是完全不必要的,但它提供了与 Java 字符串语法的兼容性。

数字和字符串的处理方式不同。表达式 [== "30"] 匹配输入字符串 30,但不匹配输入字符串 30.0。然而, [== 30] 同时匹配这两个字符串。右操作值和输入值具有一个类型:要么是数字,要么是字符串。如果两边都为数字,则 Virtualize 指定数值比较。如果其中一个操作数恰好是数字,则 Virtualize 将尝试把其他操作符转换为数字。如果成功,Virtualize 执行数值比较;如果没有成功,Virtualize 将操作数转换为字符串并执行字符串比较。

双引号的存在与否决定了右操作数是否是一个数字。SQL 响应程序通过解析 SQL 语句决定输入值类型:SQL 语句中包含在单引号中的值是字符串;没有包含在单引号中的值是数字。在消息响应程序的数据源关联性中,所有输入值都是字符串:若要进行数值比较,右操作数必须是数字。

下表中显示了如何使用比较操作符和匹配的输入值。

表达式匹配不匹配
[== 55]

数字或字符串:55, 55.0

数字或字符串:60
[> 55]数字或字符串:56, 56.0, 3.1e24数字或字符串:55, 10
[== "55"]

数字:55, 55.0

字符串:55

数字:60

字符串:55.0, 60

[> "55"]

数字:56, 56.0, 3.1e24
字符串:56, 55.0

数字:55, 55.0, 10

字符串:55, 050, 3.1e24, abc

[== "greetings"]greetingsxyz
greetingsgreetingsxyz
[>= "abc"]abc, abca, greetingsABC, 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 操作符和正则表达式进行更复杂的字符串匹配。

Like 操作符支持使用 [like alpha?beta*"]形式的表达式的简单模式匹配。通配符 ? 匹配任何单个字符。通配符 * 匹配零个或多个字符。如果输入值是一个数字,则 Virtualize 将输入转为字符串。

正则表达式支持使用 [~= /pat-tern/]形式的表达式的更强大模式匹配。如果输入值是一个数字,则 Virtualize 将输入转为字符串。类似于 Perl,=~ 表示正则表达式比较,模式本身用斜线分隔。Virtualize 使用与 Java 正则表达式使用的相同模式语法。关于 Java 模式语法上完整的文档,请查阅 java.util.regex.Pattern 类的 Javadoc。一点不同于 Java 模式语法的是匹配一个 / 字符,必须用反斜杠转义它。

如果输入字符串的某个子字符串匹配模式,则正则表达式比较返回 true。如果希望匹配 abc 而不是 abc123123abc ,则必须使用 [=~ /^abc$/] 代替 [=~ /abc/ ]^ $ 分别匹配字符串的开始和结尾。

下表中显示了如何使用比较操作符和匹配的输入值。

表达式匹配不匹配
[like "a*b"]ab, axb, axxb,axyzbabx
[like "a?b"]axb, aab, abbab, axxb, axyzb
[=~ /^a.*b$/]ab, axb, axxb,axyzbabx
[=~ /^a.b$/]axb, aab, abbab, axxb, axyzb
[=~ /^id-\d+$/]id-1, id-456id-, id-xyz, id-2b
[=~ /beta/]beta, alpha-beta, alpha-beta-gammaalpha, BETA
[=~ /^beta$/]betaalpha, BETA, alpha-beta, alpha-beta-gamma
[=~ /(?i)^beta$/]beta, BETAalpha, alpha-beta, alpha-beta-gamma
[=~ /^.*\/.*$/]alpha/beta, /alpha, alpha\beta
[=~ /^.*\\.*$/]alpha\beta, \alpha, alpha/beta
[=~ /^a\Q.*\Eb$/]a.*bab, axb, axxb, axyzb, abx

组合表达式

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]

下表中显示了如何使用比较操作符和匹配的输入值。

表达式匹配不匹配
[>= 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, zaa, z
[like "*b*" or (like "*a*" and like "*z*")]b, mnb, ba, bz, zaa, z
[(like "*b*" or like "*a*") and like "*z*"]bz, za, zaabxyza, b, z, mnb, ba
[(((== "abc")))]abcxyz

在消息响应程序中使用标准表达式

在消息响应程序中设置数据源关联的整个过程(配置请求中的值以与数据源列中的值进行比较),在 Data Source Correlation Tab中有所描述。

注意,本主题所描述的语法是在 Virtualize 9.2 中引入的,并特定于虚拟资产(.pva 文件)。不再支持 Virtualize 9.1 的语法。  而且,如果将任何带桩函数的 Parasoft .tst 文件导入到 Virtualize 环境中,Virtualize 将使用遗留的语法来处理这些项的数据源关联。

  • No labels