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

developerWorks 中国  >  WebSphere | SOA and Web services  >

IBM WebSphere 开发者技术期刊: 对 Service Component Architecture 模块的可靠和可重复的单元测试——第 1 部分

为 SCA 模块创建自动化的单元测试

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

样例代码


级别: 中级

David J.N. Artus (artusd@uk.ibm.com), IT 咨询专家, IBM

2006 年 11 月 13 日

自动化测试为验证解决方案组件的质量提供了一个可重复的有效方法。本文将自动化测试方法应用到 Service Component Architecture (SCA) 模块,目的是进一步增强 WebSphere® Process Server 和 WebSphere ESB 环境中 SOA 应用程序的完整性。

摘自 IBM WebSphere 开发者技术期刊

引言

如果您是 Service Component Architecture (SCA) 模块的创建者,则您的主要职责是提供从 SCA 模块导出的服务接口的可靠实现。模块接口的自动化测试使得 SCA 组件开发人员能够使用可重复而又有效的方法来验证提交组件的质量。

本文介绍模块接口测试集的实现;测试对某一指定的输入数据,是否获取特定的响应。后续文章将讨论如何测试更复杂的组件(如 BPEL 进程),其中您还需要考虑如何测试副作用。

示例方案

我们将测试一个非常简单的组件,该组件验证英国的邮政编码,并返回与该邮政编码对应的地址的详细信息。为了方便起见,可下载 zip 文件中包括了适用于此示例的文件。

此邮政编码组件在 L_MailService 库中定义了其接口,并在可下载文件中的 MP_MailService 模块中提供此组件。下面的图 1 到 3 显示了 IBM WebSphere Integration Developer 组装图、组件接口和我们要测试的服务操作所返回的 PostCodeDetails 数据对象的定义。


图 1. 组装图:组件和导出
组装图:组件和导出

图 2. getDetailsForPostCode 操作
getDetailsForPostCode 操作

图 3. PostCodeDetails 业务对象
PostCodeDetails 业务对象

如果为实际使用开发此类组件,则我们可能需要编写大量的不同测试,并提供输入数据的多种组合。不过,对于本文而言,我们仅编写两个测试:

  • 调用具有有效邮政编码的服务的测试,并检查是否返回了一组已知数据。
  • 提供无效邮政编码的测试,并检查是否发生错误。




回页首


测试准备

在我们实际开始编写测试之前,必须先做一些准备工作。概括地讲,这些工作为:

  1. 安装 JDK 更新
  2. 导入测试实用工具
  3. 创建测试模块
  4. 设置模块依赖关系
  5. 将 Cactus 框架添加到测试项目
  6. 组装模块

A. 安装 JDK 更新

使用 Cactus 框架会暴露随 WebSphere Integration Developer V6.0.1 提供的用于 Windows® 平台的 JDK 版本中的缺陷,该缺陷在 J2RE 1.4.2 IBM Windows 32 build cn142-20050929 (SR3) 和更高版本的 J2RE 中得到了修复。您可以使用适当的 IBM SDK 安装程序将修补程序应用到 WebSphere Process Server 测试环境,也可以将您的测试环境更新为 WebSphere Process Server V6.0.1.2,该版本包括 J2RE 1.4.2 IBM Windows 32 build cn142ifx-20060209 (SR4-1), 您需要使用适当的方法将其应用到您的 WPS 测试环境中。

B. 导入测试实用工具

本文提供了一些与 Service Data Objects (SDO) 一起使用的实用工具。必须将这些实用工具导入到 WebSphere Integration Developer 工作区。下载 zip 文件中包括的项目交换文件(Project Interchange File,PIF)包含以下三个库(还有其他库):

  • J_ScaUtiltiies
  • LT_ScaJUnitTest
  • LT_ScaTest。

如果您计划按本文提供的内容操作,那么还需要导入我们要测试的模块 MP_MailService 及其接口库 L_MailService。您会看到,它仅包含接口的一个很普通的实现,但这已足够执行我们的测试。

  1. 要使用 WebSphere Integration Developer 将这些模块导入到工作区,请选择 File => Import

  2. 在 Import 对话框中,选择 Project Interchange,然后选择 Next

  3. 浏览至下载 zip 文件。选择要导入的模块,并单击 Finish

  4. 在 Business Integration 透视图的 Business Integration 视图中,您应看到类似于图 4 中的内容。



    图 4. 带有 PostCode 的 MailService 实现
    带有 PostCode 的 MailService 实现

C. 创建测试模块

我们将在模块中创建测试,然后将其部署到服务器。我们必须创建此测试模块。

  1. 在 Business Integration 透视图中,转到 Business Integration 视图。请单击右键,然后选择 New => Module。在 New Module 对话框中,输入一个名称(如 MT_TestMailService),然后单击 Finish

  2. 我们将在 MT_TestMailService 模块中的动态 Web 应用程序中创建测试。不过应记住,与 SCA 模块关联的标准 J2EE 项目由工具生成,并且是一个有效的临时构件。因此,我们将新建一个承载测试的动态 Web 应用程序。

    切换到 Web 透视图。在 Project Explorer 视图中,展开 Enterprise Applications。右键单击 MT_TestMailService,然后选择 New Dynamic Web Project

  3. 在 New Dynamic Web Project 对话框中,输入名称(如 MT_TestMailServiceJUnitWeb),然后单击 Finish

D. 设置模块依赖关系

我们需要确保记录了此新的 Web 项目和测试模块之间的关联,并确保创建了正确的库依赖关系。

  1. 切换回 Business Integration 透视图的 Business Integration 视图。选择 MT_TestMailService,并双击以打开 Dependency 编辑器。

  2. 展开 Libraries,并使用 Add 功能使以下库可用于我们的测试:

    • L_MailService(它提供对我们要测试模块的访问)
    • J_ScaUtilities
    • LT_ScaJUnitTest
    • LT_ScaTest
  3. 展开 J2EE,并使用 Add 功能将 MT_TestMailServiceJUnitWeb 添加到 SCA 模块。您的 Dependency 编辑器现在应与图 5 所示类似。



    图 5. 测试模块依赖关系
    测试模块依赖关系

  4. 保存更改。

  5. 现在我们需要将库显式添加到 Web 项目构建和运行时类路径中。返回到 Web 透视图。在 Project Explorer 中,右键单击 MT_TestMailServiceJUnitWeb 项目,然后选择 Properties

  6. 选择 Java JAR Dependencies,然后选中我们刚才添加的四个库(图 6)。



    图 6. JUnit Web 项目,独立的 JAR
    JUnit Web 项目,独立的 JAR

  7. 单击 OK,以保存这些更改。

现在我们已经完成了对模块和库依赖关系的设置。接下来,我们需要使 Cactus 测试框架可用于我们的测试。

E. 将 Cactus 框架添加到测试项目

我们的示例将使用 JUnit 和 Cactus 框架,所以需要使这些框架库可用于我们的测试模块。JUnit 是广为采用的开放源代码测试框架。随 WebSphere Integration Developer 一起提供的 Eclipse 环境中显式支持 JUnit 版本 3.8。您会在 WebSphere Integration Developer 安装中的 eclipse/plugins/org.junit_3.8.1 目录中找到 JUnit 库 junit-3.8.1.jar。

Apache Jakarta 开放源代码 Cactus framework 支持在服务器环境中使用 JUnit。您将需要随 Cactus 下载程序提供的以下库(这里列出了我们使用的版本):

  • aspectjrt-1.2.1.jar
  • cactus-1.7.1.jar
  • commons-httpclient-2.0.2.jar
  • commons-logging-1.0.4.jar

我们需要使这些 JAR 文件可用于我们的测试模块,并且还需要配置 Cactus 运行时使用的两个 Servlet。

  1. 通过将 Cactus 库添加到 WEB-INF/lib 目录可以将其与我们的测试 Web 应用程序包装在一起。为此,请切换到 Web 透视图的 Project Explorer 视图,并展开 Dynamic Web Projects => MT_TestMailServiceJUnitWeb => WebContent => WEB-INF 以显示 lib 目录。您现在可以将五个 JAR 文件拖到 lib 目录,如图 7 所示。



    图 7. Cactus 和 JUnit JAR
    Cactus 和 JUnit JAR

  2. 通过直接剪切并粘贴到 Web 应用程序部署描述符,可以轻松输入 Cactus Servlet 定义。在 MT_TestMailServiceJUnitWeb 的同一展开视图中,右键单击条目 DeploymentDescriptor: MT_TestMailServiceJUnitWeb,然后选择 Open with => Text Editor,这将打开文本编辑器视图。

  3. 将下面所示的 Servlet 和 Servlet 映射条目粘贴到文本编辑器中,并粘贴在现有描述和欢迎文件元素之间:

    	<display-name>MT_TestMailServiceJUnitWeb</display-name>
    
    	<servlet>
    	  <servlet-name>ServletRedirector</servlet-name>
    	  <servlet-class>org.apache.cactus.server.ServletTestRedirector</servlet-class>
    	  <init-param>
    	    <param-name>param1</param-name>
    	    <param-value>value1 used for testing</param-value>
    	  </init-param>
    	</servlet>
    
    	<servlet>
    	  <servlet-name>ServletTestRunner</servlet-name>
    	  <servlet-class>org.apache.cactus.server.runner.ServletTestRunner
    </servlet-class>
    	</servlet>
    	
    	<servlet-mapping>
    	    <servlet-name>ServletRedirector</servlet-name>
    	    <url-pattern>/ServletRedirector</url-pattern>
    	</servlet-mapping>
    	
    	<servlet-mapping>
    	    <servlet-name>ServletTestRunner</servlet-name>
    	    <url-pattern>/ServletTestRunner</url-pattern>
    	</servlet-mapping>
    
        <welcome file list>
    

  4. 保存并关闭文本编辑器。

  5. 您现在可以使用更典型的部署描述符编辑器重新打开部署描述符。如果打开,您应看到您在 Servlets 选项卡中添加的两个 Servlet(图 8)。



    图 8. Cactus Servlet
    Cactus Servlet

F. 组装模块

最后,测试模块需要访问我们正在测试的模块的接口库。还需要使用测试模块调用正在测试的组件,我们通过将合适的接口导入到测试模块并将它们正确地连接来执行此任务。

  1. 切换回 Business Integration 透视图的 Business Integration 视图,展开 MT_TestMailService 项目,并打开 Assembly 编辑器。

  2. 将导入添加到组装图,将其重命名为 PostCode,然后将 I_PostCode 接口添加到导入。

  3. 为导入生成 SCA 绑定。现在关系图应与图 9 所示类似。



    图 9. 要测试的带接口的导入,SCA 绑定
    要测试的带接口的导入,SCA 绑定

  4. 在 Properties 窗格的 Binding 选项卡中,浏览并从 MailService 模块中选择 PostCodeExport,从而将此导入绑定到我们正在测试的特定模块(图 10)。



    图 10. 绑定到正在测试的模块的导入
    绑定到正在测试的模块的导入

  5. 您需要使此导入对您的测试 Web 应用程序(这是一个非 SCA 项目)可用,所以将需要一个独立引用。将独立引用图标添加到您的关系图,并将其与您的导入连接。可能要求您回答以下两个问题:

    • 第一,您是否希望创建匹配引用:单击 OK
    • 第二,您是否希望将 WSDL 接口转换为 Java™ 接口。通过选择 OK 接受此选项非常重要。执行此操行会简化检查服务调用结果所需的代码。

    现在组装图应与图 11 所示类似。



    图 11. 对 PostCode 服务的独立引用(带合作伙伴名称)
    对 PostCode 服务的独立引用(带合作伙伴名称)

    请记下合作伙伴引用名称;在测试调用服务时将用到此名称。

  6. 保存组装图。





回页首


为 SCA 组件创建测试

完成准备工作后,现在我们可以开始编写单元测试了。我们首先通过创建一个调用 getDetailsForPostCode() 服务操作的测试,并预期该操作是有效的 PostCode,然后检查响应数据。我们将使用标准的 SCA 和 SDO 编程技术。您会看到,使用这些编程技术十分繁琐,并且编写此类测试相当耗时。不过,在考虑使用其他较简单方法编写这些测试之前,我们需要完成供练习使用的预备操作。

我们首先创建 JUnit 测试类,将单个测试添加到该类,最后执行该测试。

测试类

JUnit 版本 3.8 的常见编程模型是创建测试类,它扩展了 JUnit 提供的一个 TestCase 类。在我们的示例中,我们将使用 Cactus 框架在服务器上执行测试,所以必须扩展 Cactus 测试类 org.apache.cactus.ServletTestCase。

  1. 转到 Web 透视图的 Project Explorer 视图,并展开 Dynamic Web Projects => MT_TestMailServiceJUnitWeb => Java Resources => JavaSource

  2. 右键单击 Java Source,并选择 New => Package 以创建适当的包。右键单击该包,并选择 New => Class 以创建类,并输入如下代码:

    package org.djna.mailservice.test;
    
    import org.apache.cactus.ServletTestCase;
    public class PostCodeTest extends ServletTestCase {
    
    }
    

  3. 然后可以将一个或多个测试方法添加到此类。因为我们已经将类添加到了 Web 应用程序,所以在将模块添加到服务器时,我们的测试类可以在服务器环境中执行。

  4. 测试类表示在开发时发生的测试执行的常见单元,所以我们应仔细考虑任何一个类中包括了多少个测试。如果太少,类的管理会很费力。如果太多,类的执行时间会很长。根据经验,每个类五到十个测试用例比较合适。

测试方法

JUnit 3.8 命名约定规定所有测试方法名称应以单词 test 开头。这些方法不带任何参数,是空方法。测试失败通过抛出未经检查的异常来指示,通常使用 JUnit 提供的断言和故障方法指示。测试成功通过测试方法的完成来指示。

因而,我们的测试方法类似于:

import java.util.List;

import org.apache.cactus.ServletTestCase;

import com.ibm.websphere.sca.Service;
import com.ibm.websphere.sca.ServiceManager;
import commonj.sdo.DataObject; 
import com.ibm.swservices.sca.test.junit.ScaTestExecutor;

public void testGoodPostCode() {
	Service service = (Service) ServiceManager.INSTANCE
				.locateService("I_PostcodePartner");

	DataObject postCodeDetails
			= (DataObject)service.invoke(
				"getDetailsForPostCode", "BR1 0AB");
		
	assertEquals("Bradford", postCodeDetails.getString("city"));
	assertEquals("Yorkshire", postCodeDetails.getString("county"));
	List addressList = postCodeDetails.getList("addressList");
	assertEquals(2, addressList.size());
	assertEquals("12, Haworth Terrace",
		postCodeDetails.getString("addressList[1]/address"));
	assertEquals("13, Haworth Terrace",
		postCodeDetails.getString("addressList[2]/address"));	
    }

该代码显示:

  • 使用服务管理器,通过合作伙伴引用名称 I_PostcodePartner 访问该服务。
  • 使用邮政编码 BR1 0AB 调用服务操作。
  • 继承由操作返回的数据的断言。请特别注意用于导航 DataObject 的 XPath 表达式。我们使用 addressList[1]/address 之类的表达式来访问地址列表中的个别地址字符串;数组中第一个元素的索引值为 1。

将此代码粘帖到您的测试类,并保存。有了此代码后,我们就做好了执行测试的准备。

执行测试

  1. 首先,我们需要将测试模块添加到服务器。我们假设在您的 WebSphere Integration Developer 安装中已经具备了合适的 WebSphere Process Server 测试环境。确保此服务器已启动,然后在 Web 透视图的 Servers 视图中,右键单击服务器,然后选择 Add Remove Projects。并将 MP_MailServiceAppMT_TestMailServiceApp 应用程序添加到服务器。

    现在,我们可以使测试类在以下两个上下文中执行测试:

    • 部署到服务器并在 SCA 环境中运行的类。
      该类可用于 Cactus Servlet,因此将合适的请求提交到该 Servlet 时可以执行该类。

    • 可以作为 JUnit 测试独立执行的 Java 类。
      在独立执行时,Cactus 框架将测试类用作在服务器中部署的类的代理,并调用 Cactus Servlet。

  2. 通过右键单击并选择 Junit Test,Eclipse JUnit 工具使我们能够执行独立的 JUnit 测试类。不过,我们的测试使用 Cactus 与服务器通信,所以必须提供命令行参数来指定服务器运行的位置。

    在 Web 透视图的 Project Explorer 视图中,请选择 PostCodeTest 类,然后从 Run 菜单选择 Run... 以显示 Run 对话框。

  3. 在可能的配置列表中,选择 JUnit,并单击 New。检查测试窗格,将看到项目和测试类值已填充。还可以看到您可以使用此对话框启动一系列的测试;所有类都在所选目录中。

  4. 选择 Arguments 窗格。 在 VM arguments 下输入以下代码(图 12):

    -Dcactus.contextURL=http://localhost:9080/MT_TestMailServiceJUnitWeb



    图 12. Cactus 测试的运行配置
    Cactus 测试的运行配置

    请注意,这指定了 localhost 和端口 9080;如果 HTTP 请求的服务器或端口与此不同,则将需要调整此字符串以匹配您的选择。

  5. 选择 Run 来启动测试。

请注意,您已建立了此启动配置,以后只需选择此类并单击 Run => JUnit Test 就可以重复执行它。JUnit 视图然后显示运行测试的结果(图 13)。


图 13. 测试执行的结果
测试执行的结果

您可以从 JUnit 视图选择性地重新执行测试;右键单击类或测试,然后选择 Run





回页首


外部化测试数据

我们前面提到,创建测试用例的详细信息比较费力,并需要大量使用 SDO 编程 API。在我们的简单示例中,似乎不太大,但是对于带有数据对象的实际应用程序,难度可能会非常大,并会涉及许多嵌套层;为服务创建输入数据,然后验证结果的工作量会非常大。那么,从保存数据对象的 XML 表示形式的外部配置文件驱动测试似乎比较明智。在创建测试系列时,就变成了简单地复制和修改 XML 文件;实际上,经证明此方法比编写 SDO 代码更简单,出错率更低。

我们创建了一个框架,该框架支持此类测试用例的快速开发。在上面的设置说明中,为便于使用,我们提供了框架库。使用框架创建测试的过程为:

  1. 修改测试代码,以使用一组实用工具类
  2. 为配置文件创建目录层次结构
  3. 创建定义要执行的测试的配置文件
  4. 创建配置文件,以描述有效负载和预期的结果
  5. 创建数据对象 XML 文件

A. 修改测试代码,以使用一组实用工具类

SCA 框架提供了管理测试数据加载的 ScaTestExecutor 实用工具类,它可以执行相应的测试。这样,测试方法的代码会变得非常简单:

public void testGoodPostCodeExternal() {
		ScaTestExecutor executor = new ScaTestExecutor(getClass(), getName());
		executor.executeServiceTest();
}
	
public void testBadPostCodeExternal() {
		ScaTestExecutor executor = new ScaTestExecutor(getClass(), getName());
		executor.executeServiceTest();
}

import com.ibm.swservices.sca.test.junit.ScaTestExecutor;

// ...

ScaTestExecutor 构造函数将测试类和测试的名称作为参数。(JUnit 框架提供了 getName() 方法,以便能够以编程方式访问测试方法的名称。)ScaTestExecutor 然后应用命名约定来确定配置文件的位置;接下来我们将描述该约定。

您可能认为测试方法的高重复性特性指示能够进行某种的重构。事实上,JUnit 框架在运行时允许我们动态创建测试套件,该套件源自可用的测试数据。不过,我们发现 Eclipse-JUnit 集成也不能与此类套件一起使用;无法快速重新运行单个失败的测试。因此,我们更希望创建所示的显式测试方法。

B. 为配置文件创建目录层次结构

我们希望在测试具有许多服务操作的实际模块时(特别是在测试 BPEL 进程时),将拥有许多要管理的测试。所以,如果具有许多相应的 XML 文件,则按某一方式组织这些文件非常重要。ScaTestExecutor 类实现了简单的命名约定,并为组织 XML 文件指定了目录层次结构。要构造此目录层次结构,请单击右键,然后选择 New => Other => Simple => Folder(图 14)。


图 14. 测试数据层次结构
测试数据层次结构

层次结构的要素为:

  • 测试数据目录层次结构根植于测试类包目录中,在我们的示例中,该目录为 org.djna.mailservice.test。这使得要下载的 XML 文件可以作为测试类类加载器的资源。

  • 每个测试类都有一个目录,其名称源自测试类的名称,并附加前缀 -Data

  • 在该目录中,我们对每个测试方法都提供了一个目录,其名称完全匹配该方法名称。

  • 在方法目录中有测试定义。它们是定义要执行的测试的 XML 文件,并具有扩展名 .tspec(稍后描述)。每个测试方法可以具有多个 .tspec 文件;它们将按字母顺序执行。

C. 创建定义要执行的测试的配置文件

测试定义是业务对象的序列化实例。ScaTestSpecification 数据类型在 LT_ScaTest 库中提供,在开始此项练习时,您将其添加到了工作区。其结构如图 15 中所示。


图 15. 测试规范数据类型
测试规范数据类型

您可以指定要调用的服务合作伙伴和方法、有效负载和预期的结果。有效负载和预期的结果可以是简单的整数或字符串,或者可以进一步引用包含序列化数据类型的 XML 文件。如果您的测试规范需求更复杂,或许您需要其他基元类型,或者使用多个参数调用服务;那么可以扩展 ScaTestExecutor 类(本文提供了该类的源)。

.tspec 文件包含 ScaTestSpecification 的 XML 格式。与我们先前编写的 PostCode 测试对应的规范为:

<?xml version="1.0" encoding="UTF-8" ?> 
<ScaTest:TestDefinition
	xsi:type="ScaTestFramework:ScaTestSpecification" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:ScaTestFramework="http://LT_Utilities" 
	xmlns:ScaTest="http://scatest/issw/ibm/com">
  <service>I_PostcodePartner</service> 
  <method>getDetailsForPostCode</method> 
  <payloadString>BR1 0AB</payloadString>
  <description>Get details for good postcode</description>
  <expectedResultFile>GoodPostCodeDetails.xml</expectedResultFile> 
</ScaTest:TestDefinition>

这里您可以看到服务合作伙伴 I_PostcodePartner 和方法 getDetailsForPostCode 以及输入字符串 BR1 0AB。您还可以看到在独立文件(在接下来的部分中进行讨论)中指定了预期结果,即带有多个字段的数据对象。另请注意,测试具有文字描述;在测试执行时,会将这些描述写入日志,这有助于在错误发生时能够将错误与特定的测试相关联。

可以用类似的方法指定 testBadPostCodeExternal,我们指定一个不存在的 PostCode 就会导致一个特定的错误:

  <?xml version="1.0" encoding="UTF-8" ?>
   <ScaTest:TestDefinition
	xsi:type="ScaTestFramework:ScaTestSpecification"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:ScaTestFramework="http://LT_Utilities"
	xmlns:ScaTest="http://scatest/issw/ibm/com">
	<service>I_PostcodePartner</service>
  	<method>getDetailsForPostCode</method>
  	<payloadString>Bad Post Code</payloadString>
  	<description>Bad postcode - should fault</description>
  	<expectedFaultName>notFound</expectedFaultName>
   </ScaTest:TestDefinition>
   

要在测试数据文件夹中创建 tspec 文件,请右键单击该文件夹,然后选择 New => Other => Simple=> File,并粘入所显示的内容。您可能注意到,创建的此测试只是简单地复制并修改了一下先前的测试。

D. 创建配置文件,以描述有效负载和预期的结果

testGoodPostCodeExternal 测试需要预期的返回数据的规范,即 PostCodeDetails 数据类型。测试规范包括下面的行:

<expectedResultFile>GoodPostCodeDetails.xml</expectedResultFile>

引用文件 GoodPostCodeDetails.xml,需要将该文件放置在与测试规范相同的位置。

该文件的内容应为:

<?xml version="1.0" encoding="UTF-8"?>
<_:TestDefinition xsi:type="l:PostCodeDetails"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:l="http://L_MailService"
xmlns:_="http://scatest/issw/ibm/com">
  <postCode>BR1 0AB</postCode>
  <city>Bradford</city>
  <county>Yorkshire</county>
  <street>Haworth Terrace</street>
  <addressList>
    <address>12, Haworth Terrace</address>
  </addressList>
  <addressList>
    <address>13, Haworth Terrace</address>
  </addressList>
</_:TestDefinition>

通过右键单击该文件夹,然后选择 New => Other => Simple => File,并粘入所显示的内容,可创建预期的结果文件。在接下来的部分中将描述创建此类文件的技巧。不过,测试中有了此文件后,我们就可以执行了。如果我们先前更改了测试代码,您将注意到,Web 应用程序会在服务器上重新启动,并且控制台将显示类似以下的消息:

[22/05/06 12:40:35:533 BST] 00000051 ApplicationMg A WSVR0221I: Application
started: MT_TestMailServiceApp

所以,新版本的应用程序及其关联的测试数据将自动部署到服务器。

现在可以使用以下几种方法启动测试:

E. 创建数据对象 XML 文件

实际业务应用程序的数据类型通常较大而且内容复杂,并具有许多属性和多层嵌套。创建这些应用程序的 XML 表示形式既单调乏味又容易出错。本文提供了为任何给定数据类型编写示例 XML 文件的实用工具:com.ibm.issw.archive.ut.data.TestDataCreator。

该实用工具作为测试类打包,并作为 JUnit/Cactus 测试调用。您可以在 MT_TestMailJUnitWeb 项目中的示例项目交换文件中找到它。要将此类与您自已的应用程序结合使用,则需要在其类路径中包括您自已的数据类型。我们知道,通过将其复制到自已的测试项目,可以非常容易地完成此任务。

如果您希望体验一下 TestDataCreator,则可以从下载文件提供的交换文件导入我们的 MT_TestMailJUnitWeb 版本,并替换您自己的版本。不过,这替换您在此项目中的所有工作,所以,请备份您需要保存的任何内容。

要创建示例 XML 文件,您需要修改代码,以引用您希望使用的名称空间和数据类型(图 18)。


图 18. 数据类型名称和名称空间
数据类型名称和名称空间

在我们的示例中,它们是 http://L_MailServicePostCodeDetails。我们修改 TestDataCreator 以便引用以下值:

public void testCreateAnyData() {
	try {
	    m_logger.finest("testCreateAnyData entry"); 
		String schema = "PostCodeDetails";
DataObject test = m_bof.create("http://L_MailService", schema);

接下来,作为 JUnit 测试执行此类,并记住在运行配置上设置 Cactus 参数。如果 TestDataCreator 成功执行,则它会将消息写入到应用服务器控制台,指示创建的示例文件的路径:

[22/05/06 10:21:50:343 BST] 00000055 TestDataCreat I Written C:\IBM\WID601\pf\wps\PostCodeDetails.xml

文件内容的形式为:

<?xml version="1.0" encoding="UTF-8"?>
<_:TestDefinition xsi:type="l:PostCodeDetails" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:l="http://L_MailService" 
xmlns:_="http://scatest/issw/ibm/com">
  <postCode>postCode value</postCode>
  <city>city value</city>
  <county>county value</county>
  <street>street value</street>
  <addressList>
    <address>address value</address>
  </addressList>
  <addressList>
    <address>address value</address>
  </addressList>
</_:TestDefinition>

我们可以将其用作我们预期的测试数据的基础,实际上,它是我们在前一部分创建示例的方式。





回页首


结束语

本文介绍了如何使用简单的框架将 SCA 模块的一组测试定义为简单的 XML 定义并执行它。该框架及其表示的思想是开放的,可适应于更复杂的情况。

也许是因为我们详细说明了测试构造的各个细节,所以得到的练习似乎很长。但实际上,构建和执行测试的工作量决不繁冗。这里描述的测试可以在 30 分钟内创建,并可以在进行中抓拍屏幕快照。

此类自动化测试是开发高质量可重用的组件的重要技术,我们强烈建议 WebSphere Integration Developer 的所有重要开发环境都定义和采用此类方法。

在以后的文章中,我们计划阐述如何应用这些思想,来测试长时间运行的业务流程和具有副作用的其他组件。





回页首


本系列的其他文章






回页首


下载

描述名字大小下载方法
Sample componentsScaJunit-PIF-v1.1.zip1.4 MBHTTP
关于下载方法的信息


参考资料



关于作者

David Artus

David Artus 是 IBM Software Services for WebSphere 团队的成员,在英国 IBM Hursley Lab 工作。他从 1999 年就开始提供 WebSphere 咨询和指导服务。在 1999 年加入 IBM 之前,David 曾从事过多个行业的工作,包括投资金融、旅游和 IT 咨询。他所感兴趣的领域包括分布式系统的设计、对象技术和面向服务的体系结构。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?







回页首


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