本主题介绍了固定长度消息响应程序,并解释了此类型消息响应程序的特定配置选项。
本章包含:
关于固定长度消息响应程序
固定长度消息响应程序是一个消息响应程序,它允许使用 XML,从而简化固定长度的使用。您可以将固定长度响应负载作为 XML 文档来建模;然后响应程序在发送消息之前自动将 XML 转换为固定长度。如果响应程序接收到一条固定长度消息,则响应程序会将消息转化为 XML,以便使用 XPaths 或附加工具定义消息关联。消息响应程序与协议无关。在 PVA 的部署配置中定义了访问响应程序的传输协议或 API。
关于固定长度格式
固定长度是一种没有标准定义的数据格式。总的说来,固定长度数据格式由记录数组成。每个记录有一个或多个字段,每个字段都有其固定长度(因此得名“固定长度格式”)。这些字段之间通常不能使用分隔符。
例如
一个简单的示例,考虑这样一个消息,其中每个记录位于不同的行上,并且只包含两个字段:
- last name
- first name
每个字段都是 10 个字符长度,右对齐,并由空格填充。
Smith John
Doe Jane
固定长度格式的记录可能具有嵌套的 sections,这些 sections 也具有固定长度格式的记录。这些嵌套的 sections 可以有不同数量的记录。考虑基于第一个示例的第二个固定长度格式。假设,对于每个人,我们想要指定该个人拥有的宠物的可变数量。我们将从上面使用的数据格式开始,但是对于每个记录,我们将添加以下内容:
- number 字段指定宠物的数量为 2 个字符,用 0 填充。
- 可变数量的 sections,其中每个 section 都包含宠物的 type 和 name。sections 的数量等价于指定宠物数字段中的数量。宠物 type 字段为 5 个字符长度,右对齐。宠物 name 字段为 10 个字符长度,右对齐。
下面是该数据的示例。
Smith John00
Doe Jane02 Cat Fluffy Dog Spot
第一个人记录有 0 个宠物,第二个人记录有 2 个宠物。宠物子 section 有宠物记录,这些记录可以出现可变次数。
配置固定长度数据格式:概要
由于存在很多不同的固定长度格式(并且没有单个标准),Parasoft Virtualize 容易配置为识别组织团队使用的任何固定长度消息格式。为了在 Virtualize 中配置并验证固定长度消息,需要执行以下一次性的配置:
- 定义描述固定长度数据格式的数据模型
- 注册数据模型,以便 Virtualize 可以在固定长度响应程序和 XML 转换器中使用它。
定义描述固定长度格式的数据模型
描述定义描述固定长度格式的数据模型需要两个主要步骤:
创建新的数据模型定义文件
在 Virtualize 中使用固定长度消息的第一步是定义描述固定长度格式的数据模型。
若要创建新的数据建模:
- 选择 File> New> Data Model Definition File。
- 指定将存储数据模型定义的文件的名称和相对于工作区的位置。(如果想将文件保存在工作空间之外的某个地方,请先将其保存到工作区中,然后再将其移动。)建议将数据建模文件保存在工作区中,以便可以将它连同测试一起检入源代码控制。这样就很容易获得最新更新的数据模型文件,以便在测试项目中使用。
- 单击 Finish。
向导将在选中的工作区位置中创建一个扩展名为 .datamodel 的文件。文件不会出现在虚拟资产资源管理器中。可以通过切换至导航器视图并查看保存它的项目内部来找到它
编辑数据建模定义
使用数据建模编辑器的下一步是告诉 Virtualize 固定长度信息是如何构成的。Virtualize 将使用此信息将这些消息转换为 XML 或从 XML 转换为 XML。
创建新数据建模定义之后,将打开一个数据建模编辑器。也可以通过双击表示数据定义文件的 Navigator 节点访问它。
1.输入数据格式的名称和描述。
此名称将用于识别可用工具中的消息格式。
2.指定 section 的常规信息
接下来,作为一个整体输入关于该 section 的常规细节:它的名称、它的记录的名称、这些记录是如何分隔的,以及下一个记录的条件。
名称
指定 section 的名称。此名称出现在消息配置界面中,并在转换的 XML(XML 中去除非法 XML 字符)中用作 XML 标签名。它可以设置为任何值。
Record Name
指定 section 内每个记录的名称。此名称出现在消息配置界面中,并在转换的 XML(XML 中去除非法 XML 字符)中用作 XML 标签名。它可以设置为任何值。
Record Separator
指示在 section 内的不同记录中应该使用什么分隔符。可以选择其中一项可用选项(双击字段以打开下拉框),也可以输入自定义分隔符。
可用选项包括:
- {platform newline} - 操作系统的平台换行(Windows 上使用 "\r\n" ,Linux 上使用 "\n")
- {if} - "\n"
- {crlf} - "\r\n"
- {cr} - "\r"
- {space}
- {tab}
下次记录的标准
指定当解析器将固定长度转换为 XML 时,使解析器能够知道它已经阅读了该 section 的内容的标准。当该 section 之后出现了不应被混淆为该 section 一部分的附加内容时,这一点非常重要。解析器需要知道在从此 section 继续之前,该 section 内出现了多少条记录。
有效值包括:
- fixedCount - 指定该 section 内存在的记录数量。解析器一旦看到这个数量的记录,就会从此 section 继续。 当选中此选项时,将出现名为 Record Count 的说明符;在这里,可以指定出现在该 section 中的记录数量。
- greedy - 指定文件中所有剩余内容都应视为该 section 的一部分。这本质上意味着在此 section 之后不会出现其他字段或 section。 在这种情况下,解析器“贪婪地”吃掉所有剩余的内容,并将其应用于该 section 。
- xpath - 在此 section 中的记录数量由文档中其他内容动态决定时,使用该选项。一个示例是文档中的 anther 字段指定此 section 中记录的数量。另一个示例是此 section 中的每个记录以分隔符开始。有关此选项的更多详情,请查阅以下内容。
这个 xpath 选项指定解析器继续将内容应用于此 section 的条件。只要该条件为真,解析器就认为它仍然在此 section 中;一旦条件变为 false,解析器将从此 section 继续。为了确定下一个内容是否为此 section 中的新纪录,将在读取记录开始时应用此条件。
选择此选项后,将出现名为 XPath 的新说明符。可以输入 xpath 表达式,说明应将内容应应用于此文档的条件。
计算条件之后,XPath 会应用于从固定长度文档创建的 XML 文档。
默认的 XPath 为 "count($section/*) < 1"。 让我们来看看这是什么意思。$section 是一个特殊的 XPath 变量,只在这个上下文中应用。它引用表示该节的 XML 元素。"$section/*" 获取 section 元素的子元素的所有 XML 元素的集合。基本上,它获取表示本节记录的所有 XML 元素。"count()" 是一个普通的 XPath 函数,计算传递给它的节点集职工的节点数。因此 "count($section/*)" 最终返回迄今为止添加到 XML 文档中的记录数量。完整的表达式本质上意味着“只要已经添加到此文档中的记录数量小于 1,就继续向这个部分添加记录”,这意味着默认情况下只添加一条记录。
然而,在多数情况下,要读取的记录数量是在文档中的其他字段指定的。 此时,应该使用 XPath,引用指定记录数量的文档中的字段。 记住,XPath 根据创建的 XML 文档进行计算,因此它引用 XML 文档中的 XML 元素。 如果文档有一个名为 "NumberOfPets”的字段,那么要定位该元素的对应的 XPath 可以是 "$section/../NumberOfPets"。这意味着“从表示这一节的 XML 元素开始,向上到父元素,然后获取 NumberOfPets 元素”。 这可以找到当前部分的兄弟元素 "NumberOfPets”。 在本例中,完整的 Xpath 表达式可以是
"count($section/*) < $section/../NumberOfPets"。
有两个可用的 Xpath 函数是这个上下文所特有的:fixedlen:peek() and fixedlen:peek-starts-with()
fixedlen:peek()
此函数以一个整数作为参数。 它查看固定长度文档中仍未读取和转换为 XML 的即将到来的内容。 如果根据文件中稍后出现的一些内容来确定这部分是否有更多要读取的记录,则使用此方法。例如,考虑记录以 "<” 字符开始的情况:
Doe Jane< Cat Fluffy>< Dog Spot>
在此情况下,您的 Xpath 表达式应该是 "fixedlen:peek(1) = '<'"。
fixedlen:peek-starts-with()
此函数以一个字符串作为参数。 它查看固定长度文档中仍未读取和转换为 XML 的即将到来的内容。 如果根据表示记录开始的一些分隔符来确定这部分是否有更多要读取的记录,则使用此方法。 例如,考虑记录以 "<” 字符开始的情况:
Doe Jane< Cat Fluffy>< Dog Spot>
在此情况下,您的 Xpath 表达式应该是 "fixedlen:peek-starts-with('<')"。
这个 fixedlen:peek-starts-with() 函数等价于 Xpath 表达式 "starts-with(fixedlen:peek(1), '<')"。
默认选项是贪婪的。这是通常使用的选项,除非在一个嵌套的子 section 中工作,并且它不是文档中的最后一个内容。
3.指定 component 字段和子 section
使用 Components 部分以提供该节中包含的字段和/或子 section 的详情。可在此处添加多个字段和/或子 section。
若要添加字段:
- 请选择 Components 节点。
- 将面板左下角窗格的框设置为 Field。
- 单击 Add。
对于每个字段,指定以下设置:
- Name - 输入字段的名称。此名称用于合适的工具控件中,并作为转换的 XML(XML 中去除非法 XML 字符)中的 XML 标签名。它可以设置为任何值。
- Type - 选择其中一个以下值:
- decimal - 指示此字段包含十进制值。
- integer - 指示此字段包含整数类型值。
- string - 指示此字段包含字符串类型值。
- Length - 指定字段的长度。
- Alignment - 指定字段中的值(当小于字段长度时)是否应该在左侧或右侧出现。
- Padding - 指定当字段中的值小于字段中的长度时要使用什么字符。通常,字符串字段使用空格,数字字段使用空格或 '0'。若要使用空格,请指定 {space}。否则,任何单个字母数字字符在这里都是有效的。
若要添加子 section:
- 请选择 Components 节点。
- 将面板左下角窗格的框设置为 Section。
- 单击 Add。
关于完成常规 section 细节的更多详情,请查阅 2.step2指定 section 的常规信息。
在树中编辑
数据建模编辑器的初始视图显示基于树的表中的数据模型。树格式允许轻松地查看数据建模的层级和结构。它以表格式显示,以便您可以编辑数据建模结构的上下文中的值。
在这个以表形式显示的树视图中,可编辑的字段可分为以下类别:
- Free-form text - 只需进入该字段并键入您想输入的任何文本。
- Combo box selections - 这些字段只允许您选择该字段预定义的值。可以双击该字段,弹出一个允许选择您的选择的组合框。或者可以进入这个字段,然后按住组合中某个选项的第一个字母(使该选项出现的选项),然后按 enter 键移动到下一个字段。
- Editable combo box selections - 可以双击该字段,弹出一个允许选择您的选择的组合框。或者,可以将任何值键入到要输入的字段中。
在表中编辑
当为大量字段输入数据时,可能希望将树格式转换为表格式,该表格式旨在提供一种快速而简单的方法来输入单个节的字段描述符。
若要切换至表视图:
- 选择要编辑的 Components 节点。
- 单击 Edit in Table 按钮。
表视图类似于电子表格。Section 中的每个字段都是表中的一行,并且每个表中每列对应其中一个字段说明符。 只需修改表中的最后一行并按下箭头键或回车(Enter)键,就可以在这个视图中添加更多字段。
也可以使用下面的按钮:
- Move Rows Up - 突出显示一行或多行,单击此按钮将在表中向上移动行。
- Move Rows Down - 突出显示一行或多行,单击此按钮将在表中向下移动行。
- Delete Rows - 突出显示一行或多行,单击此按钮将删除所选定行。
- Template for new row - 指定在向表中添加新行时,每个新字段的默认类型。
若要返回数据建模的主视图,请点击 Return to Full Data Model 按钮。
切换视图
在某些情况下,您的数据模型中定义了许多字段和节,并且您意识到需要在已经定义的字段中间添加一个新字段。
为实现这一目标:
- 将新字段添加在完整的数据模型视图或节表视图中。
- 切换至表节视图(单击 Edit in Table)。
- 在该视图中,将行向上向下移动。这将对应于在数据建模中移动字段和节。
- 切换回完整的数据模型视图(单击 Return to Full Data Model)已查看那里反映的更改。
测试数据模型
定义了数据模型后,您可能希望测试它以确保其是否反映您的固定长度数据格式。
为此:
- 确保数据模型已注册(如 Registering the Data Model中所述)。
- 将其添加值固定长度响应程序(如 Using the Data Model in Virtualize Tools中所述)。
- 使用所需消息配置响应程序。
注册数据模型
每个定义的数据模型需要在 Virtualize 注册之后,其相关格式才可以在 Virtualize 工具中使用。在要访问固定长度格式的每个 Virtualize 安装上必须执行此注册。如果同时安装了 Virtualize 和 SOAtest,则可以注册模型一次,然后将其用于两个产品。
注册数据模型有两种方法:
- 如果在数据模型编辑器中,请单击 Register data model directory 链接。它将注册包含正在的数据模型的完整目录。
- 否则:
- 选择 Parasoft> Preferences。
- 选择 Parasoft > XML Conversion。
- 单击 Add。
- 指定包含数据模型的数据模型目录。
在 Virtualize 工具中使用数据模型
一旦注册完成,数据模型便可用于固定长度消息响应程序,以及 XML 转换器中。 可以直接从添加响应程序(Add Responder)向导中创建一个固定长度消息响应程序。
为了执行固定长度消息配置或验证,必须在每个工具中的 Message type 组合框中选择数据模型。
现在可以像配置任何其他消息响应程序一样配置固定长度消息响应程序。有关配置标准消息响应程序行为的更多详情(如,关联性、性能文件等等),请查阅 消息响应器概要。
示例生成
当选择上述显示的消息类型后,Virtualize 会使用示例 XML(该 XML 在无需修改的情况下便可转换为固定长度数据)填充表单输入视图。
固定长度消息类型的数据模型定义决定了生成的 XML 的内容。XML 包含定义中指定的 section 和字段。
为每个 section 添加一个 XML 元素。每个 section 元素都包含记录的元素。该 section 的 Criteria for next record 设置决定了要向该 section 中添加记录的数量:
标准 | 添加的记录 |
---|---|
fixedCount | "Record count” 选项决定记录的数量。 |
greedy | 只添加一条记录。 |
xpath | XPath 是在生成 XML 时计算的。如果 Xpath 计算结果为 true,则将添加另一个记录。 Virtualize 始终至少添加一个记录,并且在 Xpath 多次计算为 true 的不太可能的情况下,从不添加超过 1000 条记录。 (由于记录数量添加了这些限制,所以使用 Xpath 标准导致无需修改便不可转换至固定长度数据的示例 XML 的这种情况很少) |
字段使用默认值进行填充。将整数和十进制字段设置为数字 1。将字符串字段设置为值 a。如果将示例 XML 转换为固定长度格式,则 Virtualize 将使用这个任意值而不是空值(空字符串)来阐明每个字段开始和结束位置。