为什么要进行类行为的测试分析
面向对象的开发相信很多人都非常清楚其基本的理念。而面向对象的测试,在实际测试工作中很少有人提及。在面向对象的测试中,可以大致分为算法、类、子系统、系统四个级别。除了白盒测试外,一般测试人员都在子系统或者系统级别进行测试,很少能够感受到面向对象与面向过程的测试区别——在测试过程中,采用基于业务的、基于处理过程的、基于事件的、基于场景的等的测试方法都适用于面向对象和面向过程的系统测试。而对于面向对象的测试中,对象和类的概念必然会对测试产生影响。而这一影响被很多人都忽略了。特别是类的行为,其封装性、消息传递、多态特性都是传统测试分析中遗漏的,造成潜在且难以发现的BUG。
为什么使用OOPN网
OOPN网是Petri网的发展。
在系统分析和设计时,状态图、时序图、类图等工具都是很好的描述系统的模型。而petri网在描述实际系统运行时的类之间的行为互动,特别是合适用于描述异步的、并发的过程。经典的Petri网是简单的过程模型,由两种节点:库所和变迁,有向弧,以及令牌组成的。
Petri网的详细介绍参考:Petri网
经过多年的发展,在基本的Petri网上,已经扩展出各种高级Petri网模型。将面向对象的思想和Petri网结合,就形成了面向对象的Petri网(Object Oriented Petri Net,OOPN)。本文讨论的是简化的OOPN网下,对类行为的测试分析的一个实例。
定义OOPN网
OOPN网有很多定义。本文对OOPN的定义如下:
定义:一个面向对象的Petri网是一个5元组,OOPN={P,T,C,G,F},其中
P={P11,P12……},是库所(表示状态)的有限集合,。
T={T11,T12……},是变迁(表示操作)的有限集合
C={gray,red,blue},是颜色的有限集合。
其中,gray:灰色表示同步路径;red:红色表示异步路径,blue:蓝色表示需要并发控制路径。
G={G11,G12……},是消息(调用服务)的有限集合。
F是P、T、G间的有向弧的集合。
业务背景
在一个支付业务中,支付的处理过程可以简要描述为:接收到卡信息,对卡信息进行验证。验证未通过,则提示卡信息错误。验证通过后,调用支付服务。收到支付结果后,更新订单状态。在这个过程中,主要有订单处理类OrderHandle,卡信息类CardInfo,支付服务类PayService,支付回调处理类PayCallBackHandle。
建立OOPN模型
注:G41属于订单类的服务,未列出。
测试分析
通过建立OOPN模型,很明确订单处理类、卡信息类、支付服务类之间的关系。特别是在订单处理类与支付服务类之间的异步路径、并发控制路径是测试的特别关注点。同时也明确了并发点来源是由于之前的异步路径造成的。并发控制路径的要点就是库所(状态)的变迁是唯一的。
用例生成算法
1 将OOPN模型中的变迁T取出,形成{输入库所,变迁,输出库所}的三元组。其中输入库所中,包含门G的,将门作为输入库所。输出库所中,包含门G的,将门作为输出库所。
2 归并所有的三元组。由于输出库所必然是其他三元组的输入库所,所以取输入库所不在输出库所集合中的,作为初始输入库所。将输出库所与输入库所的三元组首位相连,并将连接的三元组标记为已遍历。遇到输出库所作为多个输出库所的,采用深度遍历,直到完成一条路径后再返回走下一节点。若遇到并发控制路径,需要给予并发控制标记。直到输出库所为终态或为异步调用库所,则完成一条路径,加入测试路径集合
3 重复2的过程,当无法找到未遍历的三元组且输入库所不在输出库所集合中时,继续第4步。
4 将测试路径集合中,有相同并发控制标记的测试路径,取出添加到并发测试路径集中。
5 最终得到的测试路径集和并发测试路径集即为测试用例。
对于订单处理类与卡信息类交互的OOPN网,可以得到以下三元组:
(p11,t11,g21)
(g22,t12,p11)
(g23,t13,g31)
(g21,t21,p22)
(g21,t21,p23)
(p22,t22,g22)
(p23,t23,g23)
归并三元组得到测试路径:
(p11,t11,g21,t21,p22,t22,g22,t12,p11)
(p11,t11,g21,t21,p23,t23,g23,t13,g31)
对于支付处理类与支付服务类交互的OOPN网,可以得到以下三元组:
(g31,t31,p32)
(g31,t31,p33)
(p32,t32,g32)
(p33,t33,g33)
(g32,t41,p42)
(g33,t42,p43)
(p42,t43,g41)
(p43,t43,g41)
归并三元组得到2条测试路径:
(g31,t31,p32,t32,g32,t41,p42,t43,g41)
(g31,t31,p33,t33,g33,t42,p43,t43,g41)
得到并发控制测试路径:
(g31,t31,p32,t32,g32,t41*,p42*,t43*,g41*)
(g31,t31,p33,t33,g33,t42*,p43*,t43*,g41*)
*:表示并发控制标记
总结
使用OOPN进行测试分析考虑了对象之间的行为交互,体现了面向对象的封装、消息传递的特性,是能够覆盖到数据流、状态变迁、类之间的消息的同步和异步操作、并发控制的测试分析方法。