背景技术
SDL(Specification and Description Language)是CCITT制定的一种形式化的描述语言,它主要着眼于规定电信系统的行为,将一种信息准确的从一个人传递到另一个人,因此它在电信行业中应用相当广泛。SDL软件的测试是采用SDL语言进行产品开发中的重要组成部分,而SDL软件测试的重要任务是制定完整可靠的SDL软件测试用例。在申请号为99117118.7的中国专利中,SDL软件模拟测试方法能够使用的前提就是必须有测试用例,然后通过模拟测试方法把测试用例发送给被测试对象,即可进行SDL软件测试。SDL软件测试用例的生成方法通常采用手工制作,但是测试用例的制作由人工完成存在以下问题:
(1)不完整,由人工制定测试用例时,无法保证测试用例的完整性,尤其是复杂的SDL软件。
(2)生成效率低,由人工生成测试用例,过程复杂、费时费力,尤其是当测试用例数量由几百条上升到几千条乃至几万条、几百万条时,手工制作测试用例的方法就根本行不通。
(3)可靠性差,由于测试用例是手工制作,无法避免人为的错误。
(4)人工制作SDL软件测试用例,对测试人员的技术水平要求较高。
在现有技术中,国外已有类似的SDL软件测试用例生成方法的介绍,如法国Verilog公司的ObjectGEODE工具软件中有一种SDL软件测试用例的生成工具TESTCOMPOSER,它可以由SDL进程图、UML(Unified Modeling Language)描述以及MSC(Message Sequence Charts language)图生成SDL软件的测试用例。但是该方法存在以下缺点:
(1)生成测试用例必须具备多个条件,必须具有SDL进程图、UML描述及MSC描述。
(2)生成的SDL软件测试用例只能在ObjectGEODE工具软件中使用,而且只能用来测试由ObjectGEODE工具软件开发的SDL软件,不具有通用性,即用这种方法生成的测试用例不能用来测试通用的SDL软件。
由于SDL状态迁移图包含了SDL软件所需的全部输入消息以及SDL软件的所有输出消息,因此生成测试用例可以依据SDL状态迁移图所包含的信息。SDL状态迁移图在一些书中也称为状态概览图,其主要目的在于给出SDL软件进程中各个状态的概括描述以及它们之间可能有的一些跃迁,该图由状态符号、表示跃迁的有向弧、引起状态迁移的激发消息、状态迁移过程的输出消息以及可以任选的启动和停止符号等组成。图1所示为一个典型的SDL状态迁移图,这类图形有两个突出的特征:
(1)SDL状态迁移图的起始状态和终了状态有可能重合,如State0状态点
(2)SDL状态迁移图中的有些状态有自环绕弧。这类状态的一些有向弧的弧头和弧尾均连接到本状态,如State1状态点中的Signa1_In4、Signa1_In5,和State2状态点中的Signa1_In8、Signa1_In9、Signa1_In10。
由于SDL状态迁移图的这些特殊性,普通描述图的数据结构表示这类SDL状态迁移图都有一定的局限,使得计算机自动识别SDL状态迁移图比较困难,阻碍了SDL状态迁移图的自动化处理,也给计算机自动生成测试用例带来困难。对于这类SDL状态迁移图,现有技术中,还没有比较有效的分解简化方法。
又如图8所示的一个简单的SDL状态迁移图,这类图形虽然没有上述“首尾重合、自环绕连接”两个复杂的特征,可以用标准的计算机数据结构描述,但具有一个突出的特点:就是在某些状态之间会形成回路。它可能是两个状态间构成的回路,如图8中在State2和State3之间由有向弧S5和S6构成的一个回路;也可能是多个状态间构成的回路,如图8中State1、State3和State2之间由有向弧S3、S6和S4构成的一个回路。
制定测试用例时,为了保证搜索出从起始点到终了点的有向弧组合的所有可能路径,需要对SDL状态迁移图进行遍历。在计算机遍历这类简单的SDL状态迁移图的过程中又常常会因为上述SDL状态迁移图中存在回路,导致计算机对SDL状态迁移图进行遍历运算时出现死循环,同样阻碍了SDL状态迁移图的自动化处理,给计算机自动生成测试用例带来困难。
在“数据结构:C语言版/严蔚敏、吴伟民编著,北京:清华大学出版社,1996”一书中第167~169页对普通图形的遍历有详细的介绍。在普通图形计算机遍历过程中,给遍历过的状态点及有向弧作标志,表示该状态或有向弧已经遍历过,图形中的状态点及有向弧在整个遍历过程中只遍历一次,因此在普通的计算机图形遍历中不会出现回路引起的计算机死循环问题。SDL状态迁移图的遍历,和普通图形的遍历相比有自己的特征:它不仅要对所有的状态点和有向弧进行遍历,即经过所有的状态点、有向弧,而且还要对SDL状态迁移图起始点至终了点的所有路径进行遍历,即要搜索从起始点到终了点有向弧组合的所有可能路径。显然普通的计算机图形遍历处理方法不可能达到SDL状态迁移图遍历的目的——即实现对SDL状态迁移图起始点至终了点的所有路径的遍历。
因为SDL状态迁移图存在上述许多特殊的特点,导致在利用计算机自动生成测试用例时遇到很多困难,现有技术中,还没有比较有效的处理方法。
发明内容
本发明的第一个目的,是提供一种分解及简化SDL状态迁移图的方法,使之能用普通的数据结构表示,也就是将具有“首尾重合、自环绕连接”特征的SDL图等效分解为如图8所示的这类简单的SDL图。使得可以采用普通的数据结构来表示SDL状态迁移图,计算机自动处理SDL图就变得简单、可行。
本发明的第二个目的,是提供一种计算机遍历SDL状态迁移图过程中回路的处理方法,使之能够方便、简单地解决SDL状态迁移图的计算机遍历中回路引起的计算机死循环现象,使计算机自动处理SDL状态迁移图变得简单、可行。
本发明的第三个目的,就是提供一种使用上述两个方法由SDL软件的状态迁移图自动生成SDL软件测试用例的方法。这样就大大地提高了SDL软件测试用例生成的速度以及测试用例的完备性和可靠性。
为实现第一个发明目的,SDL图分解方法主要针对三种情况:
(1)对SDL状态迁移图中起始和终了状态重合的情况进行分解,使得SDL状态迁移图的起始状态点和终了状态点分离;方法如下:
起始状态点A有n条输入弧、m条输出弧与中间状态点连接,把起始状态点A分解为两个虚拟状态点A’和A”;m条有向弧由A’状态点指向中间状态点,n条有向弧由中间状态点指向A”状态点;即A’状态点只有m条输出弧,没有任何输入路径,而A”状态点只有n条输入弧,没有任何输出路径。
(2)对SDL状态迁移图中具有自环绕的状态点进行分解简化,使得整个SDL状态迁移图没有自环绕连接,方法如下:
B状态点有k条自环绕弧、n条输入弧、m条输出弧;把B状态点分解成两个虚拟点B’和B”,与该状态点B有关的n条输入弧均由虚拟节点B’进入,m条输出弧全部由虚拟节点B”输出,并以k+2条有向弧线连接这两个虚拟节点B’和B”,其中k+1方向是由B’指向B”,剩下1条方向是由B”指向B’。
(3)对SDL状态迁移图中起始和终了状态重合、且起始状态具有自环绕弧的状态点进行分解简化,方法如下:
起始状态点A有n条输入弧、m条输出弧与中间状态点连接,且有k条自环绕弧;把起始状态点A分解为两个虚拟状态点A’和A”;m条有向弧由A’状态点指向中间状态点,n条有向弧由中间状态点指向A”状态点;
同时,k条有向弧直接连接虚拟状态点A’和A”,方向均由虚拟状态点A’指向A”。
为实现第二个发明目的,计算机遍历SDL状态迁移图过程中回路处理方法包括以下步骤:
1、计算机遍历SDL状态迁移图中起始点至终了点的路径;在出现回路的路径末尾添加一个回路标志并终止计算机对当前路径的搜索;继续下一条路径的遍历;同时把计算机遍历得到的所有路径写入存储器中;直到SDL状态迁移图起始点至终了点间所有的路径都搜索完为止;
2、在存储器中查找回路标志所在的路径,找出回路标志之前的状态点C,把本路径的回路标志及状态点C从路径中删除;而后在存储器中查找状态点C到SDL状态迁移图终了点之间的任意一条路径,并将这一段路径追加到出现回路的路径中去;同样可以处理其它出现回路的路径。
为实现第三个发明目的,SDL软件测试用例自动生成方法,是通过计算机自动分析处理SDL软件的状态迁移图,来得到由输入消息和输出消息构成的完整的SDL软件的测试用例的。本发明方法的技术方案包括以下步骤:
(1)录入SDL软件的状态迁移图。采用图形编辑软件编辑SDL软件的状态迁移图,并以文本格式存储SDL软件的状态迁移图。
(2)对SDL软件的状态迁移图进行简化分解处理。对编辑完毕的SDL软件状态迁移图进行分解简化,主要是对SDL软件状态迁移图的起始状态和终了状态有重合情况的进行分解;对SDL软件状态迁移图中的状态有自环绕弧情况的进行简化。
(3)用数据结构表示SDL状态迁移图。采用一定格式的数据结构表示分解简化后的SDL软件状态迁移图。SDL图形表示格式的转换是为了使计算机能够对它进行自动遍历。
(4)计算机自动遍历经数据结构表示的SDL状态迁移图。利用计算机对SDL状态迁移图进行自动遍历,得到的遍历结果即为SDL软件的测试用例。
SDL状态迁移图经过本发明方法分解简化后,可以直接采用:邻接表、十字链表、邻接多重表等标准数据结构进行存储、描述以及计算机自动处理等。大大降低SDL状态迁移图用数据结构表示的难度。
SDL图经过上述分解后,使用本发明所述的回路处理方法,就可以直接采用计算机对SDL状态迁移图进行自动遍历,而不出现计算机死循环,实现SDL状态迁移图的自动化处理。这样就能由SDL软件的状态迁移图自动生成完整的、可靠的SDL软件测试用例,大大提高SDL软件的测试效率、测试的可靠性以及测试的完备性,大大降低测试过程对测试人员技术水平的依赖,并可大大降SDL软件的测试成本,此外还对推动SDL软件自动化测试技术的发展有重要意义。
具体实施方式
一、SDL状态迁移图分解方法
图1是一个比较典型的SDL状态迁移图。为了使计算机能够自动识别,本发明将这种具有“首尾重合、自环绕连接”特征的SDL图等效分解。
如图1中的State0状态点,即为SDL状态迁移图中起始和终了状态重合的状态点,它有5条输入弧Signa1_In6、Signa1_In19、Signa1_In17、Signa1 In16、Signa1_In21和4条输出弧Signa1_In1、Signa1_In2、Signa1_In3、Signa1_In20。为了更清楚地说明问题,如图2a,将图1中其他状态点归纳为中间状态点OtherStates;为了做到等效分解简化,把起始状态State0分解为两个虚拟状态点State0’和State0”,参见图2b;4条有向弧Signa1_In1、Signa1_In2、Signa1_In3、Signa1 In20由State0’状态点指向中间状态点OtherStates,5条有向弧Signa1_In6、Signa1_In19、Signa1_In17、Signa1_In16、Signa1_In21由中间状态点OtherStates指向State0”状态点;即虚拟State0’状态点只有4条输出弧,没有任何输入路径,而虚拟State0”状态点只有5条输入弧,没有任何输出路径。按照这个等效简化方法就把本来首尾相环的SDL状态迁移图(如图2a所示)分解为首尾分离的SDL状态迁移图(如图2b所示)。
如图1中的状态点State1和State2,分别有自环绕弧(注:自环绕弧有时也称自环绕通路)Signa1_In4、Signa1_In5和自环绕弧Signa1_In8、Signa1_In9、Signa1_In10。这两个有自环绕弧的状态点在没有简化前如图3a、4a所示。参见图3a,状态点State1有两条输入弧Signa1_In1和Signa1_In2、两条输出弧Signa1_In6和Signa1_In7、两条自环绕弧Signa1_In4和Signa1_In5。为了做到简单、等效地分解简化,将状态点State1分解成两个虚拟点State1’和State1”,如图3b;并且与该状态点有关的所有输入有向弧Signa1_In1、Signa1_In2均由虚拟节点State1’进入,输出弧Signa1_In6、Signa1_In7全部由虚拟节点State1”输出;并以2+2=4条有向弧线连接这两个虚拟节点,其中3条有向弧Signa1_In4、Signa1_In5、NULL1是由State1’指向State1”,剩下1条有向弧NULL2是由State1”指向State1’。这里增加2条有向弧NULL1和NULL2是为了保证状态迁移图分解简化的等效性,其中NULL1弧表示在迁移过程中迁移入State1状态点后,不经历任何自环绕通路就迁移出State1状态点的情况;NULL2弧表示经历自环绕通路后不迁移出State1状态点,即重新迁移到状态的情况。按照这个等效简化方法就把有自环绕弧的SDL状态迁移图(如图3a所示)分解为无自环绕弧的SDL状态迁移图(如图3b所示)。
同理,对图1中的State2状态点进行简化处理,State2状态点共有三条自环绕弧,如图4a所示,分解后由State2’和State2”两个虚拟节点以及五条有向弧构成,如图4b所示。
通过上述图2b、图3b、图4b的结果即可得到图1分解后的SDL状态迁移图,如图5所示。
有些SDL状态迁移图中,除了中间状态,起始状态和终了状态也有自环绕弧。如图6,起始和终了状态State0重合,且有自环绕弧Signa1_In1。分解图6所示的SDL状态迁移图,第一步分解重合的起始和终了状态State0,即分解State0状态为State0’和State0”,其过程可以用图7a和图7b来表示,这一步只涉及State0状态点的输入、输出弧,方法如上所述。第二步分解State0状态的自环绕弧Signa1_In1,以自环绕弧数量(此例为1)的有向弧直接连接虚拟状态点State0’和State0”,方向均由虚拟状态点State0’指向State0,分解后如图7c。
然后分解图6中含有自环绕弧的中间状态State1,即分解State1状态为State1’和State1”,分解后的State1状态图如图7d。
通过上述图7c、图7d的结果,得到图6分解后的SDL状态迁移图,如图7e所示。
实施本发明提供的SDL状态迁移图分解方法,可以有效地分解简化复杂的SDL状态迁移图。大大降低SDL状态迁移图用数据结构表示的难度,并为计算机自动处理SDL状态迁移图提供帮助。
二、计算机遍历SDL状态迁移图中回路处理方法
对于SDL状态迁移图出现回路的判断,普通方法是只要一条路径中某一状态点重复出现,则认为出现回路;本发明还提出了一种新的判据,即认为某一有向弧在同一条路径中重复出现时,则认为回路出现。两种判据引起的图形遍历结果有所差异,第一种判据,会遗漏一些SDL状态迁移图中有向弧之间的可能组合,而第二种判据则能填补第一种判据中的不足。在具体应用中采用哪一种回路判据,可视具体要求而定。如对SDL状态迁移图计算机遍历要求较高,则可采用第二种回路判据。
本实施例采用第二种回路判据。下面详述如图8所示SDL状态迁移图的计算机遍历过程,并相应处理计算机遍历中所遇到的回路。
第一步:计算机遍历由起始状态State0至终了状态点State4的所有可能路径,出现回路时,在路径的末尾添加回路标志NotEndFlag,并终止本路径的继续搜索(如何判断是否出现回路根据本发明提及的第二种判据进行判断);然后继续下一条路径的遍历。
如图8所示,计算机遍历从SDL状态迁移图起始点State0开始,并使用搜索指针指示当前的搜索状态点,经有向弧S1迁移至状态点State1,经历有向弧S3迁移至状态State3,再经历有向弧S7迁移至终了状态点State4。这样一条由起始点至终了点的路径就遍历完毕,同时把遍历得到的完整路径写入存储器中,进行保存。存储器主要指计算机内存器、计算机硬盘,或者外部存储器,如软盘等。
整条路径如下:
State0→S1→State1→S3→State3→S7→State4
一条路径搜索完后,搜索指针退回到状态点State3,继续寻找状态点State3的其他输出路径:经历有向弧S6迁移到状态点State2,再经历有向弧S5迁移到状态点State3,最后经历有向弧S7迁移至终了状态点State4。这样,另一条由起始点至终了点的路径又遍历完毕,同时把遍历得到的完整路径写入存储器中,进行保存。整条路径如下:
State0→S1→State1→S3→State3→S6→State2→S5→State3→S7→State4
搜索指针退回到状态点State3,继续寻找状态点State3的其他输出路径,将再次经历有向弧S6迁移到状态点State2,当前整条路径如下:
State0→S1→State1→S3→State3→S6→State2→S5→State3→S6→State2
此时路径中同一条有向弧S6出现两次,即出现回路(以第二种回路判据进行判断),为了防止继续搜索可能出现的计算机CPU运算死循环,在本路径末尾添加一个回路标志NotEndFlag(回路标志可以任意给定),并终止本条路径的继续搜索。那么此时整条路径为:
State0→S1→State1→S3→State3→S6→State2→S5→State3→S6→State2→NotEndFlag
由于出现了回路,搜索指针将退回到状态点State3,继续搜索状态点State3的其他路径,但状态点State3的所有输出有向弧均已遍历,故搜索指针退回到状态点State2,继续其他路径的搜索,在搜索过程中如有回路,以同样的方法添加标志并终止该路径的搜索。直到SDL状态迁移图起始点至终了点间所有的路径都搜索完为止。
如此搜索出所有的路径,其输出结果如下:
(1)State0→S1→State1→S3→State3→S7→State4
(2)State0→S1→State1→S3→State3→S6→State2→S5→State3→S7→State4
(3)State0→S1→State1→S3→State3→S6→State2→S5→State3→S6→State2→NotEndFlag
(4)State0→S1→State1→S3→State3→S6→State2→S4→State1→S3→State3→NotEndFlag
(5)State0→S2→State2→S4→State1→S3→State3→S7→State4
(6)State0→S2→State2→S4→State1→S3→State3→S6→State2→S5→State3→S7→State4
(7)State0→S2→State2→S4→State1→S3→State3→S6→State2→S5→State3→S6→State2→NotEndFlag
(8)State0→S2→State2→S4→State1→S3→State3→S6→State2→S4→State1→NotEndFlag
(9)State0→S2→State2→S5→State3→S7→State4
(10)State0→S2→State2→S5→State3→S6→State2→S5→State3→NotEndFlag
(11)State0→S2→State2→S5→State3→S6→State2→S4→State1→S3→State3→S7→State4
(12)State0→S2→State2→S5→State3→S6→State2→S4→State1→S3→State3→S6→State2→NotEndFlag
(13)State0→S2→State2→S5→State3→S6→State2→S5→State3→NotEndFlag
第二步,SDL状态迁移图计算机遍历完成后回路的续接处理。
SDL状态迁移图计算机遍历运算完成后,得到的结果是不完整的,其中有些路径可能包含有回路标志,因而必须对它进行相应的处理。续接处理操作是把第一步计算机CPU遍历运算生成的临时结果由存储器中读入到计算机内存中(如果存储器为计算机内存,则可直接对内存进行查找处理),在临时数据结果中可以查找有没有回路标志,如果没有则说明本SDL状态迁移图计算机遍历中没有出现回路;如果有回路标志,则说明SDL状态迁移图计算机遍历中出现过回路。由于出现回路的输出路径不是一条完整的由起始点至终了点的路径,因此必需进行路径续接处理。方法如下:
计算机CPU查看内存中的所有路径信息,得出路径(3)、(4)、(7)、(8)、(10)、(12)、(13)为有回路的路径。同时得出各条回路中回路标志之前的状态名分别为:State2、State3、State2、State1、State3、State2、State3,之后在以上存储结果中分别查找出由状态State1、State2、State3至SDL状态迁移图终了点即State4之间的路径,结果如下:
State1→State4为State1→S3→State3→S7→State4
State2→State4为State2→S5→State3→S7→State4
State3→State4为State3→S7→State4
然后由计算机CPU删除各条有回路标志路径中的回路标志及标志前的一个状态名,再把相应的后续路径添加到路径之后,最后形成完整的路径如下:
(1)State0→S1→State1→S3→State3→S7→State4
(2)State0→S1→State1→S3→State3→S6→State2→S5→State3→S7→State4
(3)State0→S1→State1→S3→State3→S6→State2→S5→State3→S6→State2→S5→State3→S7→State4
(4)State0→S1→State1→S3→State3→S6→State2→S4→State1→S3→State3→S7→State4
(5)State0→S2→State2→S4→State1→S3→State3→S7→State4
(6)State0→S2→State2→S4→State1→S3→State3→S6→State2→S5→State3→S7→State4
(7)State0→S2→State2→S4→State1→S3→State3→S6→State2→S5→State3→S6→State2→S5→State3→S7→State4
(8)State0→S2→State2→S4→State1→S3→State3→S6→State2→S4→State1→S3→State3→S7→State4
(9)State0→S2→State2→S5→State3→S7→State4
(10)State0→S2→State2→S5→State3→S6→State2→S5→State3→S7→State4
(11)State0→S2→State2→S5→State3→S6→State2→S4→State1→S3→State3→S7→State4
(12)State0→S2→State2→S5→State3→S6→State2→S4→State1→S3→State3→S6→State2→S5→State3→S7→State4
(13)State0→S2→State2→S5→State3→S6→State2→S5→State3→S7→State4
这样,以上路径都是完整的由起始点至终了点的全路径。得到的最终结果存入存储器。
本发明提供的计算机遍历回路处理方法并不局限于第二种回路判据,它也适用于第一种回路判据,是一种通用的SDL状态迁移图计算机遍历回路处理方法。
三、SDL软件测试用例自动生成方法
图9示出了利用本发明自动生成SDL软件测试用例的整个流程示意图。如图9所示,在进行了准备操作步骤101后;执行步骤102,利用图形编辑软件对SDL软件状态迁移图进行录入和编辑,并把SDL软件状态迁移图录入及编辑结果以文本格式存入存储器。
执行步骤103,由存储器中读入SDL软件状态图的数据,并进行分析判断;如果SDL软件状态迁移图的起始状态和终了状态有重合情况则进行的分解处理,如果SDL软件状态迁移图中的状态存在自环绕有向弧情况则进行简化处理。处理结果仍存入存储器。
执行步骤104,完成SDL软件状态迁移图的数据结构化转换,整个转换过程由计算机读入SDL图分解简化后的数据进行自动转换,转换所得结果存入存储器。
执行步骤105,计算机自动遍历用数据结构表示的SDL软件状态迁移图,对于遍历过程中由于SDL软件状态迁移图的回路引起的计算机遍历死循环问题,可通过插入回路标志方法解决。
步骤106,得到测试用例输出结果,测试用例存入存储器。
下面以一个简单的实施例具体说明上述过程。
图10所示为一个简单的SDL软件状态迁移图,其中包含了状态、有向弧、输入消息、输出消息。
图10经编辑模块编辑后得到如图11的文本格式数据。第一行表示状态State0有2条输出有向弧,第二行和第三行则表示这2条输出有向弧的描述内容,包含输出有向弧的编号(1)、有向弧的名称(Name1)、起始状态点名称(State0)、终了状态点的名称(State1)、输入消息名称(In_S1)、输出消息名称(Out_S1)。接下来是其他状态点State1、State2、State3、State4的内容信息。该数据存入存储器。
由于图10中的State3有自环绕有向弧,所以必须经过分解简化处理,即把状态State3分解为State3’和State3”两个虚拟状态点,经过分解简化处理后得到如图12所示的数据,存入存储器;对应的分解简化图如图13所示。
再把分解简化后的状态迁移图转换为用数据结构表示的SDL软件状态迁移图,数据结构化的SDL软件状态迁移图如图14所示。结果存入存储器。
最后用计算机对数据结构表示的SDL软件状态迁移图进行自动遍历,遍历过程中由于SDL图的回路引起的计算机死循环问题,可通过插入回路标志方法解决。遍历后即可得到期望的SDL软件测试用例,如图15和图16所示,其中图15为测试SDL软件时的输入测试消息,图16为测试SDL软件时的期望输出结果,由这两部分构成一套完整的测试用例。