测试交流学习QQ:476879428

[整理]关于自动化测试框架

上一篇 / 下一篇  2012-03-05 11:58:15 / 个人分类:自动化测试

自动化测试框架

软件测试领域,我们经常会听到测试框架。什么是软件测试框架?在软件测试中它起到怎样的作用?要认识软件测试框架,首先要对所谓框架有概念。框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面、而 后者是从目的方面给出的定义。测试框架也是如此,测试框架出现的最终目的是花少量的资源来完成尽可能多的测试任务,所以软件测试框架的建立以及框架的重用性方面是最值得测试人员深入探究的地方。Java测试框架、.Net测试框架、自动化测试框架、单元测试框架、集成测试框架,你是不是已经被这些名称弄晕了?如何实现测试框架用于特殊场合?本专题将就以上问题对测试框架进行全面详解,从测试 框架入门和类别,到常用框架应用和自己动手实现框架。

一、自动化测试的优点
 1.提高测试效率和降低测试成本

 2.实现快速的回归测试,加快测试进度从而加快产品发布进度
 3.
更多的测试,提高测试覆盖率

 4.
保证一致性

 5.
提高测试的可靠性,避免人为因素 。

二、为什么要做自动化测试框架
  通过以往的尝试,发现真正实现自动化测试,并不是掌握了某个自动化测试工具,掌握了脚本的编写技术就能够达成,面对复杂的ERP系统,简单的 录制/回放并不能达到自动化测试的要求,完全通过编写脚本的方式,工作量巨大且可维护性极差、不能复用。实现自动化就是为了能够提升测试效率,不具备可维护性、复用性差将成为导致自动化测试失败的最致命因素,付出巨大代价但起到的效果甚微。
  基于以上因素并结合行业发展思路,在正式实施自动化之前,必须搭建一套适合的自动化测试框架,将脚本能够有效的组织、连贯应用起来,提高测试 脚本的可维护性和可读性。

三、       什么是测试框架:

软件测试框架是一组自动化测试的规范、测试脚本的基础代码,以及测试思想、惯例的集合。可用于减少冗余代码、提高代码生产率、提高代码重用性和可维护性。 测试框架的好处在于:提高开发速度,提升测试代码的执行效率;提高软件代码质量,同时引入重构概念,让代码更干净和富有弹性;提升系统的可信赖度,作为回归测试的一种实现方法支持修复后"再测试", 确保代码的正确性。常用的测试框架分类包括自动化测试框架和单元测试框架。根据所用开发平台不同,也可使用不同的测试框架展开测试。

四、       软件自动化测试框架的发展

基于界面的软件自动化测试框架和工具的发展大致经历了三个阶段(有人也据此将测试工具分为三代):

1)简单的录制/回放:由工具录制并记录操作的过程和数据形成脚本,通过回放来重复人工操作的过程。在这种模式下数据和脚本混在一起,几乎一个测试用例对应一个脚本,维护成本很高。而且即使界面的简单变化也需要重新录制,脚本 可重复使用的效率低。

2)数据驱动 (data driven) 的自动化测试:从数据文件读取输入数据,通过变量的参数化,将测试数据传入测试脚本,不同的数据文件对应不同的测试用例。在这种模式下数据和脚本分离,脚本的利用率、可维护性大大提高,但受界面变化的影响仍然很大。

3)关键字驱动(keyword driven) 的自动化测试:关键字驱动测试是数据驱动测试的一种改进类型,它将测试逻辑按照关键字进行分解,形成数据文件,关键字对应封装的业务逻辑。主要关键字包括三类:被操作对象(Item)、操作(Operation)和值(value), 用面向对象形式可将其表现为Item.OperationValue)。 关键字驱动的主要思想是:脚本与数据分离、界面元素名与测试内部对象名分离、测试描述与具体实现细节分离。

相应地,软件测试自动化脚本的类型,从低到高的发展层次是:

1)线性脚本:通过录制直接产生的线性执行的脚本。

2)结构化的脚本:具有顺序、循环、分支等结构的脚本。

3)共享的脚本:可以被多个测试用例使用,被其它脚本调用的脚本。

4)数据驱动的脚本:数据和流程控制分离的脚本,通过读入数据文件来驱动流程进行的脚本。

5)关键字驱动的脚本:脚本、数据、业务分离,数据和关键字在不同的数据表中,通过关键字来驱动测试业务逻辑。关键字驱动脚本的特点是它看起来更像描述一个测试事例做什么, 而不是如何做。

目前,大多数测试工具处于数据驱动到关键字驱动之间的阶段,有些工具厂商已经提出了 声称支持关键字驱动的版本。
五、希望达成的目标
  搭建符合以下要求的自动化测试框架,使得未来自动化测试正式实施时能够有序、高效的开展:
  高复用性

 
 高可维护性

   
稳定性

   
快速编写脚本

   
自动执行

   
正确输出结果

   
能够不断提升自动化测试比例

六、实现思路
   分层设计
:业务流程、功能点、操作组件
  我们在进行测试时,首先会验证各个页面、各个字段的正确性,到验证功能点的正确性,再组合各个功能点进行业务逻辑、业务流程的验证,最终确保 系统满足业务需求。

  对于自动化脚本,采用分层的思想,先实现最底层的操作组件,通过调用操作组件、及业务逻辑实现对功能点的验证,再通过调用业务逻辑组合功能点实现对业务流程的验证。不同的业务流程,对于底层的操作组件、中间层的功能点函数是完全可以复用的,只是调用的业务逻辑的差异,或者是测试数据的差异性。

  尽可能做到各脚本之间具备独立性,不相互依赖,便于进行各种基本场景的组合运行。

  如销售系统中的选择房间操作,在做预约、小订、认购等操作时,都需要用到选择房产,因此可以将选择房产做为一个公共的操作组件,详细描述选择 房产的操作步骤,在测试新增预约、新增小订、新增认购等功能点时都需要调用到选择房产的操作组件,只是业务的校验逻辑与所选择的数据不一致。

  再看业务流程,新增一个小订单后可以作废,也可以由小订转认购,业务流程就有两个:新增小订单作废订单,新增小订单转认购,这两个业务流 程中新增小订单这个功能点是一致的,可以通过调用不同的用例数据组合成不同的业务流程。

   
脚本分离设计:对象、操作、测试数据、业务逻辑相互剥离、灵活调用

  对某个功能进行自动化测试,实际上就是对这个功能涉及的对象进行操作,输入测试数据来验证其结果的正确性,复杂的验证点需要编写业务逻辑。如 果全部用脚本的方式编写,针对每一条测试数据就需要编写一份脚本,脚本量相当巨大,同时任何改动(程序、测试用例、GUI对象)都需要调整大量的脚本。

  为了达到可维护性、可复用性,将对象、操作、测试数据、业务逻辑剥离、分开管理,通过调用关系去组合实现不同的测试用例。

  对象资源库

  测试数据资源库

  操作组件(描述操作步骤)

  脚本:业务逻辑

  分离后,如果要增加测试用例,只需要维护测试数据,如果程序修改,增加了对象,那么只需要维护对象库、操作组件,增加对这个对象的操作。

   
封装基础函数、基本的业务逻辑、验证点

  通过对基本业务逻辑、验证点的封装、调用,实现快速的脚本开发

  如一个数据保存的功能,每一条数据在做了增、删、改的操作后,都需要验证保存至后台数据库的数据正确性,通过预期结果与数据库实际产生的数据 集进行比较验证,在获取数据库实际产生的数据集的方式是通用的,只是不同的功能所要验证的数据表、字段及Where条件不一致,获取数据集的方式就可以封 装成一个基础函数,传入不同的SQL语句做为参数即可。同时预期结果与实际结果集的比较也可以封装为基础函数。

  再如,系统页面中在某些操作或条件下,部分字段是只读不允许编辑的,或者是隐藏不显示的,编写脚本时需要对每一个对象写一条语句验证其只读和 隐藏属性的正确性,如果将只读和隐藏属性的验证进行封装,针对每一个页面进行验证,那么只需要传入这个页面只读或隐藏的对象名称,调用封装的函数执行验证。可以大大减少脚本量,也更易于维护。

  有效的执行体系

  批量、定制执行、自动运行

  自动化测试真正达到提升测试效率,需要实现无人值守情况下的批量自动执行,并且可以定制执行。

  异常处理机制

  脚本执行过程中,因程序错误或环境问题、脚本自身问题经常会出现非预期的错误:如意料外的弹出窗口、发现错误的数据、未找到对象、输入文件打 不开或不能读等,有些情况下当前用例出错,并不影响后续用例的执行,需要支持异常处理机制,终止执行或者终止当前用例,继续后续用例的执行,亦或者跳过当前步骤,继续执行后续操作,并输出当前的错误报告。

  业务数据还原初始状态

  自动化测试需要循环执行,执行完成后,需要恢复初始状态(主要是业务数据),以使得程序重新提交版本后能够循环执行,不断的对新版本进行回归 验证。

  版本管理

  随着待验证版本的不一致,自动化测试脚本也会不断的更新、维护,同样需要进行版本管理。

  结果体系

  针以每条用例,输出用例执行结果

  针对每个检查点,输出详细的检查点执行结果

  输出执行日志

  结构化管理

  对象、操作组件、基础函数、测试数据、功能点脚本、业务流程组合,如此多的层级、调用关系,必须进行结构化管理,采用高度组织化的目录结构、 分级管理,方便进行正确及快速的调用,方便能够快速定位、查找问题。

七、框架需要的功能和结构说明

中央控制模块

调度所有模块的核心模块,用来通过自动化测试用例来动态生成脚本的核心脚本,QTP中完成

数据模块

保存测试需要的数据,通过字段来读取数据,可以通过QTP插件或者自己编写VBS脚本来设置脚本的读取方式,使数据读取更加灵活

对象模块

对象的相关信息可以通过数据库或者XML来管理和存储,在对象比较多的情况下建议使用数据库进行管理,通过存储过程来读取对象,使相关的对象拼接成QTP可以识别的字符串

比较模块

没有验证的自动化测试等于没有起到什么作用,所以验证模块也是非常重要的模块,该模块目前为止只能通过自动化测试人员来编写完成,然后通过自动化测试用例中的标识来调用相关模块

自动化用例管理模块

通过Excel的文件来管理自动化测试用例,来控制自动化用例的顺序或者通过QC来管理自动化测试用例的调度和顺序

日志模块

跟踪脚本的运行过程,使我们能更方便的找到错误的位置

报告模块

生成自动化测试的报告,把该报告放到某个文件夹下,方便我们查看结果,一般使用Excel文件来生成报告

导入模块

通过该模块批量自动的将对象相关信息导入到数据库或者XML

从上面可以看到,自动化测试框架和脚本的发展是和软件工程思想的发展一脉相承的。软 件开发的模式从面向机器、到面向过程、再到面向对象、面向服务,是一个从底层到高层、从具体到抽象、复用的粒度从细到粗的发展过程。而软件开发中的模块化、层次化、松耦合等思想对自动化测试框架的设计都具有借鉴意义

自动化测试框架的分类

测试自动化框架是一组假设、概念和惯例的集合,用于支持自动化测试。除了录制回放外,我们可以把自动化测试划分为如下五类:

模块化框架(test script. modularity

模块化框架指将需要测试的区域按一定的逻辑进行划分,分别录制和编写脚本,然后再由另外一个脚本来组织这些脚本进行运行。一般会把脚本分成几层,根据被测试程序的复杂程度决定层次的个数。下面以Windows的计算其程序为例说明这种框架。

首先编写底层的三级脚本,例如:

SubMain

     Window Set Context, "Caption=Calculator", ""     

     '5

     PushButton Click, "ObjectIndex=10"     

     '+

     PushButton Click, "ObjectIndex=20"     

     '6

     PushButton Click, "ObjectIndex=14"     

     '=

     PushButton Click, "ObjectIndex=21"     

     '11

     Result = LabelUP (CompareProperties, "Text=11.", "UP=Object Properties")     

End Sub

 

SubMain

     Window Set Context, "Caption=Calculator", ""     

     '20

     PushButton Click, "ObjectIndex=11"

     PushButton Click, "ObjectIndex=8"     

     '-

     PushButton Click, "ObjectIndex=19"     

     '10

     PushButton Click, "ObjectIndex=7"

     PushButton Click, "ObjectIndex=8"     

     '=

     PushButton Click, "ObjectIndex=21"     

     '10

     Result = LabelUP (CompareProperties, "Text=10.", "UP=Object Properties")     

End Sub

底层脚本可以作为测试脚本开发任务,分模块下发给每个测试工程师负责开发。然后用一个二级脚本来组织和整合这几个底层的脚本,例如下面是计算器的标准视图下组合底层测试脚本的例子:

'Test Script. Modularity Framework

'Script. for Standard View

SubMain

     'Test Add Functionality

     CallScript. "Test Script. Mod Framework - Add"     

     'Test Subtract Functionality

     CallScript. "Test Script. Mod Framework - Substract"     

     'Test Divide Functionality

     CallScript. "Test Script. Mod Framework - Divide"     

     'Test Multiply Functionality

     CallScript. "Test Script. Mod Framework - Multiply"     

End Sub

 

最后,最顶层的测试脚本(一级脚本)再去把二级脚本组织和整合在一起执行,例如下面的脚本组合了计算器的标准视图和科学视图的测试脚本:

'Test Script. Modularity Framework

'Top level script. - represents test case

SubMain

     'Test the Standard View

     CallScript. "Test Script. Mod Framework - Standard"     

     'Test the Scientific View

     CallScript. "Test Script. Mod Framework - Scientific"     

End Sub

函数库结构框架(test library architecture

    函数库结构框架类似于编程方法中的结构化编程思想,把测试脚本做成函数,通过函数之间相互调用来组织测试用例。例如下面的一个函数实现了计算器标准视图的测试:

'Header File

'Test Library Architecture Framework

"Functions Library

Declare Sub StandardViewFunction BasicLib "Functions Library" (OperandOne As Integer, _

 

'Library Source File

'Test Library Architecture Framework

'Functions Library

Sub StandardViewFunction (OperandOne As Integer, _

                                                                                    OperandTwo As Interger, _

                                                                                    Operation As String)

         'Click on first operand

         Select Case OperandOne

                     Case 0

                                     PushButton Click, "ObjectIndex=8"

                           Case 1

                                     PushButton Click, "ObjectIndex=7"

                           Case 2

                                     PushButton Click, "ObjectIndex=11"

                          Case 3

                                     PushButton Click, "ObjectIndex=15"

                           Case 4

                                     PushButton Click, "ObjectIndex=6"

                           Case 5

                                     PushButton Click, "ObjectIndex=10"

                           Case 6

                                     PushButton Click, "ObjectIndex=14"

                           Case 7

                                     PushButton Click, "ObjectIndex=5"

                           Case 8

                                     PushButton Click, "ObjectIndex=9"

                           Case 9

                                     PushButton Click, "ObjectIndex=13"

                  End Select

                  

         'Click on second operand

         Select Case OperandOne

                     Case "+"

                                     PushButton Click, "ObjectIndex=8"

                           Case "-"

                                     PushButton Click, "ObjectIndex=7"

                           Case "*"

                                     PushButton Click, "ObjectIndex=11"

                           Case "/"

                                     PushButton Click, "ObjectIndex=15"

                  End Select

                  

         'Click on third operand

         Select Case OperandOne

                     Case 0

                                     PushButton Click, "ObjectIndex=8"

                           Case 1

                                     PushButton Click, "ObjectIndex=7"

                           Case 2

                                     PushButton Click, "ObjectIndex=11"

                           Case 3

                                     PushButton Click, "ObjectIndex=15"

                           Case 4

                                     PushButton Click, "ObjectIndex=6"

                           Case 5

                                     PushButton Click, "ObjectIndex=10"

                           Case 6

     &am

TAG:

测试-Online 引用 删除 cckaji   /   2012-07-02 14:08:41
5
 

评分:0

我来说两句