技术开发 频道

使用CruiseControl和STAF建立复杂环境下的编译和测试自动化

    在 CruiseControl 中配置定时器

    为了让测试脚本能够每天定时运行,需要在 CruiseControl 中配置定时器。在 CruiseControl 的安装目录中找到 “config.xml” 并添加下面的配置代码:

    清单 18. 在 CruiseControl 中配置定时器
                 
<schedule interval="300">
  <composite time="0030">
<ant anthome="C:\Program Files\CruiseControl\apache-ant-1.6.5" target="buildAll"
buildfile="d:\ build\build.xml"/>
<exec command="d:\STAFDirectory\script\execute.bat" />
</composite>
</schedule>

    上述的设置设定了 1 个定时器,在凌晨 3 点执行。定时器先运行一个 Ant 脚本将代码检出复制到一个本地文件夹中,再运行一个批处理命令 “execute.bat” 来启动后续的 STAF 命令。

    启动 STAX 脚本

    当测试脚本源代码被检出到一个本地文件夹后,批处理命令 “execute.bat” 被执行。这个批处理命令只有一行代码,就是执行一个 STAX 任务:

staf local stax execute file D:\\STAFDirectory\\script\\main.xml wait

    这个 STAX 任务已经在前面的章节中做了详细的介绍,此处不再重复。

    合并 JUnit 测试日志

    在本场景中,当测试运行完成后测试的结果和日志需要被发布到 CruiseControl 的 Web 控制台中。但是由于测试执行是在另一台服务器上完成的,因此 CruiseControl 所在的控制机不能直接访问这些日志。我们只有创建另一个 STAX 任务把测试日志从执行测试的编译机上复制到控制机上。

    CruiseControl 内建了对 JUnit 产生的 XML 格式的日志的支持。为了让 CruiseControl 能够正确的显示测试日志,需要在其配置文件 “config.xml” 中添加如下设置:

    清单19. 在 CruiseControl 中合并 JUnit 测试日志
                 
<log>
<merge dir="projects/${project.name}/target/test-results" />
</log>       

    发布 RFT 日志和编译的运行时代码到 CruiseControl 控制台

    RFT 运行的日志文件有两种类型,纯文本日志和 HTML 格式的日志。CruiseControl 目前还不支持直接显示 RFT 日志文件。因此我们只能把 RFT 产出的 HTML 日志文件作为一种编译产出放置在特定文件夹下。这样用户可以通过 CruiseControl 控制台直接访问该 HTML。

    在编译机上编译得到的 WebService 和客户端的 war 文件作为一个编译产出也被存档保留,并通过 CruiseControl 发布。当测试发现缺陷后,测试员可以通过这些 war 文件来追溯到某一特定版本的编译产出并重现缺陷,开发人员则可以在这一基础上进行调试和修正。

    添加如下代码到 CruiseControl 配置文件 “config.xml” 中:

    清单20. 在 CruiseControl 中发布 RFT 测试日志
                 
<publishers>
<onsuccess>
<artifactspublisher dest="artifacts/${project.name}"
    dir="projects/${project.name}/target/buildArtifacts" />
</onsuccess>
</publishers>

    JUnit Test Case 示例

    本章介绍用于测试 Web Service 的 JUnit Test Case 示例,这个例子将详细说明如何利用HttpUnit 来测试 Web Service。在这个例子中,共有三方参与,分别为 Web Service Provider、Web Service Client 和 Test Client。首先由 Test Client 向 Web Service Client 发出 HTTP 测试请求,Web Service Client 在验证用户身份后,生成相应的 SOAP 请求发给 Web Service Provider,

    Web Service Provider 同样在验证用户身份后为其提供 Web Service 服务,并将结果仍以 SOAP的形式返回到 Web Service Client,再由 Web Service Client 以 HTTP 形式返回结果给 Test Client。最后由 Test Client 对返回结果的正确性进行判断并给出测试结果。JUnit Test Case 示例如清单 21 所示。

    清单 21. JUnit Test Case 示例

01 public class SampleTest extends TestCase {

02 private String invoke_client(

03 String requestString, String clientURL, String providerURL) {

04 String result = null;

05 String requestURL = clientURL + "?endpoint=" + providerURL

06 + "&requestString=" + requestString;

07 WebConversation wc = new WebConversation();

08 wc.setAuthorization(SampleConst.Username, SampleConst.Password);

09 WebRequest req = new GetMethodWebRequest(requestURL);

10 WebResponse resp;

11 String responseString;

12 try {

13 resp = wc.getResponse(req);

14 responseString = resp.getText();

15 } catch (AuthorizationRequiredException e) {

16 result = "Invalid UserID or Password.";

17 return result;

18 } catch (Exception e) {

19 result = "Exception on HTTP request";

20 return result;

21 }

22 int checkNames = responseString.indexOf("User names strings match");

23 int checkRequest = responseString.indexOf("Request strings match");

24 if ((checkStrings == -1) | (checkNames == -1) | (checkRequest == -1)) {

25 result = "Strings not match";

26 }

27 return result;

28 }

29 public void test_sample_case_1() {

30 String requestString = "sample_case_1";

31 String result = invoke_client(requestString,

32 SampleConst.ClientWebURL,SampleConst.ProviderWebURL);

33 assertTrue(result, result == null);

34 }

35 }

    清单 21 展示了访问 Web Service 的 JUnit Test Case 示例。

    其中,第 2-29 行定义了 invoke_client 函数,通过 WebConversation 对 Web Service 进行访问。第 5-6 行设置了 Web Service Client 的地址,endpoint 为 Web Service Provider 的地址。第 8 行为访问 Web Service 添加了身份认证信息。第 12-21 行访问 Web Service,将结果存入 responseString。如果在访问过程中发生异常,则直接返回错误信息。第 22-28 行对返回结果进行验证,如果发现结果错误,则返回错误信息。否则返回 null 表示访问成功。

    第 30-35 行为一个 Test 的例子,通过调用 invoke_client 对 Web Service 进行测试,并验证返回的错误消息是否为 null。如果为 null 表示测试成功,反之则失败。

    结论

    本文使用 CruiseControl、STAF(STAX)、JUnit、Rational Functional Tester 通过一个简化的具体场景展示了自动化测试平台的实现。这个平台不仅可以大大简化测试人员的工作量,减轻测试人员的工作负担,也能保证开发版本的稳定性,使开发人员尽早知道新版本的问题,增强开发人员的信心。

    本文仅代表作者本人观点,不代表 IBM 公司观点。

    参考资料
 
    学习多媒体课堂:如何实现软件产品的自动化构建和发布,本讲座介绍如何实现软件产品的自动化构建和发布方面的主题,以及如何运用 IBM Rational Build Forge 来实现自动化构建与发布。
    学习教程:利用 IBM Rational Build Forge 完善构建过程,第 1 部分: 创建一个持续构建和集成环境。这个教程循序渐进地向您展示了如何安装和配置 IBM Rational Build Forge,来管理从源代码开始对 Jakarta Tomcat 的构建。
    通过 用 IBM Rational Build Forge 打造集成的软件构建管理平台,第 1 部分: 构建管理入门 了解如何通过整合项目组、流程以及系统来改进软件开发效率,从而提高整个开发团队的效率,改进产品质量,更好地遵规。
    查看文章 “让开发自动化: 使用自动化加速部署"了解如何结合使用 Ant 和 Java Secure Channel 将软件远程部署到多个目标环境中。
    查看文章 “利用 STAF 实现程序更新包的自动部署测试”,了解 STAF(STAX) 基础知识。
    浏览“STAF 网站”,了解更多 STAF(STAX) 内容以及下载 STAF(STAX)。
    浏览“CruiseControl 网站”,了解更多 CruiseControl 内容。
    浏览“CruiseControl 配置页面”,了解如何配置 CruiseControl。
    使用 STAF 邮件列表,讨论 STAF(STAX) 问题及用法。

0
相关文章