陳君耀 祝義 欒家偉
摘要:該文針對復雜軟件系統(tǒng)測試用例自動生成問題,提出了一種根據(jù)軟件設計模型直接生成測試用例的方法。首先,討論了基于UML狀態(tài)圖生成測試用例的設計思路;然后給出了符合各種覆蓋要求的測試用例生成方法;最后,利用Eclipse實現(xiàn)了整個系統(tǒng)。實驗表明該系統(tǒng)能夠根據(jù)用戶要求生成不同類型的測試用例,從而降低了復雜軟件系統(tǒng)測試用例的生成難度,并且從根本上提高了測試用例生成的有效性。
關鍵詞:統(tǒng)一建模語言;狀態(tài)圖;測試用例。
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2015)12-0076-03
隨著軟件技術的迅猛發(fā)展,軟件已經(jīng)成為社會各個行業(yè)中不可缺少的一部分。如今軟件的規(guī)模和復雜性日益提升,人們開始意識到保證軟件質量可靠性的重要性。軟件測試作為成為保證軟件質量的關鍵性技術之一,同時也是軟件開發(fā)過程中的一個重要環(huán)節(jié),顯得至關重要,其中設計并生成測試用例是軟件測試的關鍵。而現(xiàn)在軟件測試發(fā)展的趨勢是基于模型的測試方法,尤其是基于UML模型的測試用例生成方法易于生成滿足很高覆蓋要求的測試用例, 并運用實例對其進行了驗證。本文給出了一種基于UML狀態(tài)圖模型的軟件系統(tǒng)測試用例生成方法,其目的是為了給軟件開發(fā)的測試環(huán)節(jié)生成測試用例節(jié)省時間,以達到提高效益的目的。
1 系統(tǒng)的設計與實現(xiàn)
UML作為一種對軟件系統(tǒng)進行規(guī)約、構造、可視化和文檔化的語言,融合了Booch方法、OMT方法和OOSE方法的核心概念,取其精華,去其繁雜,形成一個統(tǒng)一的、公共的、具有廣泛適用性的建模語言。UML也可以實現(xiàn)與java之間的代碼的轉換。而且Eclipse與My Eclipse都可以實現(xiàn)畫UML的狀態(tài)圖。
1.1 需求分析
基于狀態(tài)圖的測試用例生成系統(tǒng)包括前臺子系統(tǒng)和后臺子系統(tǒng)。前臺子系統(tǒng)包括初始狀態(tài)、終止狀態(tài)、注釋節(jié)點、添加狀態(tài),狀態(tài)之間的轉換。后臺子系統(tǒng)包括以下幾個子模塊:
語句覆蓋:每個語句至少執(zhí)行一次;
2)條件/判定覆蓋:在每個語句至少執(zhí)行一次基礎上,每個判定的每個分支至少執(zhí)行一次;
3)條件組合覆蓋:每個判定表達式中的各種可能組合都至少執(zhí)行一次;
4)路徑覆蓋:每條可能的路徑都至少執(zhí)行一次。
1.2 概要設計
系統(tǒng)流程圖是一種概括性地描述物理系統(tǒng)的傳統(tǒng)性工具,它的基本思想是用圖形符號以黑盒子形式描繪組成系統(tǒng)的每個部件,系統(tǒng)流程圖表達的是數(shù)據(jù)在系統(tǒng)各部件之間流動的情況,而不是對數(shù)據(jù)進行加工的處理的控制過程。本系統(tǒng)的系統(tǒng)流程如圖1所示。
數(shù)據(jù)流圖(DFD)是一種圖形化技術,它描繪信息流和數(shù)據(jù)從輸入移動到輸出的過程所經(jīng)受的變換,在數(shù)據(jù)流圖中沒有任何具體的物理部件,它只是描繪數(shù)據(jù)在軟件中流動和被處理的邏輯過程。系統(tǒng)頂層數(shù)據(jù)流圖如圖2所示:
1.3 詳細設計:
詳細設計階段的根本目標是確定應該怎樣具體地實現(xiàn)系統(tǒng)的系統(tǒng),詳細設計階段的任務還不是具體地編寫程序,而是要設計出程序的“藍圖”,將根據(jù)這個藍圖寫出實際的程序代碼,因此,詳細設計的結果基本上決定了最終的程序代碼的質量。
本系統(tǒng)可分為前臺子系統(tǒng)和后臺子系統(tǒng),其中,前臺子系統(tǒng)主要實現(xiàn)畫圖功能,畫圖工具欄包括初始狀態(tài)、終止狀態(tài)、注釋節(jié)點、添加狀態(tài),狀態(tài)之間的裝換等繪圖元素,可以通過點擊工具欄圖標實現(xiàn)狀態(tài)圖的繪制。后臺子系統(tǒng)功能分為語句覆蓋、判定/條件覆蓋、條件組合覆蓋、路徑覆蓋的實現(xiàn)。具體設計方法如下所示:
1)語句覆蓋要求選擇足夠多的測試數(shù)據(jù),使得被測試程序中每個語句至少執(zhí)行一次。該模塊主要分為貪心算法模塊和回溯模塊,通過這兩個模塊的結合實現(xiàn)語句覆蓋功能,并且擴展到其他類型的UML模型。
2)判定/條件覆蓋要求選取足夠的測試數(shù)據(jù),使得判定表達式中的每個條件都取到各種可能的布爾型值,而且每個判定表達式整體也都取到各種可能的布爾型結果。該模塊主要分為基于語句覆蓋基礎的路徑處理模塊和對選擇結構單獨處理的模塊,依據(jù)兩個模塊的配合,實現(xiàn)判定/條件覆蓋。
3)條件組合覆蓋要求選擇足夠多的測試數(shù)據(jù),使得每個判定表達式中的各種可能組合都至少執(zhí)行一次;該模塊分為基于路徑覆蓋的主要的路徑處理提取模塊和對條件組合處理模塊以及兩者相互選擇的模塊。通過這三個模塊的有效通信,實現(xiàn)條件組合覆蓋功能。
4)路徑覆蓋要求選擇足夠多的測試數(shù)據(jù),每條可能的路徑都至少執(zhí)行一次。該模塊主要是窮舉法模塊的路徑處理和數(shù)據(jù)生成模塊。通過路徑處理模塊調(diào)用數(shù)據(jù)生成模塊,從而完成路徑覆蓋的測試用例生成。
1.4 編碼實現(xiàn)
由于整個系統(tǒng)代碼較多,在此僅選取語句覆蓋進行舉例。語句覆蓋實現(xiàn)的思想是貪心法與回溯法相結合。利用對樹進行遍歷的思想,利用貪心算法對語句進行遍歷,每個節(jié)點只能遍歷一次。對于貪心算法遍歷后存在的未遍歷的結點利用回溯法遍歷未遍歷的結點的上下結點,優(yōu)先選擇未遍歷的上下結點,最終形成語句。這種結合的算法保證了語句覆蓋的完整性。其中的回溯函數(shù)的功能是解決因為狀態(tài)圖的聚合節(jié)點和分支節(jié)點照成的部分過程在單語句遍歷時被遺漏的情況,如果有遺漏的過程,將會優(yōu)先選擇未被遍歷的上下過程實現(xiàn)語句的生成,即實現(xiàn)回溯功能,從而保證語句覆蓋的完整性。
語句覆蓋主要代碼如下:
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;//循環(huán)變量
while(count { count++; for(i=0;i { if (s[i].start.equals(orgin)&&s[i].state==1)//尋找到下一個節(jié)點時進行操作 { 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"))//當下一個節(jié)點為結束節(jié)點時的操作 { orgin="start"; preorgin=orgin; count=0; rows++; break; } else //當下一個節(jié)點不是結束節(jié)點時的操作 { preorgin=orgin; orgin=s[i].end; } } else //不是下一節(jié)點時繼續(xù)循環(huán) continue; } } isrest=Isrest(s, n);//測試是否有剩余節(jié)點沒有遍歷 while(isrest!=-1||orgin!="start")//進行回溯或者填補完整路徑 { BackTracking(s,n,eventpath,isrest,rows,orgin);//回溯函數(shù) 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,"語句覆蓋"); } 狀態(tài)圖的語句覆蓋示例如圖4所示。 2 結束語 本文針對基于UML狀態(tài)圖的軟件系統(tǒng)測試用例生成方法及工具研究進行了討論。首先,討論了基于UML狀態(tài)圖生成測試用例的設計思路;然后給出了符合各種覆蓋要求的測試用例生成方法;最后,利用Eclipse實現(xiàn)了整個系統(tǒng)。實驗表明該系統(tǒng)能夠根據(jù)用戶要求生成不同類型的測試用例,降低了復雜軟件系統(tǒng)測試用例的生成難度,提高了系統(tǒng)測試用例生成的正確性和可靠性。 參考文獻: [1] 李相國. Java實例精通[M]. 北京: 機械工業(yè)出版社, 2009: 3-36. [2] 明日科技. Java從入門到精通 [M]. 3版. 北京: 清華大學出版社, 2012. [3] 袁濤, 孫蕾蕾. 統(tǒng)一建模語言UML[M]. 北京: 清華大學出版社, 2009. [4] 張永常. Java程序設計實用教程[M]. 2版. 北京: 電子工業(yè)出版社, 2009: 78-276. [5] 張海藩. 軟件工程導論[M]. 北京: 清華大學出版社, 1998.