基于UML状态图的软件系统测试用例生成方法
2015-07-18陈君耀祝义栾家伟
陈君耀 祝义 栾家伟
摘要:该文针对复杂软件系统测试用例自动生成问题,提出了一种根据软件设计模型直接生成测试用例的方法。首先,讨论了基于UML状态图生成测试用例的设计思路;然后给出了符合各种覆盖要求的测试用例生成方法;最后,利用Eclipse实现了整个系统。实验表明该系统能够根据用户要求生成不同类型的测试用例,从而降低了复杂软件系统测试用例的生成难度,并且从根本上提高了测试用例生成的有效性。
关键词:统一建模语言;状态图;测试用例。
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)12-0076-03
随着软件技术的迅猛发展,软件已经成为社会各个行业中不可缺少的一部分。如今软件的规模和复杂性日益提升,人们开始意识到保证软件质量可靠性的重要性。软件测试作为成为保证软件质量的关键性技术之一,同时也是软件开发过程中的一个重要环节,显得至关重要,其中设计并生成测试用例是软件测试的关键。而现在软件测试发展的趋势是基于模型的测试方法,尤其是基于UML模型的测试用例生成方法易于生成满足很高覆盖要求的测试用例, 并运用实例对其进行了验证。本文给出了一种基于UML状态图模型的软件系统测试用例生成方法,其目的是为了给软件开发的测试环节生成测试用例节省时间,以达到提高效益的目的。
1 系统的设计与实现
UML作为一种对软件系统进行规约、构造、可视化和文档化的语言,融合了Booch方法、OMT方法和OOSE方法的核心概念,取其精华,去其繁杂,形成一个统一的、公共的、具有广泛适用性的建模语言。UML也可以实现与java之间的代码的转换。而且Eclipse与My Eclipse都可以实现画UML的状态图。
1.1 需求分析
基于状态图的测试用例生成系统包括前台子系统和后台子系统。前台子系统包括初始状态、终止状态、注释节点、添加状态,状态之间的转换。后台子系统包括以下几个子模块:
语句覆盖:每个语句至少执行一次;
2)条件/判定覆盖:在每个语句至少执行一次基础上,每个判定的每个分支至少执行一次;
3)条件组合覆盖:每个判定表达式中的各种可能组合都至少执行一次;
4)路径覆盖:每条可能的路径都至少执行一次。
1.2 概要设计
系统流程图是一种概括性地描述物理系统的传统性工具,它的基本思想是用图形符号以黑盒子形式描绘组成系统的每个部件,系统流程图表达的是数据在系统各部件之间流动的情况,而不是对数据进行加工的处理的控制过程。本系统的系统流程如图1所示。
数据流图(DFD)是一种图形化技术,它描绘信息流和数据从输入移动到输出的过程所经受的变换,在数据流图中没有任何具体的物理部件,它只是描绘数据在软件中流动和被处理的逻辑过程。系统顶层数据流图如图2所示:
1.3 详细设计:
详细设计阶段的根本目标是确定应该怎样具体地实现系统的系统,详细设计阶段的任务还不是具体地编写程序,而是要设计出程序的“蓝图”,将根据这个蓝图写出实际的程序代码,因此,详细设计的结果基本上决定了最终的程序代码的质量。
本系统可分为前台子系统和后台子系统,其中,前台子系统主要实现画图功能,画图工具栏包括初始状态、终止状态、注释节点、添加状态,状态之间的装换等绘图元素,可以通过点击工具栏图标实现状态图的绘制。后台子系统功能分为语句覆盖、判定/条件覆盖、条件组合覆盖、路径覆盖的实现。具体设计方法如下所示:
1)语句覆盖要求选择足够多的测试数据,使得被测试程序中每个语句至少执行一次。该模块主要分为贪心算法模块和回溯模块,通过这两个模块的结合实现语句覆盖功能,并且扩展到其他类型的UML模型。
2)判定/条件覆盖要求选取足够的测试数据,使得判定表达式中的每个条件都取到各种可能的布尔型值,而且每个判定表达式整体也都取到各种可能的布尔型结果。该模块主要分为基于语句覆盖基础的路径处理模块和对选择结构单独处理的模块,依据两个模块的配合,实现判定/条件覆盖。
3)条件组合覆盖要求选择足够多的测试数据,使得每个判定表达式中的各种可能组合都至少执行一次;该模块分为基于路径覆盖的主要的路径处理提取模块和对条件组合处理模块以及两者相互选择的模块。通过这三个模块的有效通信,实现条件组合覆盖功能。
4)路径覆盖要求选择足够多的测试数据,每条可能的路径都至少执行一次。该模块主要是穷举法模块的路径处理和数据生成模块。通过路径处理模块调用数据生成模块,从而完成路径覆盖的测试用例生成。
1.4 编码实现
由于整个系统代码较多,在此仅选取语句覆盖进行举例。语句覆盖实现的思想是贪心法与回溯法相结合。利用对树进行遍历的思想,利用贪心算法对语句进行遍历,每个节点只能遍历一次。对于贪心算法遍历后存在的未遍历的结点利用回溯法遍历未遍历的结点的上下结点,优先选择未遍历的上下结点,最终形成语句。这种结合的算法保证了语句覆盖的完整性。其中的回溯函数的功能是解决因为状态图的聚合节点和分支节点照成的部分过程在单语句遍历时被遗漏的情况,如果有遗漏的过程,将会优先选择未被遍历的上下过程实现语句的生成,即实现回溯功能,从而保证语句覆盖的完整性。
语句覆盖主要代码如下:
public void SentenceCover(Swant s[],int n)
{
String eventpath[][]=new String[50][2];
String orgin = "start";//是用来遍历过程时存储下个过程的起始点的信息
String preorgin=orgin;
int rows=0;
int isrest;
int count=0;
int i;//循环变量
while(count { count++; for(i=0;i { if (s[i].start.equals(orgin)&&s[i].state==1)//寻找到下一个节点时进行操作 { s[i].state=0; if(s[i].start=="start")//当路径刚开始时 { eventpath[rows][0]=s[i].sevent+" ";//存储路径的事件 eventpath[rows][1]=s[i].start+"->"+s[i].end;//存储路径 } else { eventpath[rows][0]=eventpath[rows][0]+s[i].sevent+" ";//存储路径的事件 eventpath[rows][1]=eventpath[rows][1]+"->"+s[i].end;//存储路径 } if(s[i].end.equals("end"))//当下一个节点为结束节点时的操作 { orgin="start"; preorgin=orgin; count=0; rows++; break; } else //当下一个节点不是结束节点时的操作 { preorgin=orgin; orgin=s[i].end; } } else //不是下一节点时继续循环 continue; } } isrest=Isrest(s, n);//测试是否有剩余节点没有遍历 while(isrest!=-1||orgin!="start")//进行回溯或者填补完整路径 { BackTracking(s,n,eventpath,isrest,rows,orgin);//回溯函数 orgin="start"; rows++; isrest=Isrest(s, n); //System.out.println(isrest+" "+orgin); } for(i=0;i { System.out.println(eventpath[i][0]); System.out.println(eventpath[i][1]); } F f=new F(eventpath,rows,"语句覆盖"); } 状态图的语句覆盖示例如图4所示。 2 结束语 本文针对基于UML状态图的软件系统测试用例生成方法及工具研究进行了讨论。首先,讨论了基于UML状态图生成测试用例的设计思路;然后给出了符合各种覆盖要求的测试用例生成方法;最后,利用Eclipse实现了整个系统。实验表明该系统能够根据用户要求生成不同类型的测试用例,降低了复杂软件系统测试用例的生成难度,提高了系统测试用例生成的正确性和可靠性。 参考文献: [1] 李相国. Java实例精通[M]. 北京: 机械工业出版社, 2009: 3-36. [2] 明日科技. Java从入门到精通 [M]. 3版. 北京: 清华大学出版社, 2012. [3] 袁涛, 孙蕾蕾. 统一建模语言UML[M]. 北京: 清华大学出版社, 2009. [4] 张永常. Java程序设计实用教程[M]. 2版. 北京: 电子工业出版社, 2009: 78-276. [5] 张海藩. 软件工程导论[M]. 北京: 清华大学出版社, 1998.