软件测试工具实际就是一种特殊的程序。通过设计的特殊程序模拟测试人员对计算机的操作过程、操作行为,或者类似于编译系统那样对计算机程序进行检查。
软件测试自动化实现的原理和方法主要有:对代码进行静态和动态分析、测试过程的录制和回放、测试脚本技术、自动比较和虚拟用户技术。
▶6.3.3.1 代码分析
代码分析类似于高级编译系统,一般针对不同的高级语言去构造分析工具。在工具中定义类、对象、函数、变量、运算等定义规则、语法规则;在分析时对代码进行语法扫描,找出不符合编码规范的地方;根据某种质量模型评价代码质量,生成系统的调用关系图等,为了更好地进行代码分析,可以在代码中设置一些“断点”,在这些断点和其他地方插入一些监测代码,存于构造的可执行文件中,随时了解这些关键点/关键时刻的某个变量的值、内存/堆栈状态等。
▶6.3.3.2 录制和回放
代码分析是一种白盒测试的自动化方法,录制(Record)和回放(Playback)则是一种黑盒测试的自动化方法。录制是将用户的每一步操作都记录下来。这种记录的方式是:把程序用户界面的像素坐标或程序显示对象(窗口、按钮、滚动条等)的位置,以及相对应的操作、状态变化或属性变化记录下来,然后将所有的记录转换为一种脚本语言所描述的过程,以模拟用户的操作。
回放时,将脚本语言所描述的过程转换为屏幕上的操作,然后将被测系统的输出记录下来同预先给定的标准结果比较以判断测试是否成功。通过这种方式,可以大大减轻测试的工作量,在迭代开发的过程中,能够很好地进行回归测试。
除了在功能测试中用“录制—回放”技术外,目前自动化负载测试解决方案几乎都要采用这种技术。负载测试中的“录制—回放”是先由手工完成一遍需要测试的流程,同时由计算机记录下这个流程期间客户端和服务器端之间的通信信息,这些信息通常是一些协议和数据,并形成特定的脚本程序。然后在系统的统一管理下同时生成多个虚拟用户,并运行该脚本,监控硬件和软件平台的性能,提供分析报告或相关资料。[3]这样,通过几台机器就可以模拟出成百上千的用户对应用系统进行负载能力的测试。
▶6.3.3.3 脚本技术
脚本(Script)作为一种特殊的计算机程序,包括数据和指令。指令作为控制信息来操作软件中的对象,数据则主要是被操作对象属性的值。脚本技术是围绕脚本程序结构而进行的设计,它可以实现测试用例所要求的输入、步骤和验证点,在创建脚本和维护脚本的两个不同成本中平衡,以获得测试自动化的最大收益。
脚本可以通过录制用户对被测试软件的操作产生,也可以直接用脚本语言编写脚本,测试脚本按照实现方式和技术可以分为线性脚本、结构化脚本、共享脚本、数据驱动脚本和关键字驱动脚本。
(1)线性脚本
线性脚本是录制手工执行的测试用例得到的脚本,这种脚本包含所有手工测试的操作步骤,如点击限标键、功能键、箭头、控制测试软件的控制键及输入数据等。如果只使用线性脚本技术,即录制每个测试用例的全部内容,相当于通过自动化测试工具去模拟手工测试步骤,则被录制的这些测试用例可以被完整地回放。然而实际情况往往是,由于测试环境的稍许改变甚至仅仅是程序界面的小小变动,会使整段测试脚本完全不能运行。因此线性脚本在实际应用中已经很少使用。
(2)结构化脚本
结构化脚本是比线性脚本更加灵活的一种脚本技术,它在线性脚本的基础上增加了一些相应的选择条件。结构化脚本类似于结构化程序设计,具有各种逻辑结构(顺序、分支、循环),而且具有函数调用功能,使得脚本变得结构化,这样不仅可以提高脚本的可复用性,而且可以增加脚本的功能和灵活性。在结构化脚本中,充分利用不同的结构控制语句,可以开发出易于维护的合理脚本,更好地支持自动化测试集的实现。
结构化脚本的主要优点是其健壮性比较好。由于引入了一些条件判断语句,可以很容易在脚本内加入一些错误处理功能,降低了脚本对被测系统的依赖性。同时,由于加入了循环结构,可以使脚本重复执行一些操作,使下一步的数据驱动脚本技术变得可能。结构化脚本的函数调用技术使得脚本可以成为一个模块被其他脚本调用。
结构化脚本的缺点是脚本更复杂,而且测试数据仍然“捆绑”在脚本中,使得测试修改和定制非常复杂困难。
(3)共享脚本
共享脚本意味着一个脚本可被多个测试用例使用,即脚本语言允许一个脚本调用另一个脚本,这样可以节省生成脚本的时间。当重复任务发生变化时,只需修改其中的某个脚本。共享脚本可以是在同一主机、同一系统之间共享脚本,也可以是在不同主机、不同系统之间共享脚本。共享脚本开发的思路是产生一个执行某个任务的脚本,不同的测试可能要重复这个任务,当要执行这个任务时只要在适当的地方调用这个脚本就可以了。
共享脚本使得实现类似的测试花费的开销较少,删除了明显的重复代码,使代码更加简洁易懂。但共享脚本的编写需要更高的编程技能,提高了对测试工程师的要求。(www.xing528.com)
(4)数据驱动脚本
数据驱动脚本是将测试输入和预期输出存储在独立的数据文件中,而不是与测试操作捆绑在一起放在测试脚本中。测试脚本中仅仅包含了一些与软件界面交互的操作信息,执行测试时,所需的数据直接从文件中读取,而不是从测试脚本中读取,这样就完成了测试数据和测试操作的分离。这种方法最大的好处是同一个脚本允许不同的测试。需要对数据进行修改时,也不必修改执行的脚本。
使用数据驱动脚本可以以较小的开销实现较多的测试用例,这可以通过为一个测试脚本指定不同的测试数据文件达到。将数据文件单独列出,选择合适的数据格式和形式,可将测试工程师的注意力集中到数据的维护和测试上,达到简化数据、减少出错概率的目的。数据驱动脚本技术给测试用例的数据输入和维护带来了极大的方便。
(5)关键字驱动脚本
关键字驱动技术是数据驱动技术的一种改进类型,数据驱动技术的限制是每个测试用例执行的步骤和操作都必须一样,测试的逻辑建立在脚本中而不是独立的数据文件中。而关键字驱动技术将测试的逻辑从脚本中剥离开来,它将测试逻辑按照关键字进行分解,形成数据文件,关键字对应封装的业务逻辑。主要关键字包括三类:被操作对象(Item)、操作(Operation)和值(Value),用面向对象形式可将其表现为Item.Operation(Value)。
关键字驱动脚本技术将被测试软件的业务逻辑从测试脚本中脱离出来,克服了数据驱动技术对业务无法灵活适应的缺点,实现了关键字驱动技术所带来的数据、业务和脚本三者的分离。关键字驱动脚本的数量不随测试用例的数量变化而仅随软件规模而增加。关键字驱动脚本技术可以极大地减少脚本的维护开销,加速自动化测试的实现,提高自动化测试的效率。
▶6.3.3.4 自动比较技术
测试验证是检验软件是否产生了正确输出的过程,是通过在测试的实际输出与预期输出(例如,当软件正确执行时的输出)之间完成一次或多次比较来实现的。进行自动化测试工作,自动比较就成为一个必需的环节,有计划地进行比较会比随意地比较有更高的效率和发现问题的能力。
在自动化测试中,预期输出是事先定义的。在测试过程中运行脚本,将捕获的结果和预期的输出进行比较,从而确定测试用例是否通过,这就需要自动比较技术。
自动比较的内容可以是多方面的,包括基于磁盘输出的比较;基于数据文件的比较;基于界面输出的比较;基于显示位图的比较;基于多媒体输出的比较,如对声音的比较;还包括其他输出的内容的比较。
比较可以是简单的比较,仅匹配实际输出与预期输出是否完全相同,这是自动化比较的基础。智能比较是允许用已知的差异来比较实际输出和预期输出。比如,要求比较包含日期信息的输出报表的内容。如果使用简单比较,显然是不行的,因为每次生成报表的日期信息肯定是不同的。这时就需要智能比较,忽略日期的差别,比较其他内容,甚至还可以忽略日期的具体内容,比较日期的格式,要求日期按特定格式输出。智能比较需要使用较为复杂的比较手段,包括正则表达式的搜索技术、屏蔽的搜索技术等。
▶6.3.3.5 虚拟用户技术
将业务流程转化为测试脚本,就是创建虚拟用户脚本或虚拟用户。创建虚拟用户时,将被测软件的业务流程从头至尾进行确认和记录,弄清每步操作的细节和时间,并能精确地转化为脚本。此过程类似制造一个能够模仿人的行为和动作的机器人的过程。这个步骤非常重要,在这里将现实世界中的单个用户行为比较精确地转化为计算机程序语言。虚拟用户通过驱动一个真正的客户程序来模拟真实用户。一般通过多进程或多线程来创建多个虚拟用户。
虚拟用户对于性能测试意义重大。一些负载测试工具可用较少的硬件资源模拟成千上万虚拟用户同时访问被测软件,并可模拟来自不同IP地址、不同浏览器类型以及不同网络连接方式的请求,同时可实时监视系统性能指标。
【注释】
[1]冯灵霞,邵开丽,张亚娟,刘寒冰编著.软件测试技术[M].西安:西安电子科技大学出版社,2017.
[2]林连进,谢怀民.软件测试技术[M].北京:北京理工大学出版社,2018.
[3]斛嘉乙,符永蔚,樊映川.软件测试技术指南[M].北京:机械工业出版社,2019.
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。