《电子技术应用》
您所在的位置:首页 > 测试测量 > 设计应用 > 基于QTP的数据驱动测试开发
基于QTP的数据驱动测试开发
来源:微型机与应用2014年第2期
王 敏,高 霞,王智超
(武昌理工学院 信息工程学院,湖北 武汉430223)
摘要: 提出采用面向自动化测试的测试用例设计格式,通过QTP的编程功能,使用外部数据源来实现较复杂的数据驱动测试。具体方法是采用Excel作为测试数据源,制定Excel中测试数据的设计格式,建立专用的函数库来操作Excel数据,实现以数据为驱动的自动化测试。这一方法能有效地实现测试数据与测试脚本的分离,同时,测试数据的设计操作变得方便,数据的可读性增强,提高了测试效率和测试数据的维护效率。
Abstract:
Key words :

摘  要: 提出采用面向自动化测试的测试用例设计格式,通过QTP的编程功能,使用外部数据源来实现较复杂的数据驱动测试。具体方法是采用Excel作为测试数据源,制定Excel中测试数据的设计格式,建立专用的函数库来操作Excel数据,实现以数据为驱动的自动化测试。这一方法能有效地实现测试数据与测试脚本的分离,同时,测试数据的设计操作变得方便,数据的可读性增强,提高了测试效率和测试数据的维护效率。
关键词: QTP;函数库;测试脚本;测试用例;测试报告

    近年来,软件测试工具逐步得到应用和普及,在软件测试的各个领域发挥着应有的作用[1]。但也有不少软件企业耗巨资购买了软件测试工具而被闲置,其主要原因是人们对测试工具本身提供的功能抱以了过高的期望值,如果对测试人员缺乏必要的自动化测试的理论培训和测试工具的使用培训,一旦遇到困难就容易放弃测试工具,回归到人工测试状态。实际上,大多数测试工具只是提供了一个测试平台,要使测试工具给项目带来效率,必须通过长期的经验积累和资源积累才能实现,其中资源积累主要是基于测试工具的可重用测试脚本的开发[2-3]。
    功能测试工具QTP是目前比较流行的测试工具之一,它可以通过录制操作步骤、在关键字视图参数化数据、设置各类检查点来实现自动化测试[4]。但对于较为复杂的测试过程,仅仅通过关键字视图的简单操作很难实现测试过程的自动化,QTP提供了专家视图来进行测试脚本的开发,通过这种方式能开发更强大和更灵活的测试脚本。在脚本开发中采用数据驱动方式进行脚本开发能提高测试脚本的灵活性,增加测试覆盖面。因此,脚本开发与数据驱动测试常常是相辅相成的技术。
    数据驱动的测试方法解决的核心问题是把数据从测试脚本中分离出来。QTP可以通过Data Table参数化和环境变量参数化来实现数据驱动,但Data Table中只包含两个工作表,且Data Table工作表的参数化数据只能通过列标题来识别,这样设计的测试数据可读性欠佳,虽然可以将外部Excel工作表的数据导入到Data Table来变向地增加工作表,但由于只能通过列标题识别数据,故仍然存在数据可读性和灵活性问题,不便于测试数据的维护;采用环境变量来参数化数据的方法,每一个变量只能对应一个取值,只适合少量的参数化数据,不便于对同一变量不同取值的循环测试。因此,要使数据驱动测试的方法在较复杂的测试过程中发挥作用,上述两种方法均不能较圆满地实现,这就需要采用其他外部数据源,并针对数据源进行脚本开发。
1 面向自动化测试的测试用例设计
    软件工程提出了很多文档、图形设计和代码规范,其目的是便于维护和实现对这些对象的自动化操作,即通过编程来处理这些对象。同样,制定一个较为规范的测试用例设计格式,用于实现以数据为驱动的测试脚本开发,可以降低测试脚本开发的复杂程度,也可省略将测试用例向测试脚本转化这一步骤。
    在实际项目中,测试用例设计人员一般选用表格化的Excel来进行测试用例的设计[5],这里,也沿用这一方式并以常用的管理信息系统设计模式为例来制定测试用例的设计格式。
    测试用例由测试输入、执行条件和预期结果构成[6],因此,测试用例设计应包含这3个要素。由于软件类型千差万别,目前尚无一个较好的形式化语言来定义测试用例,通常采用的是自然语言,而对于数据量较多的测试用例,往往采用描述和附加数据的方式来进行测试用例设计。采用Excel进行测试用例设计时,一个测试实体通常用两个工作表来进行设计,即测试用例设计工作表和测试数据工作表,测试用例设计工作表以表格形式呈现,用自然语言对测试用例的三要素进行描述,测试数据工作表以数据为主体呈现数据。另外,为了方便确认测试结果和测试管理,还会增加一个测试结果工作表用来保存实际执行的结果,采用QTP进行GUI相关的软件测试时,它能录制执行界面,因此测试结果无需人工截图,只需要保留测试执行中QTP不便捕获的数据(如数据库中的数据)。该工作表不属于测试用例设计范围,但与测试用例设计工作表和测试数据工作表保存于同一工作簿文件中,便于在测试执行过程中即时保留相关数据。
    本研究主要针对测试数据工作表的格式进行设计,目标是使测试数据既具有较好的可读性又便于编程实现数据驱动测试。以学生信息管理模块为例来说明测试用例设计格式。这里,主要以一般管理信息系统常用的增删改查功能来说明。测试对象界面如图1所示。

    对图1所示的界面进行功能测试,测试的主要功能为界面操作与数据库数据是否吻合,为了使测试过程通过数据驱动在QTP上自动完成,设计了如图2所示的测试数据设计格式(限于篇幅,图2中只包含修改功能的用例)。其中,测试用例编号Case002、执行前数据标志BeforeTest、数据库数据标志DataBase、执行动作标志【Delete】和【Insert】、数据结束标志***END***、界面数据标志Form、测试执行后标志AfterTest均为设计格式中的关键字,其中,测试用例编号不能重复。在后续的数据驱动测试脚本开发中,将根据这些关键字查找数据自动完成测试。
    图2所示为对学生基本信息管理界面的修改功能进行测试的测试用例。测试用例执行前,由于界面中的“所属”显示的内容来自Department表,因此需要制作该表的数据,同时还需要制作Student中用于修改操作的对象数据。为简化数据制作的实现,统一采用删除后再插入数据的方式来制作数据库测试数据。测试用例执行后,需要验证数据库中Student表的数据是否按界面设定内容发生改变,AfterTest中为数据库数据的预期结果值,用于与实际执行结果相比较来判断结果的正确性。

 

 

2 数据驱动测试的设计与实现
    为便于重用,将用于数据驱动测试的过程和函数设计在一个函数库中。同时,为了减少Excel文件数据读取的I/O次数,首先将工作表中的数据一次读入二维数组,然后采用二维数组的数据来驱动测试执行。
2.1 函数库的设计
    对图1所示界面进行功能测试,一条测试用例执行的基本步骤为:数据库环境设定→界面操作→结果保留和判断→测试报告生成。因此,库函数主要围绕上述步骤的实现进行设计,其中主要实现的功能为用例执行前数据库环境的设定、用例执行后数据库结果的保留以及测试结果判断,其中作为测试结果的界面部分由QTP的Active Screen功能自动保存。另外,测试用例执行及测试报告生成功能在各个测试对象的测试脚本中实现。为减少测试脚本与函数库过程和函数间的参数传递,将二维数组作为公共变量(arrRange)定义在函数库中,函数库中定义的主要过程和函数如下:
    (1)测试数据读入过程
    ReadExcelData(strPath,strSheet),参数顺次为Excel文件保存路径、工作表名,其功能是将工作表中的数据保存于二维数组(arrRange)中,供后续测试使用,实现代码如下:
Sub ReadExcel(strFileName,strSheetName)
    Dim objExcel
    Dim objRange
    '打开Excel指定工作表
    On error Resume Next
    Set objExcel=CreateObject("Excel.Application")
    objExcel.Workbooks.Open(strFileName)
    Set objRange=objExcel.Worksheets(strSheetName).UsedRange
    If  err.Number<>0  Then
        Exit Sub
    End If
    On error Goto 0
    '将Excel转成二维数组
    arrRange=objRange.Value
    objExcel.WorkBooks.Item(1).close
    Set objRange=nothing
    objExcel.quit
    Set objExcel=nothing
End Sub
    (2)数据查找过程SearchData (strKey,Byref m,Byref n),参数依次为查找关键字、行编号、列编号。功能为查找关键字在二维数组中的位置,参数m、n既带入查找开始位置,又将查找结果带回到主调脚本中,实现代码如下:
Sub Search(strKey,Byref m,Byref n)
    Dim blnLoop
    blnLoop=True
    On error Goto 0
    For i=m to UBound(arrRange)
        For  j=1 to UBound(arrRange,2)
        If  cstr(arrRange(i,j))=strKey  Then
          m=i
          n=j
          blnLoop=False
          Exit for
        End If
      Next
      If blnLoop=False Then
        Exit for
      End If
    Next
End Sub
    (3)数据库环境构建过程
    CreateDbData(strCaseNo,Byref m,Byref n),参数依次为测试用例编号、行编号和列编号,该过程的功能是对指定用例执行前的数据库环境进行设定,将工作表中对应用例编号下面DataBase与/DataBase之间的数据按顺序先删除再插入,该过程将调用SearchData过程来定位数据位置。其处理流程如图3所示。

    (4)测试结果保留过程
    SaveDbData(strCaseNo,strResultSheet),参数为测试用例编号,功能为从测试数据工作表中读取AfterTest中的SQL语句,将数据库中查询的数据结果依次保存到测试结果工作表中。
    (5)测试结果判断函数
    JudgeResult(strCaseNo,ByRef strMsg),参数为测试用例编号和测试结果信息,比较预期结果与实际执行结果是否一致,若抽选出的数据量或对应数据值一致则返回True;若不一致,则返回值为False,同时将比较结果的详细信息通过strMsg变量带回到主调测试脚本中。为简化数据比较操作,要求预期结果与实际结果按同样方式排序,因此查询结果的SQL语句必须用ORDER BY语句对抽选结果进行排序。
2.2 测试脚本设计
    在编写测试脚本前,先通过QTP录制一段简单的界面操作,录制过程中,将测试中需要捕获的对象用鼠标拖选,以便将其添加到对象库中,然后停止录制,最后根据测试流程在专家视图中编写测试脚本。以下为图2所示的测试用例Case002对应的测试脚本:
Dim i,j
Dim strCaseNo,strMsg
Dim strPath,strTestDesign,strResultSheet
i=1
j=1
strPath="D:\QTP\Student.xls"
strTestDesign="TestDesign"
strResultSheet ="TestResult"
Call ReadExcel(strPath, strTestDesign)
'Case001
strCaseNo="Case001"
……(略)
'Case002
strCaseNo="Case002"
Call CreateDbData (strCaseNo,i,j)
Call Search("Form",i,j)
i=i+2
VbWindow("frmStudent").VbRadioButton("修改").Set
VbWindow("frmStudent").VbEdit("txtNo").Set GetValue(i,j)
VbWindow("frmStudent").VbButton("检索").Click
VbWindow("frmStudent").VbEdit("txtName").Set GetValue(i,j)
VbWindow("frmStudent").VbComboBox("cobSex").Select GetValue(i,j)
VbWindow("frmStudent").VbEdit("txtBirthday").Set GetValue(i,j)
VbWindow("frmStudent").VbComboBox("cobDept").Select GetValue(i,j)
VbWindow("frmStudent").VbEdit("txtTel").Set GetValue(i,j)
VbWindow("frmStudent").VbEdit("txtYou").Set GetValue(i,j)
VbWindow("frmStudent").VbEdit("txtAddress").Set GetValue(i,j)
VbWindow("frmStudent").VbButton("执行").Click
Call SaveDbData(strCaseNo,strResultSheet)
If  JudgeResult(strCaseNo,strMsg)=false  then
    reporter.ReportEvent 1,strCaseNo ,strMsg  ' 失败
else
    reporter.ReportEvent  0,strCaseNo,strMsg  '成功
end if
……(略)
    脚本中调用了函数GetValue来动态获取输入界面的数据,该函数定义在函数库中,用来获取行列为i、j的数组值,由于是按列依次获取数据,在函数中将j值自动加1来实现。
2.3 测试结果
    对图1的界面设计增删查改4个测试用例,并在应用程序的修改操作中人为制造一个Bug,使Update语句漏掉一个字段的修改,运行测试脚本,测试报告如图4所示。

    软件测试工具给自动化测试提供了一个实用的平台,但要对应各种复杂的测试,基于测试工具的二次开发是必不可少的。本研究主要针对一般管理信息系统的基本功能设计了一个测试数据设计格式,并基于这一格式建立了一个能通用于类似系统的函数库。后续研究中将继续在QTP测试平台对实际项目中常用的一些测试模式进行可重用函数库的开发研究,以提升QTP的自动化测试能力和效率。
参考文献
[1] 陈技能.QTP自动化测试进阶[M].北京:电子工业出版社,2011:153-179.
[2] 张鹤.基于QTP的自动化功能测试研究与实现[D].哈尔滨:哈尔滨工业大学,2011.
[3] 杜丽洁.基于QTP自动化测试框架的开发与应用[D].武汉:武汉理工大学,2012.
[4] 区立斌.基于层次关键字驱动的自动化测试框架设计与应用[D].广州:中山大学,2012.
[5] 王敏,陈亚光.数据库系统辅助测试工具[J].微型机与应用,2013,32(3):13-15.
[6] 佟伟光.软件测试[M].北京:人民邮电出版社,2008.

此内容为AET网站原创,未经授权禁止转载。