轻量级自动化测试框架—QTPBasediSoftStoneInformationServiceCorporationConfidential©2008iSoftStoneHoldingsLtd.AllRightsReserved.目录•问题描述•解决方案–框架图示–数据的组织–驱动的逻辑–优势和缺点•参考资料问题描述Confidential©2008iSoftStoneHoldingsLtd.AllRightsReserved.问题描述•前段时间,完成了一些自动化测试的工作,发现了几个问题:1.脚本文件过大经过检查分析,主要是两方面原因导致,一是对象库的文件,默认生成得每个空的对象库文件为192K,这样一个空的QTP脚本文件就至少需要192K*2=384K的空间(Action0和Action1),如果分割的Action多的话,占用的空间就更多。二是Excel的文件,同样由于分割Action,每个Action需要使用一个独立的Sheet,包括脚本中调用的Action,这个在复杂的脚本中,表现得更加明显,往往一个贷款发放的脚本会占用3~4M空间。2.文件数量过多一个最简单的QTP脚本,共有4个文件夹,13个文件,当分割Action较多时,文件数与Action的个数呈正比上升。Confidential©2008iSoftStoneHoldingsLtd.AllRightsReserved.问题描述•这两个问题,直接导致最终完成的工程文件达到700~800M,文件数以万计。这还只包括了信贷与结算的主要业务。而其中真正有用的脚本,全部用文本来存储的话,不会超过10M。使用Action复用的方式带来了维护、转移、版本的巨大困难。解决方案Confidential©2008iSoftStoneHoldingsLtd.AllRightsReserved.解决方案概述1.用VBS的Function代替QTP脚本中的Action。不使用Action复用,而使用Function的加载和调用。直接减少QTP脚本的数量。2.使用单一的QTP脚本入口。这样整个工程中,就只有一个QTP脚本,其他的都是VBS文件,并且没有了过多的Excel文件。确保冗余文件达到最少。3.数据文件统一维护。将所有脚本需要用到的测试数据统一放到一个或多个Excel文件中,方便了维护,同时也减少了Excel文件的数量。Confidential©2008iSoftStoneHoldingsLtd.AllRightsReserved.框架图示Confidential©2008iSoftStoneHoldingsLtd.AllRightsReserved.框架说明采用了(TestCase-Task)的模块化设计思想,业务数据驱动脚本的指导思想。框架并没有太多的新意,对AUT测试对象的处理,全部交给测试工具和Script去处理,框架只处理业务层面的测试数据。当页面元素是动态生成,或者写得不规范时,Web对象的识别是困难的,而且用Excel表格来记录一个个的Web对象,亦不见得实用。因此,对于Web对象的识别就全部放到脚本中去处理。幸好QTP提供的功能足以胜任这个工作。框架中,最核心的可能是Driver脚本,但是在整个测试中,最核心的不是Driver,不是Script,而是业务测试数据。孤立的来看自动化测试框架,是没有任何意义的。什么样的测试用例,决定什么样的框架。Confidential©2008iSoftStoneHoldingsLtd.AllRightsReserved.体系结构1.TestSet驱动脚本初始化解析TestSet的数据文件调用TestCase驱动脚本,向它传递测试用例的文件名如果有必要,调用框架所必需的库函数2.TestCase驱动脚本解析TestCase的数据文件根据TestCase的解析结果,加载测试脚本,加载测试数据根据TestCase的内容,调用Task的测试脚本,并且把测试数据的集合传递给测试脚本如果有必要,调用框架所必需的库函数Confidential©2008iSoftStoneHoldingsLtd.AllRightsReserved.体系结构3.Task测试脚本执行指定的任务(如输入数据,点击按钮等)生成日志,以及测试报告如果需要则调用用户自定义库函数4.库函数一般的和具体应用程序的函数可以被调用,以执行指定的任务。Confidential©2008iSoftStoneHoldingsLtd.AllRightsReserved.框架的存储结构Confidential©2008iSoftStoneHoldingsLtd.AllRightsReserved.框架的存储结构•Project文件夹,整个工程的最高一级目录,名称可以修改。•Driver目录,这个是QuickTest的脚本文件,整个框架的入口。这个脚本包含了testSet和testcase的驱动脚本。•frameUtil目录,存放用来支持框架的一些函数库。•logs目录,存放脚本运行日志•testData目录,存放测试用例以及测试数据的Excel文件•testScript目录,存放task脚本,全部存储为vbs文件。•driver.vbs文件,使用了QTP的automationobjectmodel,也是整个框架的入口。可以直接执行该vbs脚本,因此可以做成Windows的自动任务,在指定时间点执行。testData和testScript目录下的内容,是真正需要开发的。Confidential©2008iSoftStoneHoldingsLtd.AllRightsReserved.数据的组织TestSetTestCaseTestDataTestDataConfidential©2008iSoftStoneHoldingsLtd.AllRightsReserved.TestSet数据文件•TestSet数据文件是用来管理测试用例文件的,在这里,扮演了TD的管理测试用例和脚本的角色。很显然,这个数据文件没有TD的功能强大,不能体现测试用例对需求的覆盖,没有测试用例之间的树形结构…但是作为一个轻量级的测试框架,只要能够记录、管理50~100个测试用例文件,就暂时够用了。•IDX:index,“√”表示该行数据有效,“x”表示该行数据无效。主要是考虑到Excel直接面对人,用0,1来标识有效无效,很不直观。•name:测试用例的名字,用中文标示即可,这个字段只是让人看起来比较直观,并不会被用到。•table:这个字段非常重要,它指向测试用例所在的Excel的文件名。可以带后缀,也可以不带后缀。不需要指定文件所在的路径。•sheet:表示测试用例在Excel文件的Sheet名称。如果不填写的话,默认为第一个Sheet。•考虑到有些测试用例极其复杂,仅仅使用Excel形式的测试用例是远远不能实现其复杂的逻辑,也可以把测试用例写成vbs文件,直接执行该vbs脚本。目前暂未实现。Confidential©2008iSoftStoneHoldingsLtd.AllRightsReserved.TestCase数据文件•TestCase数据文件中记录的就是测试用例,只要不是太过于复杂的测试流程,都可以直接写在Excel文件中,当然,需要符合一定的规范,很显然,这离自然语言还是有一定的距离。这种形式比较适合step-by-step的测试用例,并且粒度比较粗,减少了测试用例的步骤数。•IDX:index,“√”表示该行数据有效,“x”表示该行数据无效。•bizName:被测试的业务的名称,比如说“银行收款”这个业务。事实上,这个名称需要与存储改业务的task脚本的名称保持一致,而且需要与task脚本中定义的class的名称也保持一致。在没有做名称的中英文对照字典之前,bizName最好使用英文名,所以最好使用“collection”,而不是“银行收款”。•taskName:task的名称,原子业务的名称,比如新增、修改、删除等。这个名称与task脚本中定义的各个Function的名称应该保持一致。同样,暂时也最好不要使用中文。Confidential©2008iSoftStoneHoldingsLtd.AllRightsReserved.TestCase数据文件•bizDataTable:测试数据所在的Excel的Sheet名称。比如说进行登陆操作时,需要输入用户名和密码等数据,这些数据单独放在某个Excel文件中的某个Sheet中,把这个Sheet的名称写到bizDataTable这个字段中即可,框架会自动去加载这个Sheet中的所有数据。•filter:测试数据的过滤条件。可能准备的测试数据比较多,但是在当前这一个step中,只需要执行某一条或几条数据,就可以使用filter这个条件。比如说,登陆时,想用错误的用户名和密码来登陆,那么可以这样写:用户类型=baduser。当然“用户类型”是测试数据所在Excel表格中定义过了的字段。老实说,在这次完成的框架中,只有filter这个想法,觉得有点意思。感谢提出这个需求的同事。Confidential©2008iSoftStoneHoldingsLtd.AllRightsReserved.Testdata数据文件•Testdata数据文件,用来存放测试数据。没有区分输入数据、验证数据、以及输出数据,总之,只要是测试过程中,需要用到的数据,都一古脑的做成一行,放到这个文件中。一是觉得这样在设计测试数据时,比较方便和直观,二是也没有更好的设计思想。•对业务的验证,按照设想,是通过日志文件和测试报告来体现的。所以把验证数据与输入数据放到一起,亦不会有太大的不妥。Confidential©2008iSoftStoneHoldingsLtd.AllRightsReserved.数据文件总结•基于把测试设计和脚本开发分开的思路,设计了这三个Excel表格。测试设计时,主要是设计testcase和testdata这两个Excel表格。毕竟,这才是自动化测试最核心的价值所在。脚本写得再完美,没有好的测试设计、测试数据,对测试本身并不会有太大的帮助。•因此,希望尽可能把这些Excel表格做得更易用。所谓的框架,就是把这3个Excel表格串起来的东西。Confidential©2008iSoftStoneHoldingsLtd.AllRightsReserved.驱动脚本的逻辑•TestSet驱动脚本伪码•TestCase驱动脚本伪码•Task脚本说明Confidential©2008iSoftStoneHoldingsLtd.AllRightsReserved.TestSet驱动脚本伪码1.将testset数据所在的整个Sheet加载到QuickTest的RuntimeTable中。2.检查testset数据文件中一共有多少行记录需要执行。3.读取一行数据。4.如果该行的IDX的值为“√”,那么调用执行TestCase驱动脚本,并且把测试用例所在的Excel文件名和Sheet名作为参数传给TestCase脚本。5.转向第3步,直到所有数据被执行完毕。6.删除加载到RuntimeTable中的所有数据。Confidential©2008iSoftStoneHoldingsLtd.AllRightsReserved.TestCase驱动脚本伪码1.将TestCase所在的Sheet加载到QuickTest的RunTimeTable中。2.检查TestCase数据文件中一共有多少行记录需要执行。3.遍历整个Sheet,加载所有需要被用到的Task脚本:逐行读取有效数据(IDX=“√”),如果bizName的值所指向的Task脚本没有被加载,那么加载之,直到所有数据被执行完毕。4.遍历整个Sheet,加载所有需要被用到的Testdata数据:逐行读取有效数据(IDX=“√”),如果bizDataTable的值所指向的Sheet(该Sheet的名称应该