手工开发 Rational Functional Tester(RFT)测试脚本的过程和开发普通的程序类似,需要经过“编写、执行、发生错误、退出执行、查找并修改错误、再次执行脚本……开发成功”的过程。其中“执行、发生错误、退出执行、查找并修改错误”几个环节可能需要多次的循环迭代。对于步骤繁多的大型脚本,上述迭代次数的大幅增加将会产生巨大的时间成本。本文提出一种实现快速开发脚本的方法,该方法综合调试、异常处理、流程控制等技术,以调试的方式实现脚本的开发。该方法把编写和调试脚本的过程合一,可以一边开发脚本,一边执行脚本;当脚本执行出现错误时,能够迅速定位错误,并且在修改错误之后无需从头执行脚本。这种方法能够有效地缓解传统开发方法存在的迭代问题,特别适合于中大型测试脚本的开发。
传统开发模式中的迭代问题
为提高代码的重用性,测试人员一般不直接录制功能性自动化测试脚本,而是采用手工方式开发测试脚本,传统的开发流程如图1所示:
减少迭代的开发模式
这里先简单介绍一下我们的设想。
基本设想
为了缓解传统开发方式存在的迭代问题,实现快速地开发脚本,我们设想:
* 把脚本的编写与执行过程合一,一边编写脚本,一边执行脚本,那么脚本编写的结束就意味着脚本执行的成功。
* 在定位并修改脚本错误之后,允许从出错代码开始恢复执行脚本,就可以避免从头运行脚本带来的时间消耗。
* 当脚本执行发生错误时,能够立刻暂停执行脚本(而不退出)并保持出错现场,这对于我们迅速定位和修改错误将是十分有帮助的。
理论技术依据
我们能否用现有的技术来实现上述的设想呢?答案是肯定的。为了实现这些设想,我们可以借助的理论依据和技术有:
* 测试脚本的结构特点:自动化功能测试脚本具有线性的特点,脚本代码大多呈现为顺序结构(见图 2 的测试脚本)。脚本中很少出现选择或者循环结构的代码,即使脚本中出现非顺序结构的代码,其覆盖范围也是有限的。这种结构特点为分割脚本代码提供了可能。
* 测试步骤的可重复性:测试步骤主要描述对产品界面进行什么操作,操作引起的产品状态变化可以通过人工的方式进行回滚,因此,我们可以反复执行某些测试步骤,只需要在每次重复执行之前消除测试操作所造成的影响(例如数据、产品界面的变化)。
* 断点技术:在软件调试技术中,断点技术是最为常用的技术之一,通过在脚本中设置断点,我们能够在需要的地方暂停脚本的执行,以便检查脚本以及产品的状态(例如对象以及变量的内容,产品界面的变化等)。我们通过在调试状态下动态地设置断点,从而可以控制脚本的执行进度。
* 异常处理机制:Java 语言所提供的异常 (Exception) 机制用于捕获和处理程序发生的异常。我们同样可以使用异常机制捕获脚本中出现的错误和异常。通过在异常处理语句中设置断点,可以在脚本出错时,立刻捕获脚本错误并暂停执行脚本,同时也能够获得第一出错现场:产品界面,变量和对象的内容。
* 热交换错误修正功能:RFT 构建于 Eclispe 平台之上,而 Eclipse 提供了热交换错误修正(Hotswap Bug Fixing)的功能。它允许在调试会话过程中实时地更改源代码 , 而不必退出程序的执行状态,关于该功能的介绍参见参考资源 1。借助热交换错误修正功能,我们可以达到在执行状态下开发脚本的目的。