本主题解释了在默认情况下,如何添加自定义传输,使客户机工具能够通过不支持的传输发送消息。
本章包含:
添加自定义传输
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 Implementation
这是一个可选类。这意味着您可以在 ICustomTransport.createNewConnection() 中返回 null,并期望在 invoke() 方法中得到 null。然而,很多协议都有会话或连接的概念,因此扩展性框架允许通过此接口来管理。
如果选中传输配置工具 GUI(在连接管理部分)中的 Keep connection alive 选项,您可以期望为测试的每次调用创建的 ICustomConnection 对象的新实例。否则,当测试执行使用相同的传输从一个测试流到另一个测试时,将重用相同的实例...直到测试关闭连接(如果选择 Close connection after test execution 选项),或者是直到所有执行完成。
SOAtest 在调用 invoke() 之前将会调用 connect() 方法。期望它将在 connection 对象中建立传输连接,或在该进程失败时抛出异常。close() 在测试执行最后调用,除非选中测试中的 “Keep connection alive” 选项。
期望 ICustomConnection 封装并携带您的连接和会话状态,但是除非选择 Keep connection alive,否则它不会在多个测试中重用。
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 文件中。部分输出没有编程影响;它只是帮助将各种 GUI 字段组织成节或类别,以便最终用户方便地访问和使用。
验证新传输
构建项目后重启 SOAtest。验证在传输菜单中显示的传输名称(如 parasoft-extension.xml 中指定)。
示例
可在 Parasoft 应用市场获得自定义传输实例(可以访问 marketplace.parasoft.com 或您团队的环境管理器)。若要使用任何这些传输,请将 jar 添加到系统首选项类路径列表,然后创建一个新的 SOAP 客户机或其他消息传递客户机工具或重新打开一个您正在使用的 .tst 文件。
传输菜单中的“自定义扩展”项将重新命名,以反映实现类名称。您可以在测试中立即使用该传输。可以使用 File> Import> General/Existing Projects into Workspace> Select archive file,将示例传输源导入到 SOAtest(或 Eclipse)。导入后,将 [SOAtest install dir]/plugins/com.parasoft.xtest.libs.web_[version]/root/com.parasoft.api.jar 添加到 Java 项目类路径,以便构建项目。
提示
- 当使用配置的自定义传输扩展保存 .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 控件还可用来参数化字段。