IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  SOA and Web services | WebSphere  >

测试 SOA 中基于 Human Task 的服务

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


王 海艳 (wanghaiy@cn.ibm.com), 软件测试工程师, IBM
杨 乐 (yangle@cn.ibm.com), 软件工程师, IBM

2008 年 6 月 05 日

随着 SOA 技术的不断发展 , 为保证 SOA 服务的质量 ,SOA 测试也越来越重要。Human Task 作为一个需要人工干预的服务在 SOA 中被广泛使用。本文针对调用 Human Task 的 SOA 服务为 SOA 测试工程师提供了测试准备,环境部署,测试执行等一整套的测试工作。

引言

随着 SOA 的普及,越来越多的应用程序使用 SOA 技术构建。“服务”是 SOA 的关键,一般来说,服务提供者为程序,但在某些领域(如业务流程管理)中却存在着一些例外,很多活动需要参与人员借助自身的专业知识和经验,才能做出判断,这类活动包括异常情况的人工处理、各种请求的审批等。IBM WID/WPS 中的 Human Task 技术,提供了一种将人工活动封装为 SOA 服务的途径,它使用和普通服务一样的接口描述语言来定义服务接口,使得人工活动作为一种特殊的服务平滑的集成到 SOA 架构中。

鉴于 Human Task 的特殊性和复杂性(特别是涉及到用户、角色和权限等安全概念),使用了 Human Task 的 SOA 服务在其开发和测试的过程中具有很多的独特之处,本文从测试的角度,详细的描述了测试此类服务的完整过程,从而保证开发的服务在功能上和性能上均能满足业务场景的复杂需求。

本文从内容上可以分为两个部分:第一部分描述测试环境的搭建,包括使用 WID 进行 Human Task 模板设计,启用 WPS 全局安全,并配置 LDAP 来管理 Human Task 用户,以及部署 Human Task 模板和待测试服务到 WPS 等;第二部分主要关注服务的测试,使用 SOA Testing Framework 对 SOA 服务进行功能测试,使用 RPT(Rational Performance Tester) Extension for SOA Quality 进行性能测试。





回页首


在 WID 中设计 Human Task 模板

每一个 Human Task 实例都需要根据预先设计好的 Human Task 模板来创建。在这里,我们使用 WID 创建模板,指定模板的类型、名字和名字空间等基本属性,同时映射用户角色到具体的用户或组。详细步骤如下:

1. 打开 WID Business Integration view,创建 Module,填入 Module 名字。

2. 创建 Human Task,选择任何一种 Human Task 类型(以 Pure Human Task 为例)。

3. 通过 Properties 来设定 Human Task 的基本属性,包括 Task 优先级,是否允许自动 Claim 等。

4. 通过 Originator Settings/Receiver Settings 来映射角色到 LDAP 用户或组,可能的角色包括 Potential Instance Creator,Administrator,Potential Owner, Editor 和 Reader,这样可以确保有权限的用户才允许做相应的操作。


图一设定用户

这里我们以 Potential Owner 为例,Potential Owner 表示哪些用户可以声明相应的任务,被声明的任务将只能由该用户(或管理员)处理。如图一所示,我们指定 taskGroup 这个组里面的所有用户都可以声明使用当前模板创建的任务。同时也可以看到,对于用户和组的管理,WID/WPS 支持 LDAP,User Registry 和 System,这里选择 LDAP 来管理用户。

Note:如果 Verb 使用 Group 选项,既映射某个角色到一个指定的组时,需要使用组的全名,如 cn=taskGroup,dc=groups,dc=cbs。

5. 将此 Human Task 拷贝到 Assembly Diagram 中,导出工程为 ear 文件。





回页首


在 WPS 服务器上部署、管理 Human Task 模板和待测试服务

在 WPS 中启用全局安全和配置 LDAP

首先登录到 WPS Admin Console 中,在目录 Security-Global Security 中选择 Enable Global Security,使用 LTPA 验证机制,同时选用 LDAP 来管理用户,具体的 LDAP 配置如图二所示。


图二配置 LDAP

部署 Human Task 模板到 WPS 应用服务器

1. 选择安装一个新工程,选择模板 Ear 文件;

2. 启动应用;

3. 通过 BPC 来验证模板是否部署成功,http://server:port/bpc。

Note: 如果模板用户中使用了 Group 属性,在 Server->ApplicationServer->HumanTaskContainer 中选中 Enable group work items, 这样模板才能成功部署。

从 WPS 应用服务器中卸载 Human Task 模板

1. 删除 BPC 中所有该模板的实例;

2. 在目录 Application -> Enterprise Applications -> template application -> EJB Modules-SampleEJB.jar-Human tasks, 选择要卸载的模板,stop 模板;

3. 卸载模板应用。

部署待测试的服务

部署待测试服务(其调用了 Human Task)的步骤同部署 Human Task 模板的 1,2 步类似,如果该服务有额外的包依赖,则需要为其配置共享 Library。





回页首


使用 JUnit 对 SOA 服务进行功能测试

由于 SOA 服务的特殊性,目前还没有成熟的自动化测试工具,来帮助测试人员完成服务的功能测试。考虑到 SOA 服务可以方便的导出为 Web 服务,所以可以将其视为一个普通的 Web 服务,使用传统的测试工具 JUnit 来进行功能测试。通常来说,SOA 服务的功能测试步骤如下:

获取服务 WSDL 文件,并生成 Web Service 客户端

使用 WID 中,右键选中待测试服务提供的 WSDL 文件,在弹出菜单中选择 Web Service -> Generate Client,生成 Java 客户端代码(如图三所示),按照提示完成整个过程。需要特别注意的是,需要选择合适的 WPS Server 版本,以保证生成代码的可用性。


图三生成 JAVA 客户端

编写 WS-Security 相关的辅助类

为了在 Web 服务的请求中加入 UsernameToken 信息,需要编写一个辅助的 SOAP 消息 Handler,来配合生成的 Java 客户端一起使用。在 SOAP 消息发出前,该 Handler 会将用户名密码以 WS-Security 定义的格式写入消息头部,用以标识服务调用者的身份。下面是 Handler 的部分代码,完整的类定义可在附件中得到。

代码一 SOAP 消息 Handler

public class UsernameTokenSigner extends GenericHandler {
// ……
 public boolean handleRequest(MessageContext mc) {
 try {
 SOAPMessage msg = ((SOAPMessageContext) mc).getMessage();
 SOAPPart part = msg.getSOAPPart();
 SOAPEnvelope envelope = part.getEnvelope();
 SOAPHeader header = envelope.getHeader();
 if (header == null)
 header = envelope.addHeader();
 SOAPHeaderElement wsSecurityElement = (SOAPHeaderElement)\
 header.addChildElement(wsSecurityElementName);
 wsSecurityElement.setMustUnderstand(true);
 SOAPElement userNameTokenElement = 
 wsSecurityElement.addChildElement("UsernameToken", "wsse");
 SOAPElement userNameElement = 
 userNameTokenElement.addChildElement("Username", "wsse");
 userNameElement.addTextNode(username);
 SOAPElement passwordElement = 
 userNameTokenElement.addChildElement("Password", "wsse");
 passwordElement.addTextNode(password);

 passwordElement.addAttribute(envelope.createName(TYPE), PASSWORD_TYPE);
 } catch (SOAPException e) {
 }
 return true;
}
// ……
}

编写 JUnit 测试用例

新建一个 JUnit 测试用例(TestCase), 为了使用 Web 服务方式访问 SOA 服务,需要初始化第一步生成的 Web 服务客户端,同时配置第二步定义的 SOAP 消息 Handler 来处理 UsernameToken,初始化过程的代码如下,

代码二初始化 Web 服务客户端

protected void setUp() throws Exception {
super.setUp();

 IfTaskManagementServiceExport1_IfTaskManagementServiceHttpServiceLocator 
 serviceLocator = new 
 IfTaskManagementServiceExport1_IfTaskManagementServiceHttpServiceLocator(); 
 
 // add a message handler to handdler registry
 Map handlerConfig = new HashMap();
 handlerConfig.put("username", "jim");
 handlerConfig.put("password", "123456");
 HandlerInfo handlerInfo = new HandlerInfo(UsernameTokenSigner.class, handlerConfig,
 UsernameTokenSigner.HEADERS);
 QName servicePortQName = (QName) serviceLocator.getPorts().next();
 List list = serviceLocator.getHandlerRegistry().getHandlerChain(servicePortQName);
 list.add(handlerInfo); 
 
 this.service = serviceLocator.getTaskManagementWSExport_IfTaskManagementServiceHttpPort(\
 new URL(endpoint));
}

初始化工作完成以后,就可以使用 Web 服务客户端来方便的访问 SOA 服务了。每一次服务调用都是以初始化过程中指定的用户身份进行的,所以需要保证此用户拥有进行该 Human Task 操作的相应权限。下面的代码片段(代码三),测试了待测试 SOA 服务的一个操作。可以根据实际的测试需求,编写各种测试方法,以保证待测试 SOA 服务的质量。

代码三测试 SOA 服务

public void testCreateTask() throws Exception {
 String taskId = this.service.createTask("http://soa.ibm.com/HTService/test", 
 "SampleHumanTask", null, null, null);
 assertNotNull("failed to create task", taskId);
}

运行测试用例获取测试报告

和运行普通的 JUnit 测试用例一样,在 WID 中,右键选中编写好的测试用例,在弹出菜单中选择 Run -> JUnit Test,在运行完后,会显示出类似下图(图四)的测试报告。


图四测试报告





回页首


使用 RPT Extension for SOA Quality 对 SOA 服务进行性能测试

该章将详细介绍如何使用 RPT Extension for SOA Quality 对 SOA 服务进行性能测试,包括安装工具,编写测试用例,运行性能调度,分析测试报告。

安装性能测试工具 RPT Extension for SOA Quality

1. 安装 RPT 7.0,同时打开 Install Manager 导入 Jar 文件来激活 RPT 7.0 的 License



2. 更新 Install Manager 的文件包

3. 更新 RPT 7.0 为 RPT 7.0.0.2

4. 基于 RPT 7.0.0.2,安装 RPT Extension for SOA Quality,如步骤 1 来激活 RPT Extension for SOA Quality 的 License

编写 Test Case

1. 创建性能测试工程,选择如下图所示的 Web service Recording


图五创建性能测试工程

2. 创建测试 Suite

在创建的工程中新建一个测试 suite,导入要测试的 WSDL 文件,选择该 WSDL。


图六导入 WSDL 文件到性能测试工程中

3. 点击 Next,将看到该 WSDL 文件的所有 Operation。这时停止记录,生成测试 Suite。


图七 WSDL 中包含的所有 Operation

4. 在测试 Suite 中调用 WebService Call


图八调用 Web Service Call

5. 选择要测试的 Operation,同时填写必要的信息


图九选择相应的 Operation


图十添加 Input 为 CreateTask

6. 设置 Human Task 的用户信息

如图示在当前的 Service 使用了基本认证方式,我们设置当前操作 CreateTask 的用户是 testuser。


图十一设置用户信息

7. 建立域引用和使用域引用

测试过程中,很多 Operation 的输入要依赖上一个 Operation 的输出,而域引用可以解决这方面的问题。


图十二建立域引用


图十三使用域引用

运行测试调度

测试用例建立完毕之后,需要进行测试调度的设计,包括并发用户,Think Time,Delay Time, Loop 次数的指定。

1. 建立测试调度


图十四建立测试调度

2. 运行测试调度,Run As Performance Schedule,查看测试报告


图十五测试报告 -Summary


图十六测试报告 - 响应时间结果图

分析测试报告

测试调度运行结束后,我们会看到测试报告和测试日志。测试报告包括 Web Service 调用成功率,平均响应时间,各个 Operation 的平均响应时间等。同时我们可以根据并发用户和平均响应时间来计算相应 Service 的吞吐量,以此查看吞吐量是否符合 NFR 的性能指标。测试日志则显示了测试用例执行过程中真实的数据流和信息流。





回页首


总结

SOA 测试目前处于探索阶段,Human Task 作为 WPS 重要的组成部分也必将更多的在 SOA 开发中使用。本文对于 SOA 测试的讲述,希望可以给 SOA 测试人员带来帮助。



参考资料

学习

获得产品和技术
  • 使用 IBM 试用软件 开发您的下一个项目,可下载或索取 DVD 光盘。


讨论


作者简介

王海艳毕业于吉林大学,是 IBM GBSC Team 的一员,工作职位为 SOA软件测试工程师,一直专注于SOA测试工作。


杨乐是IBM中国软件开发中心 GBSC 的软件工程师,其所在团队从事 SOA 行业方案的设计和开发,他的专长和兴趣包括 J2EE、Web 服务、XML 和 Security 等。您可以通过 yangle@cn.ibm.com和他联系。




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款