小型面向对象语言程序测试用例自动生成技术

发表于:2009-10-21来源:作者:点击数: 标签:面向对象程序自动技术语言
小型面向对象语言程序 测试用例 自动生成技术 提要 程序测试是保证软件统和产品达到高 质量 和高 可靠性 的重要手段,它代表了对规约,设计和编码的最终审查. 本文使用信息流分析技术,对面向对象语言编写的程序自动生成测试用例.信息流分析技术又称程序流分析

小型面向对象语言程序测试用例自动生成技术  

提要

程序测试是保证软件统和产品达到高质量和高可靠性的重要手段,它代表了对规约,设计和编码的最终审查.

本文使用信息流分析技术,对面向对象语言编写的程序自动生成测试用例.信息流分析技术又称程序流分析技术,是一种静态分析技术,即在一个程序没有被实际运行之际,通过静态分析去发现它的一些运行行为方面的特性.信息流分析包括控制流分析和数据流分析两种,其中控制流分析侧重于对程序结构的分析,而数据流分析侧重于对变量控制结构下的定值,使用以及传播情况的分析.

本文属于基于代码的白盒测试.首先定义了一个面向对象语言Small Object-Oriented Language(SOOL),然后通过自己建造的词法和语法分析器对SOOL构造出语法树,接下来在语法树上进行数据流分析和控制流分析,利用部分求值技术和程序分析技术找到满足条件组合覆盖策略和类覆盖策略的执行路径,分析可能产生分支的语句,构造包含所有执行路径的路径二叉树,对路径二叉树上的条件表达式进行分类和化简整理,由规范条件表达式生成梯度表达式,最后根据梯度表达式生成测试用例.

目录

第一章 引言

1.1 程序测试技术

程序设计行家说:"任何程序,无论多么小,都有错误.如果小到了只能执行单一功能,这样的程序不会有任何意义,假如这样的程序存在,操作系统最终也会由于一个错识而失效.没有错误的程序是荒唐可笑的,是不可能存在的.假如存在没有任何错误的程序,那么世界也不复存在."①

无论怎样强调软件测试的重要性和它对软件可靠性的影响都不过分.在开发大型软件系统的漫长过程中,面对着极其错综复杂的问题,人的主观不可能完全符合客观现实,与工程密切相关的各类人员之间的通信和配合也不可能完美无缺,因此,在软件生命周期的每个阶段都不可避免地会产生差错.我们力求在每一个阶段结束之前通过严格的技术审查,尽可能早地发现并纠正差错;但是,经验表明审查并不能发现所有的差错,此外在编码过程中还不可避免地引入新的错误.如果的软件投入生产性运行之前,没有发现并纠正软件中的大部分差错,那么这些差错迟早会在生产过程中暴露出来,那时不仅改正这些错误的代价更高,而且往往会造成很恶劣的后果.测试的目的就是在软件投入生产性运行之前,尽可能多地发现软件中的错误.目前软件测试仍然是保证软件质量的关键步骤,它是对软件规格说明,设计和编码的最后复审.⑦

面向对象测试是面向对象技术的重要方面.随着面向对象开发方法和面向对象程序设计语言的广泛使用,用户采用对象技术开发的软件和产品也日益增多.测试是保证软件系统和产品达到高质量和高可靠性的重要方面,它代表了对规约,设计和编码的最终审查.有关面向对象测试研究也受到软件界的重视.

正如对于过程式程序设计语言,从过去几十年有时甚至是痛苦的经历中所认识到的,每一个进步都有其代价;就面向对象而言,导致更大灵活性,健壮性,一般性和高生产率的真实东西,也是要求测试的东西,如果不是更为困难,至少也更具挑战性.在过程式语言中,单元测试处于重要地位,而集成测试次之,但在面向对象语言中,这种相对重要性恰好相反.面向对象程序设计给测试者带来很多新的问题,这些问题是过程式语言中没有的.在这些问题中,多态,继承和动态绑定是最容易出问题的地方,而它们又是面向对象的核心.

本文主要针对继承,发消息机制对程序进行基于类覆盖策略的测试用例生成,生成的测试用例侧重于覆盖类中所有的数据成员及成员函数.

1.2 测试用例自动生成技术

软件测试是十分繁重困难的脑力劳动过程,测试工作量通常占软件开发总量的40%以上.为了既快又好地完成测试工作,开发自动测试工具是十分必要的.自动化的程度及其发挥的作用取决于测试目标,预算,软件过程,开发的应用类型以及开发环境和目标环境的细节.

下面介绍几种典型的应用:

1.2.1 测试数据生成程序

这种程序可以为测试某个系统而自动产生量的输入数据,但是它不能自动产生预期的输出,因此用途有限制.当必须测试某个系统在实际环境中的性能时,测试数据生成程序特别有用.例如,为了测试一个数据库管理系统,应该使用非常大的数据库,在这种情况下,可以使用测试数据生成程序,产生需要的大量数据.当能够形式地说明某个系统的输出数据的语法时,测试数据生成程序也很有用,因为在这种情况下可以写一个程序自动校核被测系统的输出结果.例如,在测试一个编译程序的语法分析功能时,如果输入语法正确的源程序,则编译程序的输出应该就是输入的程序,否则输出中还应该包含指示错误的信息.测试数据生成程序接受被编译的语言的语法说明,根据语法产生正确和错误的源程序作为测试数据.在这种情况下,它可以自动检验被测试的编译程序的输出.

1.2.2 动态分析程序

动态分析程序的主要功能是分析被测试程序中每个句的执行次数.它有两个基本部分:1,检测部分:它往往被分析的程序中插入检测语句,当程序执行时,这些语句收集和整理有关的每个语句执行次数的信息.2,显示部分:它汇集检测语句提供的信息,并以某种容易理解的形式印出这些信息.为了检测执行次数,应该找出所有判定语句和循环语句,并在每个循环和判定的开始处放置检测代码.不包含循环或分支的一串顺序语句,只需在它们的开始处放置检测代码.为了设置检测代码,需要了解这种语言的语法,所以在普通的编译程序中,增加检测功能是实现这种功能的一种方便途径,用户可以通过编译命信令选择使用这个功能.另一种途径是用预处理程序在被测试程序中插入高级语言,以便收集有关程序执行的信息.动态分析程序在软件测试中很有用,利用它可以发现测试过程中没有执行的语句,以便增加相应的测试数据.在调试过程中动态分析程序也能起到重要作用,利用它可以发现不按预定要求终止的笔循环,也可以发现不应执行而实际执行的代码,或者应该执行而实际上没有执行的代码.

1.2.3 静态分析程序

静态分析程序不需要执行测试的程序,它仅仅扫描被测试程序的正文,从中寻找可能导致错误的异常情况,例如,使用了一个尚未赋值的变量;赋了值的变量始终未被使用;实在参数和形参的类型或个数不符;永远执行不到的程序段;…….对于像FORTRAN这样的语言,因为在编译期间可以做的检查不多,所以静态分析程序很有用.DAVE,AUDIT和FACES等系统都是用于FORTRAN程序的典型静态分析程序.当然,静态分析程序并不仅限于FORTRAN程序,LINT系统就是为分析C程序开发的.因为LINT可以对C程序进行的静态检查的严格程度,相当于ALGOL68编译程序可以对ALGOL68源程序提供的检查的严格程度,所以它把一种严格类型语言的可靠性优点,与系统实现语言生成非常高效代码的能力结合起来.

1.2.4 文件比较程序

一般说来,测试过程需要检查的输出结果数量极大.这是一件非常单调乏味的工作,而且由于一时疏忽而漏过错误的输出.因此,检查测试结果的过程应该尽可能自动化.自动检查测试结果的过程主要由下述几步组成:1,建立一个文件存放预期的正确结果;2,执行测试,并把输出数据存在一个文件;3,使用文件比较程序来比较上述两个文件,印出两者之间的差异.

本文大体上属于第一种和第三种工具的结合,利用信息流分析技术,对程序进行静态分析,生成测试用例.

1.3 信息流分析技术

信息流分析技术又称程序流分析技术,是一种静态分析技术,即在一个程序没有被实际运行之际,通过静态分析去发现它的一些运行行为方面的特性.信息流分析包括控制流分析和数据流分析两种,其中控制流分析侧重于对程序结构的分析,而数据流分析侧重于对变量控制结构下的定值,使用以及传播情况的分析.二者相辅相承,不可分开.

信息流分析技术最早被用于编译优化,目前除编译优化外,在程序测试,程序理解,程序验证,程序调试以及程序分片等许多领域,信息流分析都有广泛的应用.

下面介绍几个信息流分析的应用:

1.3.1 编译优化

编译优化是信息流分析最早的应用领域.当程序设计发展到出现高级程序设计语言时,程序设计者不再关注那些依赖于具体机器的实现细节,用高级语言编写程序更为容易,程序的通用性和可读性大大增强.但是,用高级语言编写的程序的执行效率却大大不如用汇编语言编写的程序.这也正是因为它不依赖于具体机器的通用性阻碍了程序员利用某一机器的物理特性去编写更有效的代码.虽然如此,程序设计科学的发展方向仍然是应该朝着在更为抽象的层次上去设计程序,从而增强其通用性和可读性这一主要方向的.因此,要提高程序的执行效率,就必须从改进编译器入手,改进由编译器产生的目标程序的效率,进行编译优化.这里所说的优化并不是修补拙劣的程序,而是在合理的限内应用提高目标代码的效率.利用信息流分析技术,可以对程序进行优化.如常表达式的优化,公共了表达式的优化,无关代码移动,削减运算强度和寄存器的分配等.

1.3.2 程序测试

程序测试是软件开发的重要环节,程序静态信息流分析是程序测试所采用的一种主要手段.利用数据流分析可以找出数据流中的异常现象,如引用在前定值在后,重复定值以及只定值不使用等情况;利用控制流分析,可以确定测试路径,对于路径覆盖策略,点覆盖策略,条件组合策略,语句覆盖策略,具有有效的手段.

原文转自:http://www.ltesting.net