本主题介绍在默认情况下,如何添加自定义传输,使客户端工具能够通过不支持的传输发送消息。

章节目录:

添加自定义传输

Parasoft SOAtest 包括允许您扩展 SOAtest 的内置传输和协议。它现在支持您是用的任何传输或协议 — 例如:DDS、纯 socket 或基于 TCP/IP 的消息传递、基于文件的消息传递以及基于专有 API 的消息传递。这个扩展是使用 Java 完成的。 

可以自定义 SOAP 客户端、EDI 客户端和消息传送客户端工具,以显示满足组特定需求的传输实现。一旦自定义传输实现被插入到 SOAtest 中,您仍可使用 SOAP 客户端和其他消息工具常用的 WSDL、Schema 以及请求消息构造功能。通过必要协议的消息的实际交付和接收由传输实现处理。 

为自定义传输实现的接口

根据添加扩展的通用程序中的说明将环境设置好后,实现以下接口(Extensibility API 文档中有作说明):

  • com.parasoft.api.transport.ICustomConnection (optional)
  • com.parasoft.api.transport.ICustomTransport
  • com.parasoft.api.ICustomMessage<T> (or reuse/extend com.parasoft.api.DefaultCustomMessage<T>)

ICustomTransport Implementation

这是一个必须类。createNewConnection() 方法应返回一个 ICustomConnection 的类实例,或如果协议不需要时返回 null。invoke() 方法采用:

  • 可重复用于多次调用的连接对象。
  • 永远不可能为 null 的配置,它为传输实现类提供了来自 GUI 工具的值。
  • 实现 ICustomMessage 并包含由 GUI 工具提供的请求消息内容的请求。
  • 当调用 CustomTransportConfiguration 累上的方法时,将上下文传递给配置对象的其他方法。它还包括报告错误、从数据源列获取值、变量等方法。

单向(仅发送)传输会有一个返回 null 值的 invoke() 方法。

ICustomConnection 实现

这是一个可选类。这意味着您可以在 ICustomTransport.createNewConnection() 中返回 null,并期望在 invoke() 方法中得到 null。然而,很多协议都有会话或连接的概念,因此扩展性框架允许通过此接口来管理。 

如果选中传输配置工具 GUI(在连接管理部分)中的保持连接选项,每次调用测试时都会创建一个新的 ICustomConnection 对象实例。否则,当测试执行使用相同的传输从一个测试顺利进行到另一个测试时,将重用相同的实例,直到测试关闭连接(如果选择测试执行后关闭连接选项),或者是直到所有执行完成。

即使启用了保持连接选项,SOAtest 将始终在调用 ICustomTransport.invoke() 方法之前调用 connect() 方法。预期的行为是 SOAtest 在连接对象内建立传输连接,或者在该过程失败时抛出异常。除非测试中的保持连接选项已启用,否则在测试执行结束时会调用 close() 方法。

期望 ICustomConnection 封装并携带您的连接和会话状态,但是除非选择保持连接,否则它不会在多个测试中重用。

ICustomMessage

需要实现该接口,以便它可以通过 ICustomTransport.invoke() 实现类返回一个实例。或者,如果您的消息内容格式是用字符串的最好代表,您可以使用默认实现类 DefaultCustomMessage<T>。参数化类型可用于用字符串键控的属性(或头部)对象类型。getHeaders() 返回的字符串是 SOAtest 在通讯报文查看器头文件区中显示的字符串。getBodyString() 返回的字符串是 SOAtest 在通讯报文查看器有效负载(Body)区中显示的字符串。

为自定义传输定义 parasoft-extension.xml

实现必要类后,如下定义 parasoft-extension.xml

<?xml version="1.0" encoding="UTF-8"?>
<extension xmlns="urn:com/parasoft/extensibility-framework/extension"
	type="transport" 
	name='The name of your transport, appears in the transports menu' description='A more detailed description'>
  <class>com.mycompany.MyTransport</class> <!-- implements ICustomTransport -->
  <form xmlns="urn:com/parasoft/extensibility-framework/gui">
	<!-- This describes the fields you wish to appear in your transport GUI --> 
	<section label="field group 1">
		<field id="key 1" label="field 1"/> 
		<field id="key 2" label="field 2"/> 
		...
		<section label="field group 2">
		<field id="key 3" label="field 3" />
	</section>
	<section label="field group 2">
		<field label="field 1" /> 
		...
	</section>
	...
  </form>
</extension>

section 元素下的字段标签可用作键,用于从传入各种 API 方法的 CustomTransportConfiguration 对象中获取值,这样就可以将用户提供的值传入您的实现中。在 GUI 中显示的字段标签是基于该 XML 构造的,他们还用于保存时将用户提供的值保存到 .tst 文件中。section 布局不存在编程影响;它只是帮助将各种 GUI 字段组织成 sections 或 categories,以便最终用户方便地访问和使用。

验证新传输

构建项目后重启 SOAtest。验证在传输菜单中显示的传输名称(如 parasoft-extension.xml 中指定)。

示例

GitHub 提供了自定义传输实现的示例。若要使用任何这些传输,请将 jar 添加到系统首选项 classpath 列表,然后创建一个新的 SOAP 客户端或其他消息传送客户端工具或重新打开一个您正在使用的 .tst 文件。 

传输菜单中的“自定义扩展”项将重新命名,以反映实现类名称。您可以在测试中立即使用该传输。可以使用文件> 导入> 常规/现有项目到工作空间中> 选择归档文件,将示例传输源导入到 SOAtest(或 Eclipse)。导入后,将 <INSTALL>/plugins/com.parasoft.ptest.libs.web_<VERSION>/root/ 目录中的 com.parasoft.api.jar 文件添加到 Java 项目 classpath 中,以便构建项目。

提示

  • 当使用配置的自定义传输扩展保存 .tst 文件时,仍然可以使用没有该扩展名的 SOAtest 安装打开该文件。然而,将在 SOAtest 的控制台视图中显示错误消息,并且使用该传输的测试将不会执行。在没有传输扩展名的情况下,重新保存 .tst 将导致在使用扩展名重新打开文件时丢失自定义配置。这是为了避免 .tst 文件中的“泄漏”,其中包含未使用的或过时的配置数据。
  • 将提供给扩展 GUI 的值保存为名称-值字符串映射。作为结果,重新整理 parasoft-extension.xml 表单元素中的字段不会影响用户值的保存方式;但更改 ID 会对此产生影响。id 用于保存或加载值,因此它们必须是唯一的。如果更改它们,则先前保存的配置将不会加载以前的值,并且将变为空。然而,您可以使用修订更新器将用老 id 保存的老设置迁徙到新 id 集。
  • 无论是否使用,传输扩展 GUI 的 Connection Management 部分将总是会出现。
  • 仅支持自定义表单 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>
  • 表格或列表可以在字符串字段中实现为逗号分隔的值。
  • 可以使用 ${var_name} 语法引用扩展 GUI 字段中的数据源、数据库值、环境变量和测试套件变量。批准的“参数化”和“脚本化”GUI 控件还可用来参数化字段。
  • No labels