• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

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

发布: 2009-10-21 10:52 | 作者: 网络转载 | 来源: 网络转载 | 查看: 323次 | 进入软件测试论坛讨论

领测软件测试网

18. 乘除表达式结构如下:

其中标识为整型;因子1为指针,指向变量,常数或带括号的表达式;乘除操作符为指针,指向乘除操作符结构;因子2为指针,指向变量,常数或带括号的表达式.

3.2 自动生成器存储信息的基本数据结构

3.2.1 类信息表结构

1. 类信息表结点结构如下:

其中类名为字符型;父类表为指针,指向直接继承的父类信息表;类中变量表为指针,指向类中成员变量表结点结构;类中函数表为指针,指向类中成员函数表结点结构;下一结点为指针,指向下一个类信息表结点结构.

2. 类中成员变量表结点结构如下:

其中变量信息表为指针,指向变量信息表结构;下一结点为指针,指向下一个类中变量表结点结构.

3. 类中成员函数表结点结构如下:

其中函数信息表为指针,指向函数信息表结点结构;下一结点为指针,指向下一个类中成员函数表结点结构.

3.2.2 对象生存期表结构

1. 对象生存期表结点结构如下:

其中对象名为字符型;类表为指针,指向自己拷贝的类信息表结点结构;对象中变量表为指针,指向对象中成员变量表结点结构;对象中函数表指针,指向对象中成员函数表结点结构;下一结点为指针,指向下一个对象生存期表结点结构.

2. 对象中成员变量表结点结构如下:

其中变量信息表为指针,指向变量信息表结点结构;下一结点为指针,指向下一个对象中成员变量表结点结构.

3. 对象中成员函数表结点结构如下:

其中函数信息表为指针,指向函数信息表结点结构;下一结点为指针,指向下一个对象成员函数表结点结构.

3.2.3 变量信息表结构

变量信息表结点结构相对复杂,这主要是因为用它存储的信息较多.它可以用来存常数,一元运算操作符,算术操作符,变量的系数,输入变量表结点结构指针,函数信息表结点结构指针,以及指向自身结构即变量信息表结点结构的指针.其结构如下:

其中变量名为字符型;状态为整型,其值为0,1,2,3,分别表示该变量值为未知,已知,与循环有关,由输入变量决定;系数或常量,变量类型,输入变量表,函数信息表,变量信息表为一个联合体,这个联合体与操作符组成另一个联合体;操作符为字符型,存储一元算术运算符分,算术运算符及括号;系数或常量为整型;输入变量表为指针,指向输入变量表结点结构;函数信息表为指针,指向函数信息表结点结构;变量信息表为指针,指向变量信息表结点结构;下一结点为指针,指向下一个变量信息表结点结构.

3.2.4 函数信息表结构

函数信息表结点结构如下:

其中函数名为字符型;状态为整型,其值为0,1,2,3,分别表示该函数值为未知,已知,与循环有关,由输入变量决定;变量信息表为指针,指向变量信息表结点结构,用来存储函数参数信息;函数展开栈和变量信息表是一个联合;函数展开栈为指针,用来指向函数展开栈结点结构;变量信息表为指针,用来指向变量信息表结点结构;类信息表为指针,用来指向类信息表结点结构;下一结点为指针,指向下一个函数信息表结点结构.

3.2.5 输入变量表结构

输入变量表结点结构如下:

其中输入变量名为字符型;引用状态为整型,其值为0或1,表示在生成测试用例的时候在前面的判断中是否用到该变量;变量类型为整型,其值为0或1,表示其为实型或布尔型;变量值为整型,用来存储最终结果;下一结点为指针,指向下一个输入变量表结点结构.

3.3 计算条件表达式所用数据结构

3.3.1 操作符栈

操作符栈结构如下:

其中操作符数组为字符型数组;栈顶为整型,用来记录栈顶位置;栈底为整型,用来记录栈底位置.

3.3.2 操作变量栈

操作变量栈结构如下:

其中操作变量数组为整型数组;栈顶为整型,用来记录栈顶位置;栈底为整型,用来记录栈底位置.

操作符栈和操作数栈用来计算表达式的值.涉及到运算优先级问题,后面有详细说明.

3.4 嵌套函数展开所需的函数展开栈

函数展开栈结点结构如下:

其中函数名为字符型;对象名为字符型;变量值为指针,指向下一层函数的函数信息表;返回地址为指针,指向SOOL语法树中该函数的下一条语句;下一结点为指针,指向下一个函数展开栈结点结构.

3.5 路径二叉树

3.5.1 路径二叉树的结点结构

路径二叉树是测试用例生成器重要环节,条件表达式的化简,规范表达式梯度的形成以及测试用例的最终生成都离不开路径二叉树.因此,路径二叉树的结点结构要适于这些操作.路径二叉树结点结构如下:

其中访问状态标志位为整型,其值为0,1,表示在测试用例生成的时候该路径被访问与否;条件表达式为指针类型,指向条件表达式表结点结构,在这里存储的条件表达式为一个链表;梯度表达式为指针类型,指向梯度表达式表结点结构,在这里可以存储规范条件表达式的梯度值,对于非规范条件表达式指向NULL;左子树为指针类型,指向路径二叉树结点结构;右子树为指针类型,指向路径二叉树结点结构.

3.5.2 条件表达式表结点结构

条件表达式表结点结构:

其中状态位为整型,其作用有二,一个是标识一个变量是否展开为全部为输入变量表示的状态,另一个作用是标识一个条件表达式是否化简为最简状态,即对于大于关系,大于等于关系,小于关系,小于等于关系的条件表达式要化简成规范条件表达式,对于等于关系及不等于关系的条件表达式要化简成等号或不等号一边为乘积项代数和的形式,另一边为0;变量指针,运算及关系操作符和指数为一个联合体,变量指针为指针类型,指向变量信息表或输入变量表;运算及关系操作符为字符类型,用来存算术运算符,关系运算符和等号;指数为整型,用来在表达式化简以后存变量的幂次;下一结点为一个指针,指向下一个条件表达式表结点结构.

3.5.3 偏微分向量(即梯度)的存储结构

偏微分向量的存储结构即梯度表达式表的结点结构如下:

其中操作符,系数或常数及输入变量表和系数为一个联合体,操作符为字符类型,用来存算术运算符和关系运算符;系数或常数为整型,用来存梯度表达式中变量的系数或梯度表达式中的常量表达式;输入变量表及系数为联合体中的一个结构体,输入变量表为指针,指向输入变量表结点结构;指数为整型,用来存输入变量的幂次;下一结点为一个指针,指向下一个梯度表达式有结点结构.

第四章 条件组合覆盖及类覆盖的路径查找

4.1 条件组合覆盖,类覆盖及路径覆盖策略

表面看来,软件测试的目的与软件工程所有其它阶段的目的都相反.软件工程的其他阶段都是建设性的:软件工程师力图从抽象的概念出发,逐步设计出具体的软件系统,直到用一种适当的程序设计语言写出可以执行的程序代码.但是,在测试阶段测试人员努力设计出一系列测试方案,目的却是为了破坏已经建好的软件系统,竭力证明程序中有错误不能按照预定要求正确工作.当然,这种现象仅仅是表面的.暴露问题并不是软件测试的最终目的,发现问题是为了解决问题,测试阶段的根本目标是尽可能多地发现并排除软件中潜藏的错误,最终把一个高质量的软件系统交给用户使用.测试是为了发现程序中的错误而执行程序的过程.

测试任何产品都有两种方法:如果已经知道了产品应该具有的功能,可以通过测试来检验是否每个功能都能正常使用;如果知道产品内部工作过程,可以通过测试来检验产品内部动作是否按照说明书的规定正常进行.前一个方法称为黑盒测试,后一个方法称为白盒测试.对于软件测试而言,黑盒测试把程序看成一个黑盒子,完全不考虑程序的内部结构和处理过程.也就是说,黑盒测试是在程序接口进行的测试,它只是检查程序功能是否是能按照规格说明书的规定正常使用,程序是否是能适当地接入输入数据产生正确的输出信息,并且保持外部信息(如,数据库或文件)的完整性.黑盒测试又称为功能测试.与黑盒测试法相反,白盒测试法的前提是可以把程序看成装在一个透明的白盒子里,也就是完全了解程序的结构和处理过程.这种方法按照程序内部的逻辑测试程序,检验程序中的每条通路是否都能按预定要求正确工作.白盒测试又称为结构测试.

使用白盒测试法,为了做到穷尽测试,程序中每条可能的通路至少都应该执行一次,或者严格地说每条通路都应该在每种可能的输入数据下执行一次,即使测试很小的程序,通常也是不可能的.因此,软件测试不可能进行穷尽测试,也就不可能发现程序中的所有错误,也就是说通过测试并不能证明程序是正确的.我们测试的目的是要通过测试保证软件达到一定的可靠性.

设计测试方案是测试阶段的关键技术问题.所谓测试方案包括预定要测试的功能,应该输入的测试数据和预期的结果.其中最困难的问题是设计测试用的输入数据(即测试用例).不同的测试数据发现程序错误的能力差别很大,为了提高测试效率降低测试成本,应该选用高效的测试数据,选用少量最有效的测试数据,做到尽可能完备的测试.设计测试方案的基本目标是,确定一组最可能发现某个错误的测试数据.已经研究出许多设计测试数据的技术,这些技术各有优缺点,没有哪一种是最好的,更没有哪一种可以代替其余所有技术;同一种技术在不同的应用场合可能相差很大,因些,通常需要联合使用多种设计测试数据的技术.通常的做法是用黑盒设计基本的测试方案,再用白盒补充一些方案.

有选择地执行某些最有代表性的通路是对穷尽测试的唯一可行的替代办法.所谓逻辑覆盖的对一系列测试过程的总称,这组测试过程逐渐进行起来越完整的通路测试.测试数据执行(或叫覆盖)程序逻辑的程序可以化分成不同的等级.从覆盖源程序的详尽程序分析角度,大致有以下一些不同的覆盖标准:1. 语句覆盖:为了暴露程序中的错误,至少每个语句应该执行一次.语句覆盖对程序的逻辑覆盖很少,语句覆盖只关心判定表达式的值,而没有分别测试判定表达式中每个条件取不同的值的情况.语句覆盖是很弱的覆盖标准;2. 判定覆盖:判定覆盖又叫分支覆盖,它的含义是不仅每个语句必须至少执行一次,而且每个判定的每种可能结果都应该至少执行一次,也就是每个判定的每个分支都至少执行一次.判定覆盖比语句覆盖强,但是对程序逻辑的覆盖程度仍然不高;3. 条件覆盖:其含义是不仅每个语句至少执行一次,而且使判定表达式中的每个条件都取到各种可能的结果.条件覆盖通常比判定覆盖强,因为它使判定表达式中每个条件都取到了两个不同的结果,判定覆盖却只关心表达式的值;4. 判定/条件覆盖:既然判定覆盖不一定包含条件覆盖,条件覆盖也不一定包含判定覆盖,自然会提出一种同时满足这两种覆盖标准的逻辑覆盖,这就是判定/条件覆盖.它的含义是,选取足够多的测试数据,使得判定表达式中的每个条件都取到可能的值,而且每个判定表达式也都取到各种可能的结果.有时判定,条件覆盖也并不比条件覆盖更强;5. 条件组合覆盖:条件组合覆盖是更强的逻辑覆盖标准,它要求选取足够多的测试数据,使得每个判定表达式中条件的各种组合都至少出现一次.显然,满足条件组合标准的测试数据,也一定满足语句覆盖,判定覆盖,条件覆盖和判定/条件覆盖标准.因此,条件组合覆盖是前述几种覆盖标准最强的.但是,满足条件组合覆盖标准的测试数据并不一定使程序中的每个路径都执行到.

以上根据测试数据对源程序语句检测的详尽程序,简单讨论了几种逻辑覆盖标准,测试数据可以检测的程序路径的多少,也反映了对程序测试的详尽程序.从对路径的覆盖程度分析,能够提出下述一些主要的逻辑覆盖策略:1. 点覆盖:如果连通图G的子图G'是连通的,而且包含G的所有节点,则称G'是G的点覆盖.在正常情况下程序图是连通的有向图,图中每个节点相当于程序流程图的一个框(一个或多个语句).满足点覆盖策略要求选取足够多的测试数据,使得程序执行路径至少经过程序图中每个节点一次.显然,点覆盖策略和语句覆盖标准是相同的.2. 边覆盖:如果连通图G的子图G'连通的,而且包含G的所有边,则称G'是G的边覆盖.为了满足边覆盖的测试策略,要求选取足够多的测试数据,使得程序执行至少经过程序图中每条边一次.通常边覆盖和判定覆盖是一致的.3. 路径覆盖:路径覆盖的含义是,选取足够多的测试数据,使程序的每条可能路径都至少执行一次(如果程序中有环,则要求每个环至少经过一次).路径覆盖是相当强的逻辑覆盖标准,它保证程序中每条可能的路径都至少执行一次,因此这样的测试数据更具有代表性,暴露错误的能力也比较强.但是,为了做到路径覆盖中需考虑每个判定表达式的取值,并没有检验表达式中条件的各种组合情况.如果把路径覆盖和条件组合覆盖结合起来,可以设计出检错能力更强的测试用例.

类覆盖指的是覆盖类中的成员变量和成员函数,是一种面向对象语言的点覆盖策略.本文测试用例生成策略是把路径覆盖,条件组合覆盖策略结合起来,兼顾点覆盖策略.

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网