用 STAF+Selenium 实现并行的自动化测试框架

IBMdW 发布于 2012/03/08 22:43
阅读 3K+
收藏 9

我们有很多理由去开展自动化测试的工作,例如自动化测试可以节省时间、简化手工测试、提高测试覆盖率等等,这也充分说明实现软件自动化是非常重要的。自动 化测试时一个很吸引人的技术问题是,对于不同的软件项目或多或少都要借助于自动化工具进行测试。如今随着 Agile 开发模式逐渐的应用到各个开发测试团队,如何快速连续地交付产品对于开发和测试团队都成为一个很大的挑战。对于测试人员来说,如何在有限的测试资源和测试 时间之内保证产品质量成为一个至关重要的问题。

本文的意图是通过一个新的视角颠覆传统理念上的串行自动化测试方式,向读者详细介绍了利用 STAF 以及 Selenium 实现的并行式的自动化测试框架,以及为整个项目所带来的优势 。

Agile 中的自动化测试

Agile 是一种以人为核心、迭代、循序渐进的开发方法。它的目标就是尽早、持续地交付有价值的软件。随着 Agile 越发成熟,越来越多的团队开始尝试采用这种开发模式。

在 Agile 中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。这意味着开发团队的开发周期大大缩短,并且测试人员需要在 有限的时间之内完成测试计划并提供足够多的回归测试保证交付产品的产品质量。依赖手工测试完成充分的测试很不现实,GUI 自动化测试此时能发挥重要的作用。通过在每个迭代中频繁的执行自动化脚本来保证产品有足够的回归测试。

GUI 自动化测试脚本完全模拟手工操作完成功能测试,单个脚本的运行时间远远多于 API 测试。当脚本越来越多的时候,传统的串行脚本运行消耗的时间相应的增加,便不能达到快速响应的目的。如何能够缩短整个 testsuite 的运行时间以尽快得到测试结果?并行自动化测试需求显而易见。

在本文中,我们将详细介绍 LotusLive iNotes 并行自动化测试框架的实践,通过充分利用各种测试资源,并有效的提高自动化运行效率以满足快速交付的要求。

并行的自动化测试框架的诞生

在传统的情况下,我们对脚本的并行运行通常是:

  1. 把需要运行的整个自动化测试 testsuite 拆分成几块小的 testsuite
  2. 每块小的 testsuite 提供不同的测试用户数据(在 Lotuslive iNotes 中指不同的测试用户)
  3. 每块小的 testsuite 分别部署到不同的自动化测试环境上运行

我们可以看到在这种方式下,总体运行时间的长短取决于需要最长时间的 testsuite,那么我们在拆分 testsuite 的时候需要了解每个脚本运行的时间。其次,每个小的 testsuite 必须提供最大的用户数量。再次,由于用户数量的限制,我们在划分 testsuite 的时候有可能不会使用到所有的自动化测试资源,测试资源空闲的时间比较多,利用不充分。最后,每个 testsuite 最后返回的结果需要进一步地分析统计才能在最终的测试报告中使用。有没有办法能够既实现并行又能最充分地利用自动化测试资源并且生成一个完整的测试报告 呢?我们的解决方案如下:

  • 一个 testsuite,多线程运行脚本。TestCaller 会将 testsuite 中所有要运行的自动化测试脚本,按照顺序多线程并发启动。
  • 自动化资源的高效利用。单个脚本启动后请求运行所需要的自动化资源,在完成时释放掉所有的资源。测试资源包括但不限于测试机(物理机或虚机)信息,测试用户帐号信息等。
  • 测试执行工具,实际执行 GUI 自动化测试。在 LotusLive iNotes 中使用的是 selenium。各项目可以根据需要选择合适自己的工具。

并行的自动化测试方案的实现

LotusLive iNotes 为一款在线网络电子邮件服务,其功能涵盖电子邮件、行程表、联络人名单、多层次管理等等。根据不同的角色,用户可以使用不同的功能。

下图展示了完整的 LotusLive iNotes 自动化测试框架。并行的自动化测试(以下称 Automation Solution)属于其中的一部分。对于 Automation Solution 之外的其他工具,读者可以根据自己项目的实际情况选择其他产品


图 1. 拓扑结构( 查看大图
拓扑结构

上图中, Lotus Automator 做为启动和管理自动化测试任务的工具,并管理所有使用的测试资源(包括用户资源和自动化测试环境资源)。终端用户(End Users)首先向 Lotus Automator 提交一个请求(其中包含了需要运行的一系列脚本), 然后 Lotus Automator 给 Automation Solution 发送一个测试任务。Automation Solution 在收到任务之后,根据预估计的最大线程数(由用户数量总数和测试环境资源总数决定),依次启动多个脚本。脚本启动后从资源池中申请所需要的测试环境以及用 户账号等测试资源(注 : 本方案中使用 Staf 的 Respool 服务统一管理资源);申请到必要的资源后,脚本会执行实际的测试步骤。单个脚本运行完成时,会释放掉所有的资源并由 Automation Solution 实时把结果加入报告中。整个过程对于终端用户都是透明的,用户不需要关心自己使用到了具体哪个资源以及这些资源的实时占用情况。

下面我们看一下 Automation Solution 的具体实现细节:


图 2. 框架结构( 查看大图
框架结构

Parallel Caller,如上图,它是本自动化测试框架的核心部分,负责启动和管理并行的自动化测试,并收集和生成最后的测试报告。

STAF ResPool 服务,STAF/STAX 是由 IBM 开发的自动化测试运行环境,由于其跨平台和扩展性强的特点,在各种测试工作中被越来越多的使用。在本自动化测试框架中我们只使用到它其中的 Respool 服务,用来管理测试资源的申请和释放。

Selenium:Selenium 是 ThroughtWorks 公司一个强大的开源 Web 功能测试工具系列,包括 selenium-IDE、selenium-RC、selenium-Webdriver 以及 selenium-Grid。在本自动化测试框架中我们可以灵活组合应用到其中的 selenium-RC、selenium-Webdriver 和 selenium-Grid。

多任务支持

该自动化解决方案支持并行的自动化测试,并且能够高效的使用测试资源以在最快的速度下完成自动化测试任务。在这个自动化测试框架中,因为启动的最大线程数 和各种测试资源的数量都是有关联的,我们把线程池的线程数做成了可配置的,这样我们就可以根据测试资源数量来灵活控制并行测试的线程数。

从下面的流程图中我们可以看到该解决方案的工作原理:

  1. 开始测试
  2. 读取配置文件,创建一个线程池
  3. 如果有可用线程,启动一个测试脚本并为它申请所需要的测试资源
  4. 申请测试资源成功,则开始执行测试步骤。否则,等待其他线程释放资源,重复步骤 4 直至超时退出
  5. 最后,收集各个并行测试脚本的结果并形成最终的测试报告
  6. 完成

图 3. 多任务执行流程
多任务执行流程

使用 STAF Respool 管理测试资源

测试资源的管理包括资源申请和资源的释放,在本并行测试自动化方案中,我们使用 STAF 提供的 Respool 服务来实现。Respool Service:资源池服务,提供了对于资源池的管理和操作,如查看,创建和删除操作。它允许用户控制和管理对资源池中每个条目的独占访问。


图 4. 测试资源管理
图 4. 测试资源管理

向 STAF 资源池申请资源的代码例子:

public boolean getResource(String nodepool, boolean release){
if(stafhandle!=null){
       		if(release){
                       result = stafhandle.submit2(
ServerIP, "respool", "request pool " + nodepool + 
    " first timeout " + timeout+" garbagecollect yes");
               }else{
                     	result = stafhandle.submit2(
ServerIP, "respool", "request pool " + nodepool + 
      " first timeout " + timeout+" garbagecollect no");
                }
            	}else{
            		return false;
        }
        if (result.rc != 0) {
              if(result.rc == 37) {
                	System.out.println(
"Timeout ERROR: Cannot get the test node. RC: " + result.rc + ", 
    Result: " + result.resultContext);
                		return false;
                }
        }else{
              resourcename = result.resultContext.toString();
              poolname = nodepool;
        }
        return true;
}   

向 STAF 资源池释放资源的代码例子:

public void releaseResource(){
      result = stafhandle.submit2(ServerIP, "respool", 
"release pool " + poolname + " entry " + resourcename + " force");
      try {
        	stafhandle.unRegister();
      } catch (STAFException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
      }
      return;
}

监控 STAF ResPool 使用情况

我们也开发了相应的工具监测 STAF Respool 的使用情况,使用该工具用户可以方便的添加和管理测试资源以及监测测试资源的使用情况。

下图中显示了一个正在运行的自动化测试对测试用户账号的申请和占用情况。


图 5. 监控 STAF ResPool( 查看大图
图 5. 监控 STAF ResPool

使用 Selenium 工具做为 test runner

因为 LotusLive iNotes 是基于 Web 的产品,所以我们选取现在流行的 Web 自动化测试工具 Selenium 来执行测试。Selenium 是一个健壮的工具集合,支持跨多平台的基于 Web 的应用程序的自动化测试的敏捷开发,它是一个开源的轻量级的自动化工具,而且支持多种编程语言,例如 Java,Python 等等。在本自动化测试框架中,我们使用的是 Selenium Remote Control,

小节

该并行的自动化测试框架可以很方便的通过以下步骤升级现有的自动化测试脚本:

  • 修改 test caller,升级到可以支持集中管理脚本的并行测试以及收集测试报告
  • 修改 logger,升级到可以支持每一个运行脚本都有各自的 logger 处理实例,防止最后的测试报告混乱
  • 测试资源管理,升级到可以支持集中管理测试资源,保证测试资源的使用不会产生冲突

我们可以看到,在这个框架中的三个主体部分 STAF ResPool 和 Selenium 可以由用户任意的替换成适合自己项目使用的工具,只要它们具备相似的功能就可以。

并行的自动化测试框架的优势


图 6. 测试数据比较
图 6. 测试数据比较

应用并行的自动化测试后的测试数据比较:

  • 并行自动化测试中测试线程数量增加,执行的时间就会大大降低
  • 并行自动化测试中测试线程数量增加,就需要更多测试用户数量的支持

一个字,快!两个字,高效!这不仅仅是执行效率上的优势,也是测试资源的高效利用。对于测试人员来讲,可以更专注于新功能的测试,自动化测试覆盖原有功能 的测试并可以频繁的执行,因为执行的时间已经不是一个重要问题;这对于开发人员来讲也是一个好的开始,它们可以使用自动化测试来保证自己的改动没有引起 regression defect。另外,运行效率的提高也意味着我们可以方便的开展自动化开发来扩大产品的自动化测试覆盖率,而不用担心测试脚本的增加所造成的运行效率降低 的问题。因为我们可以通过增加硬件测试资源,或者是一些软件方面的测试资源例如测试的用户数量来满足并行自动化测试的需要;这些测试资源都是影响并行的自 动化测试的因素,但是同时也会给并行的自动化测试带来不可估量的执行效率方面的提高。

在本并行的自动化测试框架中用到的其他辅助测试工具

STAF Resource Pool Monitor 和 Admin 工具

为本自动化测试框架开发的辅助工具,用户可以使用它创建、编辑和删除资源池,并可以实时监控资源占用的情况。本文在“使用 STAF Respool 管理测试资源”一章中已经简单介绍了该工具,这里就不做赘述了。

Selenium 系列工具

Selenium IDE,自动化测试辅助开发工具

Selenium IDE 是 Firefox 的一个插件,支持脚本录制,但是仅可以在 Firefox 中使用。它的优点是简单,不懂写程序的测试人员都可以很轻松的编写测试代码,但是它没有逻辑处理比如条件和循环,这样某些复杂的测试案例就不容易做了。因 为 Selenium IDE 的录制功能方便好用,而且可以方便的转换成其他编程语言,所以我们使用它来协助录制测试脚本,或者做为获取页面元素的 XPath 的辅助工具。


图 7. Selenium IDE 录制页面
图 7. Selenium IDE 录制页面

Selenium Remote Control

Selenium RC,Selenium Remote Control,它支持很多浏览器,比如我们经常使用的 Firefox,IE,Safari 等等,也支持使用 Java,Python 等语言编写测试代码,易于维护而且可扩展性也比较好。它主要由两部分组成:

  1. Selenium Server,它负责控制浏览器的行为。
  2. Client Library,写测试代码时用来控制 Selenium Server 的库。

图 8. Selenium Remote Control 原理图
图 8. Selenium Remote Control 原理图

由于在本解决方案中,Selenium RC 只是做为 Test Runner 的测试工具,所以在本文中不对它进行原理方面的详细介绍了。

其他辅助工具

Firefox 插件

FireBug

Firebug 可以查看页面的源代码并且准确定位页面元素的源代码行。用户根据 Firebug 的定位可以比较容易的写出有效的 Selenium 所需要的 XPath。

使用 Firebug 写出 Xpath 后,可以使用 XPath Checker 来检查 Xpath 写的是否正确、是否可以找到对应的页面元素。


图 9. Firebug 查找页面元素( 查看大图
图 9. Firebug 查找页面元素

Remember Certification Exception

越来越多的 Web 应用程序在使用 SSL 身份认证,Selenium Remote Control 不支持访问 SSL 网站,在 Internet Explorer 中我们可以使用设置将证书加载到信任根部证书权。

对于 Firefox 可以使用 Remember Certifications Exception 插件,安装这个插件之后只要有证书窗口就会自动安装。但仅仅这样也是不够的,因为默认情况下 Selenium 在启动 Firefox 实例时都是启用一个“干净”的 Firefox 配置文件,所以我们需要创建一个定制的配置文件导入要测试网站的证书文件,并安装插件 Remember Certification Exception,让 Selenium Server 启动的时候跟把它作为创建新配置文件的基础,这样便可以帮助处理几乎所有的证书异常。

Auto-it

由于 Selenium 是使用 JavaScript 来模拟操作,所以它不支持处理例如安全信息窗口或文件上传、文件下载窗口之类的浏览器元素,对于非主要窗口,配置浏览器可以跳过,对于文件上传和下载窗口 是需要处理的,对于这种情况,其中一种建议是利用 Autoit 来协助处理文件上传和下载的问题。它可以认识大多数的 Windows GUI,并且可以很容易的转换成 .exe 文件,这样的文件可以在 Java 代码中调用。

Autoit 的脚本很容易编写,但是依赖浏览器类型和版本,所以用户要为自己测试的浏览器编写特定的 Autoit 脚本。

总结

通过上文我们可以大致了解并行的自动化测试框架的实现,希望本文对你能有所启发并对您的自动化测试项目有所帮助。

文章出处: IBM developerWorks

加载中
0
jeffsui
jeffsui
学习了
0
DDTer
DDTer
很不错,不够后面的一些有点凑字数的嫌疑了。。。
返回顶部
顶部