本主题介绍如何扩展 SOAtest 的接口和操作,以覆盖默认情况下不支持的消息格式。章节目录:

关于自定义消息格式

SOAtest 和 Virtualize 包括允许扩展其内置消息格式的框架。该框架支持您正在使用的任何消息格式。例如,大型机消息格式、二进制消息格式或其他任何类型的私有自定义消息格式。消息格式通过创建本地格式和 XML 之间的转换来定义。该转换允许用户使用可用的富 XML 工具构建和验证消息。这个扩展是使用 Java 完成的。 一旦添加了自定义消息格式,SOAtest 将自动生成一个新的客户端,用于配置和发送使用该格式的请求或响应消息。  您可以将新客户端/响应器实例添加到测试场景或响应器套件中。 有关如何使用的详情,请参阅自定义客户端。 新的消息格式也将出现在 XML 转换器工具中,该工具在 XML 转换器中有所描述。

除了定义格式之间的一般转换外,还可以选择定义一套指定消息类型,该类型定义该格式中每条消息的确切结构。例如,用户可能将一般 FIX 定义为 XML 转换,然后又定义一套应用程序使用的特定 FIX 消息。每个消息类型结构都由 XML 模式定义,并由 SOAtest 或 Virtualize 扩展提供。

实现自定义消息格式的接口


设置好环境后(添加扩展的通用程序,请实现以下接口(在 Extensibility API 文档中有描述):

  • com.parasoft.api.message.ICustomXMLConverter
  • com.parasoft.api.message.ISchemaGenerator (optional)

ICustomXMLConverter 实现

这是一个必须类,用于实现与本机格式和 XML 之间的转换逻辑。这个 toXML() 方法应以 XML 格式返回消息,而 toNative() 方法应以原生格式返回消息。采取的方法:

  • INativeMessageIXMLMessage,可用于检索被转换的消息表现形式。
  • IConversionContext,提供配置设置以及在不同方法之间共享数据的方法。此外,IConversionContext 继承了 ScriptingContext,这是一个标准的 Parasoft 脚本上下文,允许访问变量、数据源值和设置/获取对象,以便跨工具共享。

toXML() 返回 INativeMessage,toNative() 返回 IXMLMessage。为方便起见,这些接口都有默认实现(DefaultNativeMessageDefaultXMLMessage)。

对于 toNative,实现者必须处理 xmlMessage 参数的消息类型为 {@code null} 的情况。如果正在定义的特定转换不知道如何在不传递特定消息类型的情况下将 XML 转换为本机消息,则应该抛出 {@link CustomConversionException}

对于 toXML,可以选择编写转换,以便自动检测传入的 nativeMessage 的消息类型。此自动校测用于确定在从字面量切换为表单视图或在使用通讯报文向导生成资产时的消息类型。如果转换不支持自动检测,那么需要明确选择消息类型,或者 SOAtest/Virtualize 尝试检测消息类型(这在某些情况下可能不正确)。若要支持自动检测,实现者应该忽略传入的 nativeMessage 的消息类型。相反,它们应该自己确定消息类型,并将其设置为返回的 XML 消息。 

实现者必须处理 nativeMessage 参数的消息类型为 {@code null} 的情况,因为这是自动检测支持的确定方式。如果正在定义的特定转换不支持自动检测,因此不知道在不传递特定消息类型的情况下如何进行转换,则应该抛出 {@link CustomConversionException}

转换期间遇到的错误有两种处理方式。如果错误为致命错误,则必须终止转换,并且应该抛出一个 CustomConversionException 异常,其中包含适当的错误消息。如果错误不是致命错误(意味着转换可能继续),则会使用 IConversionContext.report(String message) 报告一则消息,并且方法仍然应该返回(可能部分)已转换的消息。如果错误是通过抛出异常或调用 report() 报告的,那么它将在客户端/响应器 UI 中作为对话框报告,或者在运行客户端/响应器时作为错误消息报告。

这些转换是在以下情况下由客户端/响应器和 XML 转换器工具执行的: 

  • 在表单和字面量视图之间切换
  • 从表单输入或表单 XML 视图构建要通过网络发送的消息
  • 处理接收的消息
  • 执行 XML 转换器工具

ISchemaGenerator 实现

在为给定消息格式定义特定的消息类型时,必须为每种消息类型提供 XML 模式。这是可选类,提供一个方法,该方法为给定的特定消息类型提供了 XML 模式。如果没有实现这个类,也不在 parasoft-extension.xml 中引用它,相反,您必须提供对模式文件的引用(查阅下面的定义自定义消息格式的 parasoft-extension.xml)。

此接口有一个方法,generateSchema(),接收:

  • 一个 IMessageType,它提供关于要生成 Schema 的消息类型的信息。传入的 IMessageType 实例将包括 parasoft-extension.xml 中定义的消息类型的 id 和名称。
  • ICustomXMLConverterConfiguration 提供对自定义消息格式客户端/响应器的“转换选项”选项卡中值的访问。

generateSchema() 返回一个 URI,它是 Schema 文件的引用。它可以是对动态生成的模式的引用、也可以是对 jar 文件中提供自定义消息格式扩展的模式的引用,还可以是对外部资源的引用。如果在生成 Schema 时出现错误,那么可以返回空 URI;这将导致表单输入视图不会针对给定的消息类型正确进行填充。 

定义自定义消息格式的 parasoft-extension.xml


实现必要的类后,请使用以下 Schema 定义 parasoft-extension.xml(在添加扩展的通用程序中有所介绍):

<?xml version="1.0" encoding="UTF-8"?>
<extension xmlns="urn:ocm/parasoft/extensibility-framework/extension"
		type="messageFormat"
		name='the name of your message format, appears in menus' description='A more detailed description'>
    <class>com.myCompany.MyConverter</class> <!-- implements ICustomXMLConverter -->
    <messageFormat xmlns="http://schemas.parasoft.com/extensibility-framework/messageFormat">
		<defaultMimeType>text/plain</defaultMimeType>
		<messageTypes generatorClass="com.myCompany.SchemaGenerator">
		<messageType id='unique ID' name='name' xsd='path to schema in jar'/>
			. . .
		</messageTypes>
		<client icon="myClient.gif" defaultTransport='default transport' /> 
		<responder icon="myResponder.gif" /> 
    </messageFormat>
    <version id='your version ID' updaterClass="com.myCompany.myUpdater"/>    
	<form xmlns="urn:com/parasoft/extensibility-framework/gui">
		<section label="field group 1">
			<field id="key 1" label="field 1"/>
			<field id="key 2" label="field 2"/>
		</section>
		<section label="field group 2">
			<field id="key 3" label="field 3"/>
			. . . 
		</section>
		. . .
    </form> 
</extension>

此处 section 元素下的字段 ID 被用于传递到各种 API 方法的 ICustomXMLConverterConfiguration 实例检索值,该对象允许将用户提供的值传递到实现中。它们还可用于在保存值时,将用户提供的值保存到响应器部署描述符文件中。GUI 中出现的字段标签是基于此 XML 构建的。section 布局不存在编程影响;它只是帮助将各种 GUI 字段整理为不同的部分或分类,以便最终用户方便地访问和使用。 

实现 ICustomXMLConverter 的类的完全限定类名以及扩展名被用于识别在客户端/响应器中使用的消息格式。更改保存 .tst 或 .pva 文件后扩展的限定类名或扩展名将阻止已保存的客户端或响应器解析它们正在使用的消息格式。 

<MessageFormat> Element

该元素对于此扩展类型是唯一的。要导入自定义消息格式,它必须有效且正确。

  • <defaultMimeType>: 指定消息格式的默认 MIME 类型。此 MIME 类型被用于识别消息包含的信息类型。默认的 MIME 类型被用作发送消息时,消息头中的 Content Type。
  • <messageTypes>: 这是一个可选的元素,定义一套特定消息类型。如果没有提供 messageTypes 元素,则定义本机格式与没有定义特定消息类型的 XML 之间的一般转换。CSV 就是这种格式的一个例子。
    • generatorClass - 一个可选属性,具有实现 ISchemaGenerator 类的完全限定名称。
  • <messageType>: 定义自定义消息格式的消息类型。
    • id - 消息类型的字符串标识符。在给定消息格式中必须是唯一的。也用于保存客户端/响应器,因此更改它将导致保存的客户端或响应器无法解析正在使用的消息类型。

    • name - 用于显示 GUI 中消息类型的名称。
    • xsd - 到 xsd 的 URL 路径。如果没有提供生成器类,则要求该属性。否则,直接忽略。

  • <client>: 可选元素,其中包含为自定义消息格式生成的自定义 SOAtest 客户端的一些基本信息。
    • icon - 可选属性,指定自定义 SOAtest 客户端在 GUI 中显示的图标。这是一个到图标的相对路径,其中包含在 SOAtest classpath 的 jar 文件或 Java 项目中。如果没有提供,那么 SOAtest 将为自定义 SOAtest 客户端使用其默认工具图标。
    • defaultTransport - 可选属性;在客户端中使用默认的 SOAtest 传输。可能的值有:
      • HTTP 1.0 (默认)
      • HTTP 1.1
      • JMS
      • SonicMQ
      • WebSphere MQ
      • RMI
      • SMTP
      • TIBCO
      • .NET WCF HTTP
      • .NET WCF TCP

验证新的消息格式

  1. 构建项目(请参阅添加扩展的通用程序)并重启 SOAtest。

  2. 验证包含消息格式名称的新客户端/响应器是否可用于添加到 .tst 或 .pva 文件,其通过选择新建> 测试或响应器。

新格式也应该在 XML 转换器的下拉菜单中列出。

提示

  • parasoft-extension.xml 文件中定义的 GUI 字段出现在自定义消息格式客户端/响应器的“转换选项”选项卡中。

  • 将提供给扩展 GUI 的值保存为名称-值字符串映射。作为结果,重新整理 parasoft-extension.xml 表单元素中的字段不会影响用户值的保存方式;但更改 ID 会对此产生影响。id 用于保存或加载值,因此它们必须是唯一的。如果更改它们,则先前保存的配置将不会加载以前的值,并且将变为空。然而,您可以使用修订更新器将用老 id 保存的老设置迁徙到新 id 集。
  • 仅支持自定义表单 GUI 中带字符串值的 GUI 字段。如果扩展要求 integer 或其他类型,则您可以将字符串内容转换为扩展实现类中的所需类型。

  • 如果希望 GUI 字段用作密码字段(输入屏蔽和安全保存特定密码),请给该字段元素一个设置为密码类型的属性。例如,以下设置 pwd 字段为密码模式:

    <form xmlns="urn:com/parasoft/extensibility-framework/gui">
    	<section label="Main Settings">
      		<field id="usr" label="Username"/>
      		<field id="pwd" label="Password" type="password"/>
    	</section> 
    </form>

  • 表格或列表可以在字符串字段中实现为逗号分隔的值。

示例

假设您有自定义消息格式 SimpleMessage,其由键和值对与空格分隔符组成(例如:key1=value1 key2=value2 key3=value3 key4=value4)。

一旦将这个自定义格式添加到 SOAtest 中,SOAtest 将能够在 SimpleMessage 和 XML 之间转换。例如,它可以使 

key1=value1 key2=value2 key3=value3 key4=value4

转换为/转换自

<?xml version="1.0" encoding="UTF-8"?> 
<message xmlns="">
    <body>
		<key1>value1</key1>
		<key2>value2</key2> 
		<key3>value3</key3> 
		<key4>value4</key4>
    </body> 
</message>

该项目定义了两种消息类型。 

  • NameSchema: 包含两个键值对,其中键为 FirstName 和 LastName。
  • SimpleSchema: 包含上面引用的四个键值对。

将该示例自定义格式添加到 SOAtest 有两种方法:从 Java 源项目中,您可以从 GitHub 下载,或者从可以从该项目创建的 jar 文件中下载。

从 Java 源项目中添加格式

若要从 Java 源项目中添加示例格式:

  1. https://github.com/parasoft/soavirt-extension-examples 下载项目压缩文件并解压。
  2. 将提取到的文件作为 Java 项目导入工作空间。
  3. 在 SOAtest 透视图中,前往 Parasoft> 首选项,选择系统属性,点击添加 Java 项目,指明示例 Java 项目的位置,然后点击应用。
     
  4. 重启 SOAtest

创建 Jar 文件

提供 Java 源项目,因此可以查看示例源码。Jar 文件通常是跨团队共享自定义格式的更简单方法。 

若要将此示例 Java 项目转换为 jar 文件:

  1. 在 Java 透视图中,右键点击 Java 项目,选择导出
  2. 选择 Java> JAR 文件,点击下一步
  3. 指明希望在何处创建 jar 文件,然后点击完成。
     

从 Jar 文件中添加格式

现在,其他团队成员可以从 jar 文件中添加自定义格式(而不是从 Java 项目。如果已经如上所述从 Java 项目中添加了格式,则就不需要完成这些步骤):

  1. 在 SOAtest 透视图中,前往 Parasoft> 首选项,选择系统属性,点击添加 JARs,指明示例 jar 文件的位置,然后点击应用。
     
  2. 重启 SOAtest

在 SOAtest 工具中使用自定义格式

一旦示例添加到 SOAtest,那么就可以创建 SimpleMessage 客户端工具也可以使用 XML 转换器工具中的格式。 




对于 SimpleMessage 客户端,可以使用其中一种消息类型,或者以字面量模式输入自己的键值对。 

  • No labels