调试 JEE 企业级应用 - 使用 WebSphere Integration Developer 集成测试客户端

转自 http://www.ibm.com/developerworks/cn/websphere/library/techarticles/1005_yelin_widtest/

调试 JEE 企业级应用的各种工具

当今 JEE 企业级应用开发的发展快速。需要对开发出来的企业级应用进行调试, 这种需求促生出各种新兴调试工具。用户需要根据调试的模块的自身特性,选择合适的工具,达到预期的效果。

在介绍各种小工具之前,先回忆一下 JEE 体系结构中包括的四个容器:Web 容器,EJB 容器,Applet 容器和 Application Client 容器。JEE 企业级应用所有的实现都运行其中。

相应的测试工具也就主要针对,1)普通运行于客户端的 Java 代码, 2)GUI 界面代码调试 3) 数据库操作代码调试, 4)服务器上的 Servlet/JSP/EJB 代码调试

普通 Java 代码调试

普通的运行于客户端的 Java 代码的调试可以选择 JUnit。

JUnit 是最基本的,对 Java 程序进行白盒测试的工具。JUnit4 以前的版本,所有测试用例必须继承 TestCase 类;而在 JUnit4 以后,利用了 JDK5 的 annotation 机制,只要在方法体前面使用 @test 表明该方法是测试方法。这使得测试代码的编写更加简单。

JUnit 和 Ant 相结合,集成到开发的构建过程中。先根据软件功能编写测试用例,然后将测试用例的执行集成到 Ant 构建文件中。这样 Ant 在构建企业级应用的时候同时自动运行测试用例并生成测试报告。

项目地址 http://www.junit.org

GUI 界面代码

Web 界面是 JEE 企业级应用的门户,对界面程序的调试可以采用 FireBug。

Firebug 是 Firefox 下的一个插件 , 能够调试所有网站语言 , 如 HTML,CSS, JavaScript。在各种浏览器下都能使用 (IE,Firefox,Opera, Safari)。

项目地址 http://getfirebug.com/releases/

大量图形用户界面的测试,可以使用 RFT(Rational Functional Tester)

RFT 是 IBM 的自动化集成测试工具,它能捕获编辑图形界面元素,录制定制回放测试场景,生成验证点。它的功能当然远不止于此。不在本文讨论范围之内。

项目地址 http://download.boulder.ibm.com/ibmdl/pub/software/rationalsdp/rft/61/

数据库操作代码调试

数据库是 JEE 企业级应用中不可或缺的一部分,所以对数据库操作的代码调试也很重要。数据库操作代码的测试,可以选择 DbUnit。

DbUnit 是针对数据库操作的单元测试开源框架,是对 JUnit 的一个扩展。它主要是帮助开发人员将数据库保持在一个稳定的状态,确保测试用例的正确执行。测试用例都继续 DbUnit 提供的 DatabaseTestCase 类。

 Public class CommonDB extends DatabaseTestCase{ 
 // 获取数据库连接
 Protected IDatabaseConnection getConnection(){} 
 // 测试前设置数据库状态
 Protected DatabaseOperation getSetUpOperation(){} 
 // 测试后设置数据库状态
 Protected DatabaseOperation getTearDownOperation(){} 
 } 

项目地址 http://dbunit.sourceforge.net

服务器上的 Servlet/JSP/EJB 代码调试

服务器内的组件(包括 Servlet, JSP, EJB)的测试。一般有两种策略。一种是 in-Containner,直接在服务器容器内进行测试,另外一种是 mock object,模拟对象测试。

如果需要 in-Containner,可以使用 Cactus。

Cactus 也是对 JUnit 的扩展。专门针对服务器内不同组件容器,分别提供了三种类型用例 ServletTestCase, JspTestCase 和 FilterTestCase。 Cactus 的脚本可以直接运行在服务器上。

项目地址 http://jakarta.apache.org/cactus

如果只需要模拟对象,可以选择 EasyMock, 它提供对接口和类的模拟。

项目地址 http://www.easymock.org

其他

如果 JEE 企业级应用是基于 Struts 框架的,那么可以使用 StrutsTestSuite 进行测试。StrutsTestSuite 顾名思义,提供了丰富的基于 Struts 框架的测试类。

如果是 Client/Server 框架的 JEE 企业级应用的系统测试,可以使用 JMeter。

JMeter 是纯 Java 桌面应用。功能比较强大,还能测试基于静态和动态资源应用的性能。

项目地址 http://prdownloads.sourceforge.net/JMeter

上面介绍的各种工具可以相互结合着使用,达到各种需要的效果。

WID 集成调试客户端 TestClient

WID (WebSphere Integration Developer) 是 WebSphere 系列产品 JEE 开发的 IDE (Integrated Development Enviroment)。

JEE 企业级应用如果在 WID 平台上开发,那么天然便利的,可以选择 WID 自带的 TestClient 工具包进行调试。选择第三方自动化测试工具,例如 RFT,虽然也可以组织测试用例的效果,但是应用代码和调试代码运行在两套不同的平台上,开发人员需要在两种语境中切换以定位问题,影响工作效率。

WID 符合 SOA( 面向服务的软件架构 ) 概念,强调 WebService 组件自描述、模块化和组件拼装。因为当今的企业级应用不是一个一个独立的应用系统,而是多个彼此连接,相互通过不同集成层次进行交互的应用系统,同时这些应用系统又和其他企业的相关应用系统连接,从而构成一个结构负责的发布式企业应用系统。其中,连接企业内部各种应用系统的技术称为 EAI, 即企业技术集成。连接企业间各种应用系统的技术称为 B2BI。

构成企业级应用的各个模块,有些是由第三方开发的,只能得到接口信息,无法获取源代码,无法真正为这些模块建立运行环境。所以相对于前面所述的各种企业级应用调试小工具,WID TestClient 工具包主要侧重于模拟组件,用来测试组件。WID TestClient 还能记录执行过程,重用历史数据。此外 WID TestClient 扩展自 JUnit, 能对测试用例进行有粒度的打包封装,批量运行。WID TestClient 强调的是模拟企业级应用各个组件,强调对测试用例的组织维护和重用。具体到对数据库应用代码或者对 web 页面代码的调测 debug,还需要结合前面所述的其他调试工具,例如 DBUnit 等开展。

简单实例 , 调测 HelloWorld

WID 产品自带有企业级应用示例 HelloWorld。下面介绍如何使用 WID TestClient 来调测 HelloWorld。

HelloWorld 获取:

WID 界面菜单 Windows > Samples and Tutorials > IBM WebSphere Integrarion Developer

选择点击 Hello World Part 2 > Import > complete artifacts

环境要求:

需要事先安装 WID 以及它的集成测试环境 UTE

使用模拟器 emulator 进行模拟

模拟器是 WID TestClient 实现对 SOA 组件进行模拟的一个工具。

开发人员在 JEE 企业级应用的调试过程中有三个理由要使用到 emulator:

首先在协同开发阶段,各个相互依赖的模块开发进度不同。不能等待所有模块都完成才开始测试。

其次构成企业级应用的各个模块,有些是由第三方开发的,只能得到接口信息,无法获取源代码,无法真正为这些模块建立运行环境

最后即便所有的模块都开发完成,并且开放访问,emulate 也是必要的。它更加快捷,提供良好的交互。

在 HelloWorld 示例中, HelloWorldMediation Module 调用了 HelloService Module。假设 HelloService Module 没有开发完成,需要被模拟。

下面分 7 个步骤演示如何调测 HelloWorldMediation,如何模拟 HelloService。

  • 部署 HelloWorldMediation
  • 指定被测组件和需要输入的数据
  • 模拟 HelloService, 为它新建一个名叫 emulHelloServiceProg 的模拟器
  • 编码实现模拟器 emulHelloServiceProg
  • 开启模拟器,执行 HelloWorldMeidationExport 调测用例
  • 关闭模拟器,部署真实的 HelloService, 再次执行 HelloWorldMeidationExport 调测用例
  • 保存历史数据
  1. 部署 HelloWorldMediation

    运行 WID ,导入 HelloWorld Sample 工程

    菜单 Windows > Samples and Tutorials > IBM WebSphere Integration Developer

    选择点击 Hello World Part 2 > Import > complete artifacts

    启动 Server

    菜单 Windows > Show View > Server > Servers

    在 Server View 中,点击 WebSphere Process Server,右键选择 ‘ Start ’

    部署 HelloWorldMediation

    在 Server View 中,点击 WebSphere Process Server,右键选择‘ Add and remove project.. ’

    只选择部署 HelloWorldMediation。不部署 HelloService,因为假设 HelloService 没有开发完成,需要被模拟。

  2. 指定具体被测组件和需要输入的数据

    选择 HelloWorldMediation Module, 右键菜单 Test > Test Module

    在打开的 HelloWorldMediation_test 界面中

    指定被测的 component 是 HelloWorldMediationExport



    图 2. 指定被测组件
  3. Module > Component > Interface > Operation
  4. WID 是这样在用户界面上能逐级粒度化指定被测功能的。
  5. 填入需要的数据
  6. 在 title 域填入 Mr
  7. 在 FirstName 域填入 Bill
  8. 在 LastName 域填入 Gates
  9. 此时如果直接点击界面上的 (continue) 按钮执行该测试用例,会出异常。这是因为 HelloWorldMediationExport 使用到的 HelloService 没有运行在 server 上,需要被模拟。
  10. 模拟 HelloService, 为它新建一个名叫 emulHelloServiceProg 的模拟器

    在打开的 HelloWorldMediation_Test 页面,点击 Configurations Tab。

    点击 Component and Reference Emulators,

    右键选择 Add > Component and Reference Emulator, 新建一个模拟器



    图 3. 创建新的模拟器

在弹出的’New Component and Reference Eulator’的对话框中, 选择‘ Components ’radio button, 选择‘ HelloServiceImport ’check box,点击‘ Finish ’。

这样就指定了被模拟的对象是 HelloServiceImport 这个 Component。

WID 支持 Manual 和 Programmatic 两种方式对 HelloService 进行模拟。如果选择 Manual,测试用例执行过程中会停止在对 HelloService 的调用上,并弹出模拟界面等待用户手工输入模拟结果。但是下面我们示范的是 Programmatic 方式。



选择 ‘ Programmatic emulation ’项

点击’ New.. ’ ,在弹出的’ New Emulator ’对话框中输入 emulHelloServiceProg 给这段模拟 HellowService 的程序起名为 emulHelloServiceProg

接受所有默认设置, ‘ Next ’ >.. ‘ Next ’ > ’ Finish ’。完成后可以看到左侧的项目树上,TestClientPrj > Emulators 下新生成了一个 emulHelloServiceProg 节点

    1. 编码实现模拟器 emulHelloServiceProg
    2. emulHelloServiceProg 程序模拟 HelloService, 实现 HelloService interface, setHello operation. 输入 name, 输出 ‘ emulated ’ +name;
    3. 点击上图右侧的 string getHello() 超链接
    4. 选择‘ Java snippet editor ’并点击 ‘ Define Emulation ’按钮
    5. 在 Java Editor 中
    6. return null;
    1. 改为 return
      				 "emulated "+name;
      			

    1. Ctrl+s 保存结果。
    2. 开启模拟器,执行 HelloWorldMeidationExport 调测用例

      在 HelloWorldMediation- test 页面, 点击 Events Tab, 点击界面上的绿色三角 continue按钮开始执行。

      如果过程中弹出对话框,接受系统默认设置即可。

    3. 执行完成后,在用户界面直接可以看到执行结果输出为:

      Emulated Mr Bill Gates

    4. 关闭模拟器 , 部署真正的 HelloService, 再次执行 HelloWorldMeidationExport

      在 HelloWorldMeidation_Test 页面,点击 Configurations Tab。

      选择左侧结构树上的 Componet and Reference Emulators > HelloServiceImport

      选择右侧的’ Disable ’ Radio button

      部署真正的 HelloService 应用

      在 Servers View, 点击 WebSphere Process Server, 右键菜单选择 ‘ Add and Remove Projects.. ’ 添加上 HelloServiceApp.

      确认 Server 上有两个应用,一个是 HelloServieApp,另外一个是 HelloWorldMediationApp.

      在 HelloWorldMeidation_Test 页面,点击 Events tab,重新执行 HelloWorldMediation_Test

      执行结束后,用户界面上可以看到执行结果是

      Hello Mr Gill Gates.

    5. 保存历史数据

      如果在 WID 中专门为调试建立一个名叫 testProject 的工程,( 我们将在下面的文章中讲述如何建立 testProject),执行结果文件,配置文件和数据文件都能被保存在 testProject 中。保存完成后项目树上 testProject 新增三个节点:



      图 7. 保存历史数据

    保存 execution trace (*.wbiexetrace 文件 )

    直接 Ctrl+s 把 HelloWorldMediation_Test 文件保存到默认目录下。用户可以在将来多次重复执行该 execution tracey 以期望得到同样的结果,来验证 JEE 企业级应用系统功能稳定没有被修改破坏。

    保存 configuration (*.testconfig 文件)

    使用 programmatic emulator 来模拟 HelloService 是一种 configuration。不使用 emulator 又是另外一种 configuration。这些场景都被保存在 *.testconfig 文件中。

    用户重新运行 execution trace 时,可以指定为它指派各种 configuration 进行配搭,比照运行结果。

    在 HelloWorldMediation_Test 页面, 点击 Configurations Tab。

    点击 (save configuration)按钮把目前的配置场景命名保存为 configEmulHelloServiceProg 文件。保存 (save configuration) 按钮旁边就是导入 (load configuration) 按钮。

    保存 data (*.objectpool 文件或者 *.xml 文件)

    用户重新运行 execution trace 时,可以在 Data Pool 中挑选事先保存好的数据,避免手工重新输入数据,节省时间提高调试效率。

  • 进一步使用 emulator

    emulator 深入使用

    Component Test Explorer 是 web 界面化的 TestClient 辅助工具。在 Server View 点击 WebSphere Process Server, 右键菜单 Launch > Component Test Explorer 可以开启这个工具。 使用 Component Test Explorer,能对 emulator 进行更加高级复杂的设置,例如添加触发规则集 rule set 等。

    emulator 缺陷

    programmatic emulator 的局限性是不支持复杂类型的输出。如果 operation 有多个 output,就无法直接使用 programmatic emulator。用户需要自编程封装多个 output。

  • 使用 fine grain trace 逐级细化调试

    前文介绍了如何利用 emulator 功能进行单个模块 HelloWorldMediation 的测试,这个章节我们将介绍利用 fine grain trace 功能对整个解决方案进行综合调试。

    fine grain trace 功能允许用户对多个 component 中的调用路径、内部变量进行追踪,方便用户定位问题和解决问题。

    还是以 Hello World Sample 为例阐述如何使用 fine grain trace 功能。如下图所示,sample 中有这样两个 Module: HelloWorldProcess 和 HelloWorldMediation。我们在测试 HelloWorldProcess Module 中的流程 HelloWorldProcess 时,可以通过 fine grain trace 功能观察 HelloWorldProcess 和 HelloWorldMediation 两个 Module 中的所有调用路径和相关变量值的变化。


    图 8. HelloWorld 应用结构

    演示分 3 步进行

    • 选定 Trace 的范围
    • 选定关注的变量
    • 执行测试
    1. 选定 Trace 的范围

      在测试开始之前,首先需要选定需要关心的 trace 的范围。以测试 HelloWorldProcess 为例,流程除了会调用同一 Module 内的模块,还会调用到 HelloWorldMediation Module 中的相关模块,所以我们需要将 HelloWorldMediation module 添加到测试配置中。

      首先,在 Project Tree 中选中 HelloWorldProcesss Module, 选择右键菜单 Test > Test Module

      并指定具体被测组件和需要输入的数据 , 选择的被测 component 是’ HelloWorldProcess ’

      输入的数据是 : Gender: Male.

      然后点击 Configurations Tab, 选择添加测试 Module.



      图 9. 添加要配置的 Module
    2. 接着 , 在添加新的测试 Module 的窗口中选择 HelloWorldMediation 和 HelloWorldProcess Module, 点击 Finish 结束。

      我们会得到下图所示的 Fine-Grained Traces 配置 , 存在于两个不同 Module 中的两个模块 (HelloWorldProcess 和 HelloWorldMediation) 的内部调用路径及变量都可以在测试中得到观察。

      添加完 Module 后,如果 Module 下 Fine-Grained Traces 是空的,我们可以通过右键菜单添加 Fine-Grained Trace



      图 10. Fine-Grain Traces 在配置树中
    3. 选定关注的变量

      在选择好合适的 trace 范围后,我们还可以配置该范围中的模块在调用时,哪些变量会被观察。

      选中 fine-grained traces 中配置的“HelloWorldProcess”模块后,窗口右边会出现变量的选择列表,点击“Select All”,选中所有的变量,从而在测试时观察所有的变量的值的变化。



      图 11. 选择观察变量
    4. 执行测试

      同样,切换回’ Event ’ Tab,点击界面上的 按钮,启动测试。

      然后登陆 BPC explorer, 执行 Human Task “HelloWorldTask”.

      输入

      firstName: john

      lastName: green

      并提交.

      执行结束后,我们可以看到非常清晰的 trace 信息 , 其中包含三个 fine-grained traces 部分 , 第一个是关于 HelloWorldProcess 内部的执行路径信息,通过点击内部元素可以观察每个执行阶段内部变量的相关值。如下图,点击“AssignM”,可以从右边窗口中观察到流程执行到该节点时相关变量的值。



      图 12. Fine-Grain Traces 执行结果

    另外,后面两个 fine-grained traces 部分展开后,能够分别观察到 HelloWorldMediation 模块在请求阶段和返回阶段的内部执行路径。

    批量运行测试案例,重用历史数据

    前文介绍了 WID TestClient 的 emulator 模拟器功能和 fine grain trace 功能。这些功能都是用以辅助单个测试用例的执行。

    最后我们在 WID 中新建立一个 testProject, 对所有测试用例进行有粒度的打包封装,批量运行。

    演示分 3 步进行

    • 建立 Test Suite 和 Test case
    • 新建多个 Test Data Table
    • 批量执行测试用例,比较结果,保存记录
    1. 建立 Test Project, Test Suite 和 Test case

      运行 WID

      File > New > Others > Business Integration > Component Test Project

      输入工程名 myTestProject, 点击‘ Finish ’

      右键选择 myTestProject New > Component Test Suite,

      输入 myTestSuite1, 点击 ‘ Finish ’

      在打开的 myTestSuite1 编辑器页面中 , 点击 Test Cases Tab, 点击 按钮添加 Testcase



      图 13. 在 TestSuite 中增加 TestCase
    2. 在弹出的 Select a test pattern 对话框中,选择 Operation-level testing, 选择‘ Next ’

      在弹出的 Select the Operations to be Tested 对话框中,

      选择 HelloWorldMediation > HelloWorldMediation > HelloWorld > callHello 作为被测对象。 目前只指定一个被测对象 callHello,也可以批量指定被测对象。



      图 14. 选择目标测试操作
    3. 点击完成后可以看到 test_callHello 被添加到 myTestSuite 的 Test Cases 列表中了。

    4. 建立 Test Data Table

      在 Test Data Table 页面中添加定制 myDataTable1

      菜单 Window > Show View > Other > Test > Test Data Table

      在 Test Data Table View 中,点击右上方的 ‘ Add Variation ’

      在弹出的 Add a Test Variation 对话框中输入自定义的数据表名称 myDataTable1

      编辑 myDataTable1

      输入如下 input 和 expected output.

      在 In 列, 输入

      Mr ’

      ‘ Bill ’

      ‘ Gates ’

      在 Expected 列, 输入:‘ Hello Mr Bill Gates ’

      Ctrl+s 保存。

      保存完成后,点击 test_callHello, 查看其右侧 Detailed Properties 域, 可以看到 myDataTable1 被添加到 Test vaiations 列表中了。



      图 15. 添加测试数据表
    5. 可以为 test case 编辑配置多个 data table.

    6. 执行测试用例,比较结果,保存记录

      在项目树上点击 myTestProject > Test Suites > myTestSuite, 右键选择 Run Test

      将会打开‘ Run myTestSuite ’ 页面

      点击界面上的 按钮,启动测试。

      需要指出的是 myTestProject 要部署在 Server 上运行。在弹出的 Deployment Location 对话框中点击 Finish,选择默认安装的 WID UTE 即 WebSphere Process Server.

      执行过程中使用了预定义的两套数据, Default 和 myDataTable1。

      执行结束后,用户界面显示两组成功执行。



      图 16. 观察 TestSuite 执行结果

    Ctrl+S 保存执行结果

    在弹出的’ Save Test Trace ’对话框中输入名称 myTestTrace_test_callHello

    把执行结果保存为 myTestTrace_test_callHello

    保存完成后项目树上新增节点



    图 17. TestSuite 执行 Trace 被保存在项目树上

    1. 用户可以在将来多次重复执行这个名为 myTestTrace_test_callHello 的 execution trace。以期望得到同样的结果,验证 JEE 企业级应用系统功能稳定没有被修改破坏。
    2. 本文附件 WID_TestClient_Guide.zip 是文中所演示的步骤执行结果。
    3. 打开 WID
    4. File > Import > Other > Project Intechange
    5. From zip file 指向附件工程 WID_TestClient_Guide.zip 即可。

    结束语

    本文演示了如何使用 WID( WebSphere Integration Developer) 集成测试客户端 TestClient 调试基于 SOA 架构的 JEE 企业级应用。主要讲述了 模拟组件接口的 emulator,逐级细化调试的 fine grain trace,和批量组织测试用例的 testProject。

    请使用浏览器的分享功能分享到微信等