toppic
当前位置: 首页> 狗狗新闻> 【经验分享】流程类测试设计方法探索及实践

【经验分享】流程类测试设计方法探索及实践

2023-05-10 14:56:27

流程类测试设计方法探索及实践

证券期货业信息技术测试中心(大连) 孙秋景 苏均超

摘要:软件测试中经常要验证系统内部或多个系统之间的业务数据流转的正确性,以及在业务数据流转过程中相应功能的正确性。当涉及多角色的复杂流程,特别是流程中存在回路时软件测试变得越发困难。本文基于状态转换测试方法[1]进行研究、并对“状态转换树”生成算法提出改进建议,以达到可更好应用于流程测试的目的。

引言

软件测试过程中会涉及复杂的业务数据流转,在业务数据流转的过程中涉及角色、数据、状态变化、触发条件以及流程中是否存在回路等多种要素。这种情况下如何有效的覆盖所有业务流程以及相伴随的功能的正确性成为一个比较难以攻克的课题。


状态转换测试[1]是一种设计测试用例来覆盖流程状态转换的一种黑盒测试技术。1978年TSUN S. CHOW就提出状态转换的核心算法N-Switch,这个算法可以很好的解决由复杂的状态转换图生成状态转换树的问题,但同时也存在诸多操作难点和部分场景覆盖不够丰富的情况。本文针对N-Switch算法进行扩展研究与优化,使得测试设计人员可以依据被测系统的特点进行更灵活的选择,并确保更全面的覆盖。另外,本文提出“状态转换矩阵”的概念以更方便的生成流程类测试用例,可简化设计思路,提高设计效率。


一、状态转换测试方法概述

状态转换测试方法的核心思想是以业务流转中数据的不同状态为节点、各级数据转换为路径来画出状态转换图,并根据一定逻辑遍历路径,生成不包含回路的状态转换树,进而生成对应测试用例。


状态转换测试技术由如下三个步骤组成:① 绘制状态转换图;②生成状态转换树;③生成测试用例。


1、绘制状态转换图

首先依据被测系统的业务逻辑绘制各个状态以及状态之间的转换关系,即状态转换图。状态转换图中每个节点代表一个状态,连接两个节点的有向边代表状态转换,有向边上定义两节点间的如下要素:①引起状态转换的事件/数据;②状态转换后期望反映及输出[1]。下图为状态转换示意图。

图1状态转换图


状态转换图上用不同的图例标识状态、转换、开始状态、终结状态。每个状态转换图的起始状态都是必须且唯一的,当流程中存在多个处于起始状态的节点时我们需要虚拟出一个新节点作为开始节点,该节点指向多个原起始状态的节点。而终结状态则不需全部在状态转换图中绘出,当无有向边从某节点引出时,则认为该节点处于终结状态。


2、生成状态转换树

状态转换测试的核心是将状态转换图生成不包含循环的相应数目的状态转换树,以覆盖状态转换图中的所有状态、边及相应的状态转换序列。下面介绍状态转换树的经典生成算法N-Switch。首先介绍0-Switch的状态转换树的生成方法[2]:


1、将状态转换图的初始状态作为树的根,根为树的第一层。

2、对任意层上的节点从左到右新增有向边指向的另一节点为其子节点。

3、对每一新增节点做如下检查:

1)如果新增节点对应的状态为状态转换图的终结状态,则标识该节点为叶子节点。

2)如果新增节点是非终结节点状态,并且已经出现在状态转换树同级或上一级中,则同样标识该节点为叶子节点,不再对其新增节点。

图2 0-Switch状态转换树


图1中节点A为起始节点,其生成的0-Switch树见图2。图2中蓝色边框的节点状态并不是终结状态,但是由于C、B节点已经在其上级出现,D节点在同级出现因此不再添加子节点。


1-Switch为在0-switch基础上再增加一个层次:蓝色边框的C节点下增加D节点;D节点下增加E节点;B节点下增加C、D节点。N-Switch为在0-Switch的基础上增加N个层次。


3、生成测试用例

在覆盖设定深度的基础上,通过遍历路径的方式生成状态转树,便可以更快速、简便的生成测试用例:


第一步:从根节点到达“叶节点”的每一条完整的状态转换序列即为一条测试用例[1]。

第二步:根据业务流程需求,补充用例所必须的测试步骤、期望结果等信息,即可形成一条标准的测试用例。


二、状态转换测试方法改进

N-switch算法可以很好的解决由复杂的状态转换图生成状态转换树的问题,但同时也存在一些局限,如:①同一层级上若存在多个相同的节点,则左边的节点有绝对的优势继续遍历后续状态,使得生成的状态转换序列不够丰富;②该算法应用到对质量要求较为严格的系统中仍显不足,需要复杂的人工分析来指定“深度”。而这恰恰是流程类测试中普遍需要关注和解决的问题。


基于此,对现有状态转换树生成算法进行优化。为了后续描述方便,首先对表一名词进行解释。

表一:名词解释


1、同层级节点选取随机化

在上一章节状态转换树生成算法中,可以看出图2中第三层级上存在两个D节点,左边的记为D1,右边的记为D2。根据生成算法,D1继续增加子节点而D2则不再继续增加子节点。这样位于左边的D1节点的前驱序列得以继续增加深度遍历后续状态转换序列。当状态转换树的深度为0,且覆盖原则为仅仅覆盖两两状态转换时,在D1下新增节点与D2下新增节点并无区别。但是当要求覆盖多于两个状态转换时,上述算法生成的状态转换序列则不够丰富。


对此我们提出优化点一:将同层级节点的选取随机化。即对任意层级的节点新增子节点时,如果该层级上相同状态的节点有多个,则首先按等比例均摊原则计算每个节点下新增的子节点个数,然后从子节点集合中随机选取节点。


根据上述随机化原则,图2的0-Switch状态转换树可以随机生成为如下2种情况。这样当要求覆盖多于2个状态的转换序列时,上述算法生成的状态转换序列将更加丰富。

图3 0-Switch随机状态转换树


2、基于路径依赖的覆盖准则

现有状态转换测试方法在生成状态树时,N-Switch准则可以解决流程测试中复杂业务流转的问题,但是对于质量要求较高的系统仍显不足。具体分析如下:

图4 0-Switch状态转换树覆盖分析          

图5 新覆盖准则生成深度为0的状态转换树


仍以图2中0-switch状态转换树为例,我们对于蓝色边框的C节点没有继续添加子节点D,是基于一个假设:在路径A->B->C->D中状态C到D的转换等同于路径A->C->D上C到D的转换(如图4)。但是当C到D的转换与其所处的路径有关时,这种假设是不成立的,容易产生测试遗漏。如果我们基于N-Switch准则通过增加深度的方式去覆盖这种依赖于所处路径的状态转换,则需要人工分析给出需要增加的深度,即确定N。对于状态较多、层次较深、流转复杂的状态转换图,对每一个非终结状态节点去计算深度是十分复杂和耗时的。


对此我们提出优化点二:制定一个对业务流程覆盖度更高的准则,即除环路外不需要为节点指定“深度”。在新的覆盖准则下深度为0的状态转换树的非终结状态叶子节点判断条件为:如果新增节点是非终结节点状态,并且在相同的前驱路径序列下后续的状态转换曾经走过,则同样标识该节点为叶子节点,不再对其新增节点。


基于上述新的准则,图2中状态转换图在深度为0时可生成图5的状态转换树。图中标红色的子节点D不再添加。原因为在路径A->B->D->B上状态转换B到D已经覆盖,因此不需额外覆盖该回路。如果要求进一步试探系统在环路内的反复转换中是否存在缺陷,则可以增加深度来实现。深度为1则该路径为A->B->D->B->D,深度为2为A->B->D->B->D->E,深度为3时,不在该路径下添加新节点因为E已经为终结状态节点。综上分析,在路径全面覆盖的前提下,增加对于路径的深度设置,可以进一步保证覆盖范围与深度。


三、测试用例生成方法优化及实践

状态间的转换需要一个或多个动作/操作、操作角色/所需数据,以及状态转换后相应功能的期望行为等要素支撑。而这些要素是无法直观、清晰的体现在流程图中的,为了确保状态转换分析的完备性,避免遗漏,我们提出“状态转换矩阵”的概念。基于状态转换矩阵并结合状态转换树可以更容易生成业务流程类测试用例。后文将结合交易系统定单状态转换的实践进行详细的阐述。定单状态转换图如下。

图6 定单状态转换图


1、基于状态转换图抽取状态转换矩阵

现有状态转换测试中,状态转换图中除包含状态节点、状态间转换的边还包括引起状态转换的事件/数据以及状态转换后期望反映及输出。通过分析如果能清晰的标识两两状态转换之间的上述关系,则整个状态转换图也变得明了。基于此我们提出“状态转换矩阵”的概念以定义状态转换图中各条边的如下要素:


①动作:引起状态转换的相应操作描述;

②角色/数据:在状态转换过程中涉及的操作主体的角色及满足的数据要求;

③后续事件:状态转换到后相伴随的功能的校验等,可存在多个后续事件。


在图7定单状态转换矩阵A中A12..A1n,A21…An1定义了状态转换图中的所有状态,

Aij(i≠1, j≠1)定义了两两状态转换之间的上述要素。

图7 状态转换矩阵A-定单状态流转


2、基于状态转换矩阵及状态转换树生成测试用例

图8 状态转换树-定单状态流转


图8为基于图6-定单状态转换图生成的状态转换树,结合图7的“状态转换矩阵”,标红色边的状态转换序列可生成如下测试步骤:


Step1:已触发状态的定单,对手方下单(下单数量小于委托量)定单状态变为部分成交,资金持仓更新正确;

Step2:部分成交状态的定单,管理员登录下强平单(下单数量小于持仓量大于可平量),定单状态变为强平修改,资金持仓更新正确。

Step3:强平修改状态定单,对手方下单(下单数量等于委托量),定单状态变为完全成交,资金持仓更新正确;

基于上述步骤,再补充测试用例所需的其他要素即可形成一条标准的测试用例。


四、总结

本文对状态转换测试方法进行研究探索并对该方法进行改进,从而可以更好的应用于流程测试中。但是通过分析,随着覆盖强度的增加,用例的总数及每条用例覆盖的路径长度也随之增加。如何既有效的覆盖系统功能,又能减少不必要的状态流转值得进一步研究。


参考文献

[1]郑文强,周震漪,马均飞.软件测试基础教程[M].北京:清华大学出版社,2015:107-113.

[2]郑文强. 状态转换测试的灵魂N-Switch[EB/OL].http://www.51testing.com/html/04/n-234504.html


友情链接