本主题介绍用于匹配消息响应器和 SQL 响应器工具中值的条件表达式。章节目录:

条件表达式概要

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

  • SQL 响应器参数匹配。
  • 消息响应器数据源关联。

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

  • 用于关联的数据源列中的每个条目
  • 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”小部件,您可以返回另一个结果集(在录制过程中 Virtualize 捕获的结果集)。为此,可以对“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”行的条目。这两个条目都用方括号括起来,其表明不应将条目视为要匹配的字面字符串,而应将条目视为更复杂的条件表达式。括号中包含的表达式的计算结果为 truefalse。如果输入值小于数 2008,则表达式 [< 2008] 返回 true。传入值从传入 SQL 语句中获得:SQL 响应器解析 SQL,找到对应于查询模板中 "${yearCreated}" 的值,并提供该值作为 [< 2008] 表达式的输入值。

在很多编程语言中,小于比较在小于运算符的两边都有值,如 variable1 < variable2。在条件表达式中,运算符左侧不会显示任何值:运算符做测试值是隐式的输入值。表达式 [< 2008] 检查输入值是否小于 2008,而 [>= 2008] 检查输入值是否大于或等于 2008。

除了 < 和 >=,条件表达式支持 <=, >, == (等号), 和 != (不等号)。可以使用相同的比较运算符对数字和字符串进行比较。

在参数标准表前两行中,"category" 值为 tool-metal。表达式 tool-metal 等价于表达式 [== "tool-metal"]。为了简洁起见,Virtualize 使用表达式作为字面量字符串进行匹配,除非表达式以 [ 字符开始。这样的副作用是,若要匹配以“[”开始的字面量字符串,则必须明确使用 == 运算符。若要匹配字面量字符串 "[xyz",则必须使用表达式 [== "[xyz"]

除了可以用于数字和字符串的比较运算符之外,Virtualize 支持分析字符串的其他运算符。假设您想为 2011 年创建的所有小部件使用另一个结果集,其中的类别以“construction-”开头。为此,您可以向响应器添加另一个结果集,将表达式 [like "construction-*"] 用于“category”参数;这将匹配诸如 construction-support 和 construction-something-misc 之类的输入。类似运算符使用 * 和 ? 作为通配符。* 通配符匹配零个或多个字符。? 通配符只匹配一个字符。

假设您想仍然想为 2011 年创建的所有小部件使用另一个结果集,其中类别 "circuit" or "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 根据输入值评估表达式,该输入值可以是一个数字也可以是一个字符串。每个条件评估结果为 truefalsetrue 表示成功匹配。

比较运算符

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 支持使用 andor 运算符组合条件表达式。例如,如果输入值介于 0 和 9 之间, [>= 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

在消息响应器中使用条件表达式

在消息响应器中设置数据源关联的整个过程(配置请求中的值以与数据源列中的值进行比较),在数据源关联性选项卡中有所描述。

  • No labels