1 引言

  软件测试的目的在于找出软件缺陷,提升软件质量。软件测试是软件产品的质保员,是软件生命周期的重要一环。根据大量统计数据显示,在典型的软件项目开发中,软件测试投入的成本往往占到软件总成本的40%以上。为了降低测试成本,提升测试效率,自动化测试工具逐步受到人们的重视,越来越多地被应用于软件测试。

2 QTP简介

  QTP的全称是Quicktest Professional,是Mercury公司开发的企业级自动化测试工具,后来被惠普公司收购,正式命名为HP Quicktest Professional Software,从11.5版本,改名为Unified Functional Testing,目前最新版本是12.00,可以支持中文,是市场上普遍应用的一款自动化测试工具。

  2.1 QTP的特点

  QTP的内置插件可支持多种开发环境的软件,在启动QTP时,可根据被测软件的环境,选择合适的插件,进行加载;QTP拥有强大的对象库和对象识别机制,支持用户以录制的方式生成脚本,拥有的多种回放模式,可方便进行脚本维护;QTP使用VBScript作为脚本语言,并可实例化.net对象,封装的函数和对象丰富,可扩展性强;使用QTP的数据池(Data Table)可进行数据驱动测试。

  2.2 QTP的适用范围

  自动化测试能帮助提高软件的质量,协助测试人员提高工作效率,但自动化测试不是万能的,不可能完全取代手工测试,它有其适用的范围。(1)适用于需求变更不频繁、项目周期长的软件系统。需求变更过于频繁会增加QTP测试脚本的维护成本。对于项目周期短的软件系统,引入QTP,不但会增加测试成本,而且会延长系统的发布时间,得不偿失。(2)待测系统使用的控件必须可以被QTP识别。这是使用QTP进行自动化测试的前提。一个自动化测试工具的好坏评判最基本的标准就是,是否能够识别更多的系统控件以及对无法识别的控件能否提供各种解决方案或自定义开发各种控件的识别代码。(3)QTP测试脚本复用率高,脚本维护成本低。也是应用QTP的一个很重要的前提。

3 国家科技计划预算管理系统测试背景

  3.1 系统简介

  本文所说的国家科技计划是指三大计划,分别是国家重点基础研究发展计划(简称973计划)、国家科技支撑计划(简称支撑计划)、国家高技术研究发展计划(简称863计划)。国家科技计划预算管理系统是用于支撑三大计划经费管理工作的,它包含概算填报、预算申报、预算评审、预算拟安排、预算批复、预算书、中期财务检查、财务验收和决算九个子系统,涵盖了课题经费的整个生命周期。其系统结构如图1所示。

  973计划、863计划和支撑计划的预算管理系统是三个独立的系统,它们的功能类似,只是各子系统的流程和功能有细微的区别。

  3.2 系统测试特点

  预算管理系统包含的九个子系统,除预算评审、预算拟安排和预算批复系统的功能简单些之外,其他6个子系统的流程和测试功能点都非常多,它们的功能和流程大同小异,我们以973计划的预算申报系统为例进行说明,973预算申报系统的填报流程如图2所示。

  图2只是973预算申报系统的填报流程,不包含预算申报系统的管理流程。如果对每个子系统进行全流程测试,那么对测试数据的需求量是相当大的。每个流程的起点是,填报一套平衡关系符合上报要求的报表数据,如果需要N套数据,那么就要填平N套报表。

  973预算申报系统包含封面、课题基本情况表、课题参加人员基本情况表、国家科技计划课题预算表、设备费——购置/试制设备预算明细表、测试化验加工费预算明细表、承担单位研究经费支出预算明细表和国家科技计划课题自筹经费来源证明8个需要填报的报表,不仅报表内有需要平衡的审核关系,报表间也存在钩稽关系审核,所有这些需要平衡的审核条件有50条之多。填平一套报表,就需要平衡这几十条审核关系。

  如果升级测试的重点,不是报表审核关系,而是流程测试或者是后续功能点的测试,那么把大量的测试时间花费在报表填报以及平衡审核关系上,那就太不必要了。但是填平报表又是流程测试和后续功能点测试的前提,我们需要填平大量的报表以备后续测试,但又不想花费大量的时间在填平报表上,于是我们将QTP自动化测试引入到测试中来,让QTP帮助我们批量造数。

4 QTP在系统测试中的应用

  4.1 QTP自动化测试脚本的实现

  QTP自动化测试脚本分为两部分,第一部分是取数脚本,实现了报表数据的取出、存储及导出功能。其核心代码如下:

  with Browser("国家重点基础研究发展计划预算申报填报系统").Page("国家重点基础研究发展计划预算申报填报系统").Frame("frmRight").ActiveX("CellWeb5 Control").Object

  For i=0 to .GetTotalSheets

  .SetCurSheet i

  DataTable.Value("rowCount","mysheet")=.GetRows(i)

  DataTable.Value("sheetNum","mysheet")=i