内容


SOA 环境中的测试驱动的开发,第 2 部分

使用 WebSphere Process Server 进行持续集成

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: SOA 环境中的测试驱动的开发,第 2 部分

敬请期待该系列的后续内容。

此内容是该系列的一部分:SOA 环境中的测试驱动的开发,第 2 部分

敬请期待该系列的后续内容。

引言

敏捷软件开发是许多软件开发方法的行业公认最佳实践,它使得持续集成变得非常流行。持续集成的主要功能是双重的:

  • 在单步构建过程中测试整个应用程序而不只是测试单个项目。构建过程签出所有代码,构建整个应用程序,运行所有单元测试,并向开发人员报告结果。
  • 按定期间隔运行的计划构建过程;例如,每当代码发生更改的时候。如果构建中发生任何问题,可以立即对其进行查找和纠正。

持续集成缩短了开发 SOA 应用程序所花的时间。当您做出更改时,提交更改之前您不必运行整个系统中所有服务的测试用例。您可以测试服务并提交更改,然后让持续集成服务器运行其他服务的所有测试用例。如果存在问题,您将迅速获得通知,并且可以立即处理问题。

持续集成还使得查找和修复 SOA 应用程序中的问题变得更加容易。当问题发生时,您只需查看在上次构建间隔期间做出的更改即可修复问题。此外,做出更改时将自动进行构建,因此如果发生问题,问题不会发展为更大的问题。

在这个有关 SOA 环境中的测试驱动的开发系列中,第 1 部分向您介绍了如何为 SOA 应用程序编写单元测试。本文演示如何使用持续集成服务器来测试运行于 IBM WebSphere Process Server 上的服务组件体系结构(Service Component Architecture,SCA)应用程序。该持续集成服务器是在以下开放源代码项目的基础上构建而成的:

除了这些开放源代码项目以外,本文还使用第 1 部分中的示例应用程序来演示如何自动构建和测试 SOA 应用程序。该示例应用程序是使用 IBM WebSphere Integration Developer V6.1(以下称为 Integration Developer)来开发的。本文的其余部分将对该过程进行阐述:

  1. 创建源代码存储库:创建一个源代码存储库来存储该示例应用程序以便进行团队开发。
  2. 将应用程序签入存储库:将该示例应用程序签入源代码存储库,以使其对持续集成服务器可用。
  3. 启动 WebSphere Process Server:启动 WebSphere Process Server V6.1,以使其能够部署该应用程序并代表持续集成服务器运行测试。
  4. 启动持续集成服务器:启动持续集成服务器,以使其能够轮询存储库中的应用程序更改。每当检测到更改,它将构建并测试该应用程序,并向开发人员报告任何问题。

创建源代码存储库

在任何持续集成环境中,您都需要为维护 WebSphere Process Server 应用程序的版本控制系统建立中央服务器。该服务器必须可由所有团队成员以及持续集成服务器访问。使用此中央存储库,团队成员将签入他们的 SCA 组件和测试用例,然后持续集成服务器将它们签出以执行构建。

在本部分中,您将了解如何设置版本控制系统,并创建用于维护 WebSphere Process Server 应用程序和测试用例的存储库。请在您用作中央版本控制服务器的计算机上执行以下步骤:

  1. 安装 CVSNT。

    下载 CSVNT Server 并按照安装向导的指示对其进行安装。选择 Typical 安装。完成安装后,重新启动系统以使更改生效。

  2. 创建 CVS 存储库。

    决定您希望存储库位于文件系统上的什么位置。存储库是 CVS 将在其中维护文件(文件的存档版本)的根目录。存储库目录名称不能包含空格,因此要使用诸如 c:\cvsrepo 或类似的路径。可以使用 CVSNT 控制程序创建存储库:

    1. 选择“开始”=>“程序”=>“CVSNT”=>“CVSNT Control Program”
    2. 选择 About 选项卡并停止 CVSNT 服务和锁服务。
    3. 选择 Add 以添加新存储库。
    4. 浏览到存储库所在的路径。如果该目录不存在,可以使用 New Folder 按钮为您的新存储库创建文件夹结构。创建一个存储库(例如 c:\cvsrepo)并选择 OK 以添加该存储库。
    5. 如果该存储库是新的,则会提示您对其进行创建和初始化。回答 Yes 以创建并初始化该新存储库。
    6. 选择 About 选项卡并启动 CVSNT 服务和锁服务。
  3. 保护 CVS 存储库。

    可以采用多种方式保护对 CVS 存储库的访问。尽管存在更安全的方法,但本文将使用 pserver 协议,因为它非常容易使用和配置。如果您希望使用更安全的协议,请参阅参考资料中的 CVS 手册。

    要配置 pserver 协议,您必须确定该 CVS 存储库的管理员。为此,请在存储库下的 CVSRoot 目录中创建一个名为 passwd 的文件。例如,如果 CVS 存储库在 c:\csvrepo 之下,则此文件将在 c:\cvsrepo\CVSROOT 中。此文件应该包含单个行,即当前登录用户的名称。如果当前登录用户为 admin,则此文件的内容应该类似如下:

    admin:

    停止并重新启动 CVSNT 服务和锁服务。

  4. 测试 CVS 连接。

    打开控制台窗口并输入:

    set CVSROOT=:pserver:admin@localhost:/cvsrepo
    cvs login

    然后系统将提示您输入密码。

将应用程序签入存储库

出于演示目的,您将使用本系列的第 1 部分中开发的示例应用程序。为此,您需要将 Integration Developer 与 CVS 集成,并将 Integration Developer 项目签入 CVS。一旦将项目签入了 CVS,持续集成服务器就可以在每当发生更改时签出项目,运行构建,并执行测试。

  1. 配置 Integration Developer 以访问 CVS 存储库。

    Integration Developer 提供了内置的支持,允许使用 CVS 存储库对构成 WebSphere Process Server 应用程序的 SCA 组件和构件(请参阅参考资料)进行版本控制。为了将 SCA 构件从 Integration Developer 中签入 CVS,您必须配置 Integration Developer 以访问 CVS 存储库:

    1. 在 Integration Developer 中,选择 Window => Open Perspective => Other
    2. 选择 CVS Repository Exploring 透视图。单击鼠标右键并选择 New => Repository Location
    3. 输入运行 CVSNT 服务的主计算机的名称。
    4. 输入存储库在该计算机上所在的路径。例如,如果存储库在服务器上位于 c:\cvsrepo,则存储库位置将为 \cvsrepo
    5. 输入 CVS 用户 ID 作为用户名和密码;这应该是您的本地帐户信息。
    6. 确保选择 pserver 作为连接类型,并选择缺省端口。

    输入此信息以后,Integration Developer 将提示您输入密码,验证存储库访问权限,并且在您获得授权的情况下,允许您将 SOA 应用程序签入 CVS,包括 SCA 模块、SCA 库和 Web 测试用例。

  2. 签入 Integration Developer 项目。

    获得该示例应用程序的副本,它是一个可从第 1 部分下载的项目交换文件。将项目交换文件导入 Integration Developer 并通过运行单元测试来验证安装之后,您可以将 Integration Developer 项目签入 CVS:

    1. 打开 Business Integration 透视图。您应该看到三个项目:
      • L_AddressCleansingService
      • T_AddressCleansingService
      • T_AddressCleansingServiceJUnitWeb。
    2. 右键单击某个项目并选择 Team => Share Project...
    3. 选择存储库类型,在此例中为 CVS,但它也可以是 ClearCase
    4. 添加可选的注释以便进行版本跟踪。

    对每个项目执行步骤 b 至 d,然后所有文件将被上载到 CVS 存储库,并且该示例应用程序可供持续集成服务器签出。

启动 WebSphere Process Server

在设置持续集成服务器之前,确保 WebSphere Process Server V6.1 正在运行。需要 WebSphere Process Server 的实例才能按照持续集成服务器的指示部署 SCA 模块和运行测试用例。

就本文而言,我们将使用 Integration Developer 附带的 WebSphere Process Server 实例,因为它已经安装了。如果您愿意,也可以使用 WebSphere Process Server 的独立实例来运行构建,而不使用 Integration Developer 来实现此目的。在任一种情况下,都必须有一个 WebSphere Process Server 实例正在运行。只有这样,持续集成服务器才能构建和测试 SCA 模块。

启动持续集成服务器

存在若干可用的开放源代码持续集成服务器,例如 CruiseControlAntHillHudsonLuntbuildApache Continuum。就本文而言,这里将使用 CruiseControl。

  1. 下载并安装某个持续集成服务器。

    按照下载说明获得并安装 CruiseControl 的二进制分发版。在本文编写之际,最新的版本为 2.7.3 版。在安装时,服务器文件将解压缩到某个文件夹,例如 d:\cruise。

  2. 创建工作目录。

    下面您需要在集成服务器计算机上创建工作目录。CruiseControl 将在这些工作目录中运行构建并存储结果。应该将这些目录与 CruiseControl 安装目录分离。清单 1 显示了持续集成服务器的目录结构。本文附带的下载文件中包括了这些目录。

    清单 1. 目录结构
    \builds
      contains the Cruise configuration file and a script to start the Cruise server
      \projects
          \L_AddressCleansingService
              contains this project’ build.xml file and a runbuild.bat script
              \source
    		  contains the inputs to the build script, e.g. SCA artifacts
              \target
    		  contains the outputs from the build script, e.g. test results
      \artifacts
          \L_AddressCleansingService
              contains time stamped sub-directories with published build artifacts
      \logs
          \L_AddressCleansingService
              contains the status.txt file indicating the build status

    您需要了解这些工作目录,这样才能编写构建脚本和配置 CruiseControl 以构建项目。清单 1 提供了简单的说明。所有集成构建将在 \builds 目录中执行。在 \builds 目录下,还存在三个子目录:

    • \projects 目录包含子目录,由持续集成服务器构建的每个项目对应于一个子目录。其中每个子目录包含:
      • build.xml 文件,将由持续集成服务器运行。
      • \source 目录,包含将从 CVS 签出的 SCA 构件。
      • \target 目录,将包含构建结果。
    • \artifacts 目录还包含针对每个项目的子目录。其中每个子目录包含多个带时间戳的子目录,每次成功的构建对应一个子目录。带时间戳的子目录包含已发布的构建结果。在此例中,它将包含项目的 \target 目录的内容(清单 1)。
    • \logs 目录也包含针对每个项目的子目录。该子目录中有一个 status.txt 文件,指示当前的构建状态;例如,某次构建是正在进行还是在等待运行。
  3. 编写构建脚本。
    1. 最初,您需要手动将构建项目所需的 CVS 模块签出到项目的 \source 目录。就本文而言,所需的 CVS 模块为:
      • L_AddressCleansingService:接受测试的 SCA 库。
      • T_AddressCleansingService:用于测试该库的 SCA 模块。
      • T_AddressCleansingServiceJUnitWeb:用于测试该库的 Cactus 测试用例。

      将模块签出到 \projects\L_AddressCleansingService\source 目录中。签出模块之后,CruiseControl 将监视 CVS 中的那些模块的更改,并根据需要计划构建。您不需要再次手动签出它们。

      为了帮助您签出 CVS 模块,\projects\L_AddressCleansingService 目录中提供了一个 runbuild.bat 文件。请确保在 runbuild.bat 文件中正确地设置环境。打开控制台窗口并输入 runbuild checkout

    2. 下一步,您需要编写 Ant 构建脚本,CruiseControl 将运行该脚本以构建您的项目。\projects\L_AddressCleansingService 目录中提供了一个名为 build.xml 的示例。每当检测到更改并且需要构建项目时,CruiseControl 将调用该构建脚本。当构建运行时,它将:

      每次将通过销毁 \source 和 \target 目录然后从 CVS 获得模块来创建清洁的构建。这可以避免增量构建所产生的潜在问题。

    以下是上面列出的构建脚本主要目标以及缺省目标(全部)的定义,缺省目标将按上述顺序调用主要目标。(Ant 构建脚本可从下载文件中获得。)

    • 目标:全部是缺省 Ant 目标,由 CruiseControl 在需要运行构建时调用。它依赖许多按以下顺序运行的其他目标:清理、初始化、签出、构建、安装、启动、停止和卸载。
      清单 2. 目标:所有
      <target 
         name="all" 
         depends="clean, init, checkout, build, install, start, test, 
      		stop, uninstall">
      		</target>
    • 目标:清理通过删除 \source 目录和 \target 目录清除前一次构建。这将删除前一次构建中使用的源代码和类文件。这样可以确保此次构建将从清洁状态开始。
      清单 3. 目标:清理
      <target name="clean">
           <delete dir="${source.dir}"/>
           <delete dir="${target.dir}"/>
           </target>
    • 目标:初始化设置运行此构建所需要的环境。创建 \source 目录和 \target 目录。它建立用于此构建的工作目录
      清单 4. 目标:初始化
      <target name="init">
          <mkdir dir="${source.dir}"/>
          <mkdir dir="${target.dir}"/>
          </target>
    • 目标:签出签出构建此项目所需要的 CVS 模块。也就是说,它将 CVS 模块的最新副本签出到 \source 子目录中。
      清单 5. 目标:签出
      <target name="checkout">
        <cvs 
          command="-q co -d source/${test.module.name} ${test.module.name}">
        </cvs>
        <cvs 
          command="-q co -d source/${test.webapp.name} ${test.webapp.name}">
        </cvs>
        <cvs 
          command="-q co -d source/${library.name} ${library.name}">      
        </cvs>
        </target>
    • 目标:构建构建用于 WebSphere Process Server 的 SCA 模块。它首先创建一个 .zip 文件,其中包含 SCA 模块及其依赖项。然后它使用 IBM serviceDeploy 任务生成 EAR 文件。
      清单 6. 目标:构建
      <target name="build">
         <zip 
            destfile="${target.dir}/${test.module.name}.zip"
            basedir="${source.dir}" 
            includes="${test.module.name}/**,${test.webapp.name}/**,
      		${library.name}/**">
         </zip>
      
         <serviceDeploy  
           scaModule="${target.dir}/${test.module.name}.zip" 
           outputApplication="${target.dir}/${test.module.name}.ear"
           workingDirectory="${target.dir}"
           wasHome="${wps.home}">
         </serviceDeploy>
         </target>
    • 目标:安装将 SCA 模块安装到 WebSphere Process Server。
      清单 7. 目标:安装
        <target name="install">
           <wsInstallApp 
              profilename="${profile.name}"
              wasHome="${wps.home}"
              ear="${target.dir}/${test.module.name}.ear">
          </wsInstallApp> 
          </target>
    • 目标:启动在 WebSphere Process Server 上启动 SCA 模块。
      清单 8. 目标:启动
        <target name="start">
           <wsStartApp 
              profilename="wps"
              user="admin"
              password="admin"
              wasHome="${wps.home}" 
              application="${test.module.name}App" >
           </wsStartApp>
           </target>
    • 目标:测试在 WebSphere Process Server 上运行 Cactus 测试用例,并将输出发送到项目的 \test-results 目录中的 XML 文件,以便持续集成服务器能够显示测试结果(请参阅定义日志目录)。为此,它首先编译测试用例,然后使用 JUnit 来运行那些测试用例。
      清单 9. 目标:测试
      <target name="runTest">
      
        <mkdir dir="${target.dir}/test-classes"/>
        <javac 
          destdir="${target.dir}/test-classes" 
          srcdir="${source.dir}/${test.webapp.name}/JavaSource">
          <classpath>
            <path refid="compile.class.path"/>
          </classpath>
          <include name="**/*Test.java" />
        </javac>
      
        <mkdir dir="${target.dir}/test-results"/>
        <junit fork="yes">
          <classpath>
            <path refid="test.class.path"/>
          </classpath>
          <formatter type="brief" usefile="false" />
          <formatter type="xml" /> 
          <batchtest todir="${target.dir}/test-results">
            <fileset 
              dir="${target.dir}/test-classes"
              includes="**/*Test.class">
            </fileset>
          </batchtest>
          <jvmarg 
            value="-Dcactus.contextURL=${cactus.context.url}">
          </jvmarg>
        </junit>
      
      </target>
    • 目标:停止在 WebSphere Process Server 上停止 SCA 模块。
      清单 10. 目标:停止
        <target name="stop">
           <wsStopApp 
              profilename="${profile.name}"
              wasHome="${wps.home}" 
              application="${test.module.name}App" >
           </wsStopApp>
           </target>
    • 目标:卸载从 WebSphere Process Server 卸载该 SCA 模块。
      清单 11. 目标:卸载
        <target name="uninstall">
           <wsUninstallApp 
              profilename="${profile.name}"
              wasHome="${wps.home}"
              application="${test.module.name}App" >
          </wsUninstallApp>
          </target>
  4. 配置 CruiseControl 以构建项目。

    可以通过配置 XML 文件对 Cruise Control 进行配置。此文件控制构建循环,并告诉 CruiseControl 如何以及何时应该运行构建。用于此示例的配置文件为 config.xml 文件,包含在 \builds 目录中,并将在下面逐个部分地对其进行描述。可以从本文附带的下载文件中获得 config.xml 的副本。

    1. 定义项目。

      config.xml 文件的前几行定义项目:

      清单 12. config.xml
      <cruisecontrol>
         <project name="L_AddressCleansingService" buildafterfailed="false">

      <project> 元素定义 CruiseControl 负责构建的项目。此文件中可能有多个 project 元素,每个元素分别具有唯一的名称。在此 <project> 元素中,buildafterfailed 的值设置为 Fasle,以便在构建失败后,如果自从该构建以来 CVS 中没有对源文件做出更改,则不再重新尝试该构建。

    2. 侦听构建事件

      下一步,定义在构建过程中接受事件通知的侦听器:

      清单 13. 定义侦听器
      <listeners>
         <currentbuildstatuslistener 
            file="./logs/${project.name}/status.txt">
         </currentbuildstatuslistener>
      </listeners>

      在此配置文件中,<currentbuildstatuslistener> 元素被指定将构建的当前状态写到 \logs\L_AddressCleansingService\status.txt 文件。此状态指示 CruiseControl 是正在尝试某个构建还是在等待尝试某个构建。采用这种方式,可以通过 CruiseControl Web 应用程序获得当前构建状态。

    3. 检查更改。

      定义 CruiseControl 如何检查更改以确定是否需要某个构建:

      清单 14. 检查更改
      <modificationset quietperiod="30">
         <cvs localworkingcopy="${source.dir}/${test.module.name}"/>
         <cvs localworkingcopy="${source.dir}/${test.webapp.name}"/>
         <cvs localworkingcopy="${source.dir}/${library.name}"/>
      </modificationset>

      <modificationset> 元素指定要检查什么 CVS 模块的更改以确定是否需要某个构建。在上面的 <modificationset> 元素中,值为 30 的 quietperiod 指示 CVS 存储库在尝试某个构建之前必须静默 30 秒钟。这为开发人员提供了在尝试构建之前签入所有更改的机会。

      三个带 localworkingcopy 属性的 <cvs> 元素指向构建项目所必需的 CVS 模块的本地副本。<cvs> 元素使 CruiseControl 能够定位 CVS 存储库并检查更改。它不执行签出;签出是由构建脚本执行的(请参阅目标: 签出)。

      除了 CVS 以外,还有一个针对 ClearCase 用户的 <clearcase> 元素。

    4. 定义构建间隔。

      定义构建间隔和要调用的构建脚本:

      清单 15. 定义构建间隔
      <schedule interval="60">
         <ant anthome="${ant.home}" 
              buildfile="${projects.dir}/${project.name}/build.xml"
              target="all"/>
      </schedule>

      <schedule> 元素指定构建间隔。在此示例中,构建间隔设置为 60 秒。这告诉 CruiseControl 每隔 60 秒检查一次 CVS 存储库中的文件更改。如果存在更改,则将会进行构建(请参阅检查更改);如果不存在更改,则 CruiseControl 将在 60 秒后再次检查。<ant> 元素将 Ant 脚本的位置和每当运行构建时要调用的目标告诉 CruiseControl。在此例中,CruiseControl 将运行 \projects\L_AddressCleansingService\build.xml 文件中的所有目标(请参阅目标:全部)。

    5. 定义日志目录

      定义 CruiseControl 日志的位置并记录 JUnit 测试结果:

      清单 16 定义日志位置
      <log dir="${logs.dir}/${project.name}">
         <merge dir="${target.dir}/test-results"/>
      </log>

      <log> 元素指定日志文件的位置。CruiseControl 在每次尝试某个构建时在 \logs\L_AddressCleansingService 目录中创建一个日志文件。

      除了 CruiseControl 创建的日志文件条目以外,您还可能希望记录 JUnit 测试用例产生的测试结果。为此,可以使用 <merge> 元素,并将其目录属性指向构建脚本以将 JUnit 测试结果作为 XML 来写入的位置(请参阅目标:测试)。

    6. 发布构建构件。

      发布您希望保留的构建构件,如 EAR 文件:

      清单 17. 发布构建构件
      <publishers>
         <onsuccess>
            <artifactspublisher 
               dir= "${target.dir}"
               dest="${artifacts.dir}/${project.name}">
            </artifactspublisher>
         </onsuccess>
      </publishers>
      
         </project>
      </cruisecontrol>

      <artifactspublisher> 元素指定如何发布某些构建构件,例如所生成的 EAR 文件。在此例中,您在将从 \target 目录中找到的所有项发布到 \artifacts 目录。这实际上是在 \artifacts 目录下创建一个与构建时间戳具有相同名称的子目录。这使得 CruiseControl 能够提供对历史构建构件的访问。

    7. 启动构建循环。

      最后,您可以启动 CruiseControl 构建循环。为此,\builds 目录中提供了一个 runcruise.bat 文件。在运行该文件之前,请确保在其中正确设置环境。然后您可以通过在控制台窗口中输入 runcruise.bat 来启动构建循环。

      当 CruiseControl 启动时,它将读取配置文件,尝试运行某个构建,然后检查 CVS 存储库中的修改。在第一次尝试构建您的项目时,它可能不检测修改,但它仍然会强制进行构建。在第一次构建之后,仅当存在修改时,它才会计划进行一次构建。您应该在控制台中看到类似如下的消息:

      清单 18. 构建中产生的消息
      projectName = [L_AddressCleansingService]
      using settings from config file [D:\builds\config.xml]
      No previously serialized project found [D:\builds\L_AddressCleansingService.ser]
      	forcing a build.
      Project L_AddressCleansingService starting
      Project L_AddressCleansingService:  checking for modifications
      Project L_AddressCleansingService:  No modifications found, build not necessary.
      Project L_AddressCleansingService:  Building anyway, since build was explicitly
      	forced.

      下一步,CruiseControl 将调用 Ant build.xml 文件中的所有目标。Ant 目标具有对其他目标的依赖关系,例如清理、初始化、签出等等。所依赖的目标将按指定的顺序运行,然后将运行全部目标。您应该在控制台中看到类似如下的输出。请确保您的单元测试已正确运行。

      清单 19. 目标依赖关系
      Project L_AddressCleansingService:  now building
      Buildfile: .\projects\L_AddressCleansingService\build.xml
      
      ccAntProgress -- clean
      [delete] Deleting directory D:\builds\projects\L_AddressCleansingService\source
      [delete] Deleting directory D:\builds\projects\L_AddressCleansingService\target
      
      ccAntProgress -- init
      [mkdir] Created dir: D:\builds\projects\L_AddressCleansingService\source
      [mkdir] Created dir: D:\builds\projects\L_AddressCleansingService\target
      
      ccAntProgress -- checkout
      [cvs] U source/T_AddressCleansingService/.classpath
      [cvs] U source/T_AddressCleansingService/.project
      [cvs] U source/T_AddressCleansingService/.runtime
      [cvs] U source/T_AddressCleansingService/sca.module
      ...
      
      ccAntProgress -- build
      [zip] Building zip: D:\builds\projects\L_AddressCleansingService\target\
      T_AddressCleansingService.zip
      [servicedeploy] Initializing workspace 
      [servicedeploy] Building project L_AddressCleansingService
      [servicedeploy] Building project T_AddressCleansingServiceEJB
      [servicedeploy] Building project T_AddressCleansingServiceJUnitWeb
      [servicedeploy] Building project T_AddressCleansingServiceApp
      [servicedeploy] Exporting application D:\builds\projects\
      L_AddressCleansingService\target\T_AddressCleansingService.ear
      [servicedeploy] Deployment has completed
      [servicedeploy] Waiting for background jobs
      [servicedeploy] Deleting workspace
      
      ccAntProgress -- install
      [wsInstallApp] Installing Application [D:\builds\projects\
      L_AddressCleansingService\target\T_AddressCleansingService.ear]...
      [wsInstallApp] Installed Application [D:\builds\projects\
      L_AddressCleansingService\target\T_AddressCleansingService.ear]
      
      ccAntProgress -- start
      [wsStartApp] Starting Application [T_AddressCleansingServiceApp]...
      [wsStartApp] Started Application [T_AddressCleansingServiceApp]
      
      ccAntProgress -- test
      [mkdir] Created dir: D:\builds\projects\L_AddressCleansingService\target\
      	test-classes
      [javac] Compiling 1 source file to 
      	D:\builds\projects\L_AddressCleansingService\target\test-classes
      [mkdir] Created dir: D:\builds\projects\L_AddressCleansingService\target\
      	test-results
      [junit] Testsuite: 
      	com.ibm.issw.service.addresscleansing.test.AddressCleansingServiceTest
      [junit] Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 1.578 sec
      
      ccAntProgress -- stop
      [wsStopApp] Stopping Application [T_AddressCleansingServiceApp]...
      [wsStopApp] Stopped Application [T_AddressCleansingServiceApp]
      
      ccAntProgress -- uninstall
      [wsUninstallApp] Uninstalling Application [T_AddressCleansingServiceApp]...
      [wsUninstallApp] Uninstalled Application [T_AddressCleansingServiceApp]
      
      ccAntProgress -- all
      BUILD SUCCESSFUL

      CruiseControl 在运行构建以后,它将合并日志文件中的测试结果并发布构建构件。然后它将进入睡眠状态,并等待下一次构建时间。当它醒来时,将检查 CVS 存储库中的修该,如果发现任何修改,则运行另一次构建;否则,它将进入睡眠状态并等待下一次构建时间。

      清单 20. 运行构建
      Project L_AddressCleansingService: merging accumulated log files
      Project L_AddressCleansingService: publishing build results
      Project L_AddressCleansingService: idle
      Project L_AddressCleansingService: next build in 1 minutes
      Project L_AddressCleansingService: waiting for next time to build
      ...	
      Project L_AddressCleansingService: No modifications found, build not necessary.
      Project L_AddressCleansingService: idle
      Project L_AddressCleansingService: next build in 1 minutes
      Project L_AddressCleansingService: waiting for next time to build
  5. 跟踪构建状态

    CruiseControl 启动一个可用于跟踪构建状态的 Jetty 实例和一个 Web 应用程序。该 Web 应用程序的 URL 为 http://<host>:8080/cruisecontrol,其中 <host> 是运行 CruiseControl 的计算机。因此,若要查看构建的当前状态,您所需做的就是打开浏览器并导航到该 URL。一个网页将显示您的项目的构建状态,以及所有其他项目的构建状态。单击项目名称可以查看类似于图 1 所示的构建结果页面。

    图 1. 查看构建状态
    图 1. 查看构建状态
    图 1. 查看构建状态

    另一种查看构建状态的方法是接收电子邮件。这可以通过向 config.xml 文件中的 <publishers> 集添加 <email> 元素来实现(请参阅发布构建构件)。

    清单 21. 电子邮件通知
    <email 
       mailhost="IBM-F4A849C57A0"
       returnaddress=dhvines@us.ibm.com
       buildresultsurl="${buildresults.url}"   
       skipusers="true" 
       spamwhilebroken="true">
       <always address="dhvines@us.ibm.com"/>
       <failure address="dhvines@us.ibm.com"/>
       </email>

    在此例中,一个地址始终接收构建状态电子邮件,另一个电子邮件地址将仅接收有关失败情况的电子邮件。电子邮件含有指向构建结果页面(请参见图 1)的链接。通过使用 <htmlemail> 发布器,您甚至可以向提交更改的用户发送通知。

总结

这个包括两部分的文章系列讨论了 SOA 环境中的测试驱动的开发。在第 1 部分中,您了解了如何在使用 WebSphere Integration Developer 开发 SCA 业务流程之前为 SCA 数据映射编写测试用例,在第 2 部分中,您了解了如何设置持续集成服务器来测试 WebSphere Process Server 上的 SOA 应用程序。

使用此持续集成服务器,您了解了如何轮询 CVS 存储库中的 SOA 应用程序更改。如果检测到更改,则持续集成服务器将从 CVS 中签出所有代码,构建 SCA 模块,将它们安装到 WebSphere Process Server,运行单元测试,并记录构建结果。

通过访问指向 CruiseControl Web 应用程序的 URL 或者接收电子邮件通知,您可以在任何时候查看构建结果。如果在 SOA 应用程序中发现错误,可以通过电子邮件向提交更改的团队成员发送错误报告,以便他们能够立即采取行动。

持续集成服务器可以确保您的服务(以及依赖您的服务的所有服务)在每当发生更改时得到测试。如果出现测试错误,您可以迅速修复错误,因为您只需调查自从上次构建以来所做出的更改。这使您可以将 SOA 应用程序始终保持可发布状态。


下载资源


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere, SOA and web services
ArticleID=390619
ArticleTitle=SOA 环境中的测试驱动的开发,第 2 部分: 使用 WebSphere Process Server 进行持续集成
publish-date=05262009