论文部分内容阅读
【摘 要】软件参数的组合测试是发现参数组合问题的重要方法,但是参数组合测试面领着组合爆炸问题,对象交互测试可以确保对象的消息能够正确传送,基于正交阵列筛选测试用例可以有效的降低测试成本。文章在完全测试不可能的情况下,提供了一种特殊的筛选方法——正交阵列测试方法,筛选测试组件所有可能配置的子集,从而实现最少测试获得最高的覆盖率,从而降低测试成本。
【关键词】测试用例;交互测试;筛选;OATS
软件测试是保证软件质量,提高软件可靠性的关键,其目的是以最少的时间和人力查找出软件中潜伏的各种错误和缺陷。软件测试是软件工程的重要环节,也是整个软件成本的主要构成,在一些重要的领域内软件测试成本甚至占总成本的60%。面向对象的软件产品测试与面向结构的软件产品测试存在不同之处,它的测试过程一般包括模型测试、类测试(代替单元测试)、交互测试(代替综合测试)、系统(子系统)测试、接受测试和发布/自我测试。在面向对象的系统中,对象之间的交互提供了程序的主要结构。因而在面向对象的软件产品中许多错误是由不同的对象相互作用所引起的,对象组合是形成程序缺陷和漏洞的一个重要问题。为了尽可能地发现由于对象相互作用而形成的缺陷,必须进行不同的组合测试。但是对象组合测试面临着组合爆炸问题,测试用例的数目会随着对象个数增加而迅速增加。
一、面向对象交互测试与用例筛选
(1)面向对象。面向对象的软件是由若干对象组成的,通过这些对象的相互协作来解决某些问题。对象的交互和协作方法决定了程序能做什么,从而决定了这个程序执行的正确性。也许可信任的原始类实例可能不包含任何错误,但是如果那个实例的服务端被其他程序组件不正确的使用,那么这个程序也就包含了错误。因此,程序中对象的正确协作——即交互,对于程序的正确性是非常关键的。对象交互是对象(称为发生者对象,sender)对另一个对象(称为接受者对象,receiver)的请求,发生者对象请求接受者对象的一个操作。而接受者进行的所有处理工作就是完成这个请求。对象交互测试的重点是确保对象(这些对象的类以及被单独测试过)的消息能够正确进行。交互测试的执行可以使用潜入到应用程序中的交互对象,或者在独立的测试工具提供环境中,交互测试通过使用该环境中的对象相互交互而执行。基于交互的属性来划分非原始类,即根据这个非原始类与其他实例交互的程度把非原始类分为汇集类和协作类两种。汇集类是指维护与其他类实例之间的关联但从来不和那些实例交互的类。协作类指具有更广泛交互的一个或多个操作中使用其他的对象并将其作为他们实现中不可缺少的一部分的类。可以使用测试原始类的方法来测试汇集类。协作类测试的复杂性远远高于原始类和汇集类的测试,这是因为需要对与之相关联的每个类的一个或多个实例的基本交互进行测试,潜在的协作数目可能会迅速增大。(2)测试用例筛选算法。1997年Telcordia科技研究表明,假如一个软件系统由N个构件组成(或者N个因素决定),大部分的软件错误是由一个构件的错误所导致,或者由2个构件之间的交互错误导致的。基于这种理论,构造测试用例就需要涵盖每个因素所有的状态,并且涵盖每个因素之间的所有交互,这种测试理论叫做Pair-wise测试。因此,没有必要构造覆盖所有隐形的所有组合的测试用例集合。只需要构造每个因素的所有状态,覆盖任务两个因素所有状态的测试用例集合。构造一个最小的Pair-wise集合是个NP完全问题。构造Pair-wise测试用例的近似算法有很多种,比较成功的有Genichi Taguchi博士提出的构造正交序列方法,这种方法也叫Taguchi方法。
二、基于正交阵列测试系统的测试用例
1.正交阵列测试系统。正交阵列提供了一种特殊的筛选方法。这种方法通过定义一组交互对象的配对方式的组合,以尽可能限制测试配置的组合数目激增。由交互所产生的大多数错误归咎于双向交互。挑选某个样本的一种特定测试技术就是正交阵列测试系统(orthogonal array testing system,OATS)。正交陈列是一个数值矩阵,其中的每一列代表一个因素,即实验中的一个对象。在软件系统中它代表一个特定类的集合。每个变量都可以有一组特定的值,把它们称为对象的取值。在一个正交阵列中,将各个对象组合成配对方式,而这些对象不代表所有对象的取值的所有可能组合情况。假设有3个对象,A、B和C,每个对象都有三种不同的取值为1、2和3,那么这就有27种可能的组合情况,如果使用成对测试组合,即仅仅考虑这些组合情况:一个对象的取值仅出现两次,那么就只有表1所示的9种情况。OATS使用了一种平衡设计。一个对象的取值出现的次数和改对象的其他取值出现的次数完全相等。如果把表1的各行看做是测试用例,那么这些可能的27种测试中有18种是用不上的。
2.OATS算法描述。假设系统中有n个对象p1,p2,…,pn,每个对象取值分别有k1,k2,…,kn种可能,那么这n个参数的全排列有k1*k2*k3*…*kn种可能。第一步:确定所有的对象。发送端是一个对象,接收端是一个对象,还有一个与消息中的每一个对象相关联的对象,以及一个与每个类对象相关联的状态。这样共有六个对象:类A、类P、类C以及每个类相关联的状态对象。第二部:确定每个对象的取值。通过考虑可能值得集合来决定每个对象的取值范围:一个对象有一个层次,类集合的参数只有一个成员P;两个对象中至多有两个层次:发送端由两个成员A和B,P类集合中的一个类的最大状态数是3;三个对象至多有三个层次,接收端具有两个成员A和B,A类集合和C类集合中一个类的最大状态数是3。第三步:选择一个合适这个问题的标准正交阵列。给定所需的6个对象(每个对象至多有3个取值),得出一个叫做标准这列的预算阵列入表8。L18表示那个矩阵列出了1个包含两个取值的对象和7个包含了3个取值的对象。L18是适合这个问题的最小标准阵列。第四步:建立从每个对象到阵列中整数的映射,以便可以解释这个标准阵列。标准阵列的每一项都是整数值。
分析下面列表中的每个对象:(1)对于发送端的类集合来说,它有2个类:A和B,因此L18中的第一列可以用来代步这个数据(表2)。这里采用这样一种编码:阵列中的第一列的值1对应于类A,而值2对应于类B。(2)类A有两个状态,而类B有3个状态。如果出现不同的取值,可以使用等于或超过这个最大取值的一列。L18中的第2列有一个最大值3,这一值适合这种数据。对于第2列值得解释依赖于第1列的值。就第1列中的一個值2(类B)而言,将在第2列中表示类B的状态。如果第1列中的值是1,那么第2列就表示类A的状态。在表3中,类B的状态值是直接与这一列的整数值相对应的。由于类A只有2个状态,如果第1列中出现一个值1(类A),那么如何解释第2列中的哪个值?暂且就把它当做1或2来解释。(3)L18中的第3列表示仅有一个类P的取值,第3列中的任意一个值都代表P。(4)第4列表示P的状态,而P有2个状态(表5)。然而这一列有1、2和3这3个值。阵列值1对应于类P状态1,值2对应于类P的状态2,而值3将重复类P的状态2。(5)第5列表示类C的层次,类C的层次有3个成员,类直接对应于阵列中的整数值。表6表达了这个解释。(6)第6列表示了C、D和E这3个类的状态(参加表7),由于C只有2个状态,阵列值3将对应值2,对于类D和E来说,状态直接对应于阵列值。第五步:基于映射和表中的行构建测试用例。正交阵列中的每一行(参加表8)都指明了一个特定的测试用例。通过阵列中每一行的级别编号解码并还原成每个因素的各个独立列表,从而将正交陈列还原成测试用例。
OATS的用途之一就是能够改变被测试软件覆盖的完全程度。在大多数穷举测试不可能的情况下,当需要运行的测试多于现有资源所能运行的测试时使用OATS正交阵列测试系统,从可能但还没有编写的测试用例的总体中进行筛选确保每个类都被测试到某种程度。对于每个类来说,其信任级别都相同,测试用例的数目减至最少。
参 考 文 献
[1]郑人杰,殷人昆,陶永雷.实用软件工程(第2版)[M].北京:清华大学出版社,1997
[2]McGregor J D,Sykes D A. A Practical Guide to Testing Object-oriented Software[M].[s.1.]:Addison-Wesley.2001
[3]Hedayat A S,Slonae N J A,Stufken J.Orthogonal Arrays:Theory and Applications[M].[s.1.]:Springer-Verlag.1999
【关键词】测试用例;交互测试;筛选;OATS
软件测试是保证软件质量,提高软件可靠性的关键,其目的是以最少的时间和人力查找出软件中潜伏的各种错误和缺陷。软件测试是软件工程的重要环节,也是整个软件成本的主要构成,在一些重要的领域内软件测试成本甚至占总成本的60%。面向对象的软件产品测试与面向结构的软件产品测试存在不同之处,它的测试过程一般包括模型测试、类测试(代替单元测试)、交互测试(代替综合测试)、系统(子系统)测试、接受测试和发布/自我测试。在面向对象的系统中,对象之间的交互提供了程序的主要结构。因而在面向对象的软件产品中许多错误是由不同的对象相互作用所引起的,对象组合是形成程序缺陷和漏洞的一个重要问题。为了尽可能地发现由于对象相互作用而形成的缺陷,必须进行不同的组合测试。但是对象组合测试面临着组合爆炸问题,测试用例的数目会随着对象个数增加而迅速增加。
一、面向对象交互测试与用例筛选
(1)面向对象。面向对象的软件是由若干对象组成的,通过这些对象的相互协作来解决某些问题。对象的交互和协作方法决定了程序能做什么,从而决定了这个程序执行的正确性。也许可信任的原始类实例可能不包含任何错误,但是如果那个实例的服务端被其他程序组件不正确的使用,那么这个程序也就包含了错误。因此,程序中对象的正确协作——即交互,对于程序的正确性是非常关键的。对象交互是对象(称为发生者对象,sender)对另一个对象(称为接受者对象,receiver)的请求,发生者对象请求接受者对象的一个操作。而接受者进行的所有处理工作就是完成这个请求。对象交互测试的重点是确保对象(这些对象的类以及被单独测试过)的消息能够正确进行。交互测试的执行可以使用潜入到应用程序中的交互对象,或者在独立的测试工具提供环境中,交互测试通过使用该环境中的对象相互交互而执行。基于交互的属性来划分非原始类,即根据这个非原始类与其他实例交互的程度把非原始类分为汇集类和协作类两种。汇集类是指维护与其他类实例之间的关联但从来不和那些实例交互的类。协作类指具有更广泛交互的一个或多个操作中使用其他的对象并将其作为他们实现中不可缺少的一部分的类。可以使用测试原始类的方法来测试汇集类。协作类测试的复杂性远远高于原始类和汇集类的测试,这是因为需要对与之相关联的每个类的一个或多个实例的基本交互进行测试,潜在的协作数目可能会迅速增大。(2)测试用例筛选算法。1997年Telcordia科技研究表明,假如一个软件系统由N个构件组成(或者N个因素决定),大部分的软件错误是由一个构件的错误所导致,或者由2个构件之间的交互错误导致的。基于这种理论,构造测试用例就需要涵盖每个因素所有的状态,并且涵盖每个因素之间的所有交互,这种测试理论叫做Pair-wise测试。因此,没有必要构造覆盖所有隐形的所有组合的测试用例集合。只需要构造每个因素的所有状态,覆盖任务两个因素所有状态的测试用例集合。构造一个最小的Pair-wise集合是个NP完全问题。构造Pair-wise测试用例的近似算法有很多种,比较成功的有Genichi Taguchi博士提出的构造正交序列方法,这种方法也叫Taguchi方法。
二、基于正交阵列测试系统的测试用例
1.正交阵列测试系统。正交阵列提供了一种特殊的筛选方法。这种方法通过定义一组交互对象的配对方式的组合,以尽可能限制测试配置的组合数目激增。由交互所产生的大多数错误归咎于双向交互。挑选某个样本的一种特定测试技术就是正交阵列测试系统(orthogonal array testing system,OATS)。正交陈列是一个数值矩阵,其中的每一列代表一个因素,即实验中的一个对象。在软件系统中它代表一个特定类的集合。每个变量都可以有一组特定的值,把它们称为对象的取值。在一个正交阵列中,将各个对象组合成配对方式,而这些对象不代表所有对象的取值的所有可能组合情况。假设有3个对象,A、B和C,每个对象都有三种不同的取值为1、2和3,那么这就有27种可能的组合情况,如果使用成对测试组合,即仅仅考虑这些组合情况:一个对象的取值仅出现两次,那么就只有表1所示的9种情况。OATS使用了一种平衡设计。一个对象的取值出现的次数和改对象的其他取值出现的次数完全相等。如果把表1的各行看做是测试用例,那么这些可能的27种测试中有18种是用不上的。
2.OATS算法描述。假设系统中有n个对象p1,p2,…,pn,每个对象取值分别有k1,k2,…,kn种可能,那么这n个参数的全排列有k1*k2*k3*…*kn种可能。第一步:确定所有的对象。发送端是一个对象,接收端是一个对象,还有一个与消息中的每一个对象相关联的对象,以及一个与每个类对象相关联的状态。这样共有六个对象:类A、类P、类C以及每个类相关联的状态对象。第二部:确定每个对象的取值。通过考虑可能值得集合来决定每个对象的取值范围:一个对象有一个层次,类集合的参数只有一个成员P;两个对象中至多有两个层次:发送端由两个成员A和B,P类集合中的一个类的最大状态数是3;三个对象至多有三个层次,接收端具有两个成员A和B,A类集合和C类集合中一个类的最大状态数是3。第三步:选择一个合适这个问题的标准正交阵列。给定所需的6个对象(每个对象至多有3个取值),得出一个叫做标准这列的预算阵列入表8。L18表示那个矩阵列出了1个包含两个取值的对象和7个包含了3个取值的对象。L18是适合这个问题的最小标准阵列。第四步:建立从每个对象到阵列中整数的映射,以便可以解释这个标准阵列。标准阵列的每一项都是整数值。
分析下面列表中的每个对象:(1)对于发送端的类集合来说,它有2个类:A和B,因此L18中的第一列可以用来代步这个数据(表2)。这里采用这样一种编码:阵列中的第一列的值1对应于类A,而值2对应于类B。(2)类A有两个状态,而类B有3个状态。如果出现不同的取值,可以使用等于或超过这个最大取值的一列。L18中的第2列有一个最大值3,这一值适合这种数据。对于第2列值得解释依赖于第1列的值。就第1列中的一個值2(类B)而言,将在第2列中表示类B的状态。如果第1列中的值是1,那么第2列就表示类A的状态。在表3中,类B的状态值是直接与这一列的整数值相对应的。由于类A只有2个状态,如果第1列中出现一个值1(类A),那么如何解释第2列中的哪个值?暂且就把它当做1或2来解释。(3)L18中的第3列表示仅有一个类P的取值,第3列中的任意一个值都代表P。(4)第4列表示P的状态,而P有2个状态(表5)。然而这一列有1、2和3这3个值。阵列值1对应于类P状态1,值2对应于类P的状态2,而值3将重复类P的状态2。(5)第5列表示类C的层次,类C的层次有3个成员,类直接对应于阵列中的整数值。表6表达了这个解释。(6)第6列表示了C、D和E这3个类的状态(参加表7),由于C只有2个状态,阵列值3将对应值2,对于类D和E来说,状态直接对应于阵列值。第五步:基于映射和表中的行构建测试用例。正交阵列中的每一行(参加表8)都指明了一个特定的测试用例。通过阵列中每一行的级别编号解码并还原成每个因素的各个独立列表,从而将正交陈列还原成测试用例。
OATS的用途之一就是能够改变被测试软件覆盖的完全程度。在大多数穷举测试不可能的情况下,当需要运行的测试多于现有资源所能运行的测试时使用OATS正交阵列测试系统,从可能但还没有编写的测试用例的总体中进行筛选确保每个类都被测试到某种程度。对于每个类来说,其信任级别都相同,测试用例的数目减至最少。
参 考 文 献
[1]郑人杰,殷人昆,陶永雷.实用软件工程(第2版)[M].北京:清华大学出版社,1997
[2]McGregor J D,Sykes D A. A Practical Guide to Testing Object-oriented Software[M].[s.1.]:Addison-Wesley.2001
[3]Hedayat A S,Slonae N J A,Stufken J.Orthogonal Arrays:Theory and Applications[M].[s.1.]:Springer-Verlag.1999