劉慰+應(yīng)新洋
摘 要: 自動化軟件測試技術(shù)因為其效率高,成本低的優(yōu)點,成為近年來軟件測試技術(shù)的重要研究方向和發(fā)展趨勢。文章提出并實現(xiàn)了一個測試用例自動生成與執(zhí)行系統(tǒng),能夠利用以遺傳算法為核心的測試數(shù)據(jù)生成方法,自動生成測試數(shù)據(jù)及XML測試用例文件,自動執(zhí)行測試用例并以XML的格式記錄測試結(jié)果。
關(guān)鍵詞: 自動化測試; 遺傳算法; XML; 自動生成; 自動執(zhí)行
中圖分類號:TP311.5 文獻(xiàn)標(biāo)志碼:A 文章編號:1006-8228(2018)02-67-04
Abstract: Because of its high efficiency and low cost, automated software testing technology has become an important research direction and development trend of software testing technology in recent years. This paper presents and implements a test case automatic generation and execution system, by using the genetic algorithm as the core test data generation method, it can automatically generate test data and the XML styled test case file, and automatically executes the test case and records the test results with XML format.
Key words: automatic testing; genetic algorithm; XML; automatic generation; automatic execution
0 引言
軟件測試是保證軟件質(zhì)量的重要手段。傳統(tǒng)的人工測試存在著成本高,效率低的缺點,所以自動化測試技術(shù)就成為近年來軟件測試技術(shù)的重要研究方向與發(fā)展趨勢。自動化測試技術(shù)能夠有效提高測試的質(zhì)量與效率,降低測試成本。
目前,自動化測試技術(shù)的研究方向主要包括測試數(shù)據(jù)的自動生成與測試用例自動執(zhí)行兩個方面,但將這兩者結(jié)合的研究還較少。
本文提出并實現(xiàn)了一個測試用例自動生成與執(zhí)行系統(tǒng),能夠利用以遺傳算法為核心的測試數(shù)據(jù)生成方法自動生成測試數(shù)據(jù),然后生成基于XML(Extensible Markup Language)的測試用例文件,之后自動執(zhí)行測試用例并以XML的格式記錄測試結(jié)果。
1 系統(tǒng)總體設(shè)計
本系統(tǒng)使用C#語言實現(xiàn),采用XML描述與存儲測試過程中所需的各種數(shù)據(jù),如測試配置、測試用例與測試結(jié)果。系統(tǒng)分為程序主界面、測試配置處理、測試數(shù)據(jù)自動生成,測試用例處理,測試用例自動執(zhí)行這五個模塊,系統(tǒng)數(shù)據(jù)流如圖1所示。
2 自動生成測試數(shù)據(jù)
測試數(shù)據(jù)自動生成模塊是系統(tǒng)的核心模塊,能自動搜索并獲取一組測試數(shù)據(jù),實現(xiàn)對被測函數(shù)的路徑覆蓋測試與邊界值測試。使用隨機法[1]自動生成測試數(shù)據(jù)時間成本很低,但效率低下,很難搜索到特殊的測試數(shù)據(jù),如三角形分類函數(shù)測試中三條邊相等,或日期計算函數(shù)測試中輸入日期為2000年2月29日的情況。近年來,不少研究者將遺傳算法引入了測試數(shù)據(jù)生成領(lǐng)域,并取得了良好的效果,如Jones B.F.[2]的實驗表明,針對三角形分類函數(shù),遺傳算法生成的測試數(shù)據(jù)數(shù),要比隨機法小1~2個數(shù)量級。史亮[3]在博士論文中也對使用遺傳算法的測試數(shù)據(jù)自動生成技術(shù)進(jìn)行了研究?;谶z傳算法收斂速度快、易于操作的優(yōu)點,本系統(tǒng)將其作為測試數(shù)據(jù)自動生成方法的核心算法,并在此基礎(chǔ)上利用邊界值法生成一組測試數(shù)據(jù)作為補充。
2.1 使用遺傳算法生成實現(xiàn)路徑覆蓋的測試數(shù)據(jù)
遺傳算法(Genetic Algorithm)通過借鑒生物界中的自然選擇和自然遺傳機制,把可能的解編碼為一個向量(即染色體),并將若干個染色組成一個種群,模擬種群通過選擇、交叉及變異等機制進(jìn)行進(jìn)化的過程。該種群在每次迭代中都保留一組適應(yīng)度高的候選個體,通過若干代進(jìn)化之后,理想情況下其適應(yīng)度達(dá)到近似最優(yōu)的狀態(tài)。
2.1.1 選擇操作
選擇操作模擬了生物界優(yōu)勝劣汰的自然選擇現(xiàn)象,作用是從種群中選擇出一些染色體作為父本進(jìn)行遺傳操作,從而決定種群中哪些染色體的基因?qū)⒈贿z傳給子代。選擇的方法有輪盤賭法、精英法、混合法等。本系統(tǒng)同時提供了這3種方法,具體算法如下:
⑴ 輪盤賭法:其基本思想就是染色體被選中的概率與其適應(yīng)度的大小成正比,具體步驟為:①計算每個染色體的適應(yīng)度;②計算所有染色體適應(yīng)度之和;③計算每個染色體的選擇概率(即當(dāng)前染色體適應(yīng)度/所有染色體適應(yīng)度之和);④計算所有染色體的累積選擇概率(即第一個染色體到當(dāng)前染色體的選擇概率之和);⑤隨機生成一個[0,1]之間的數(shù)r,若r在染色體Ci的累積選擇概率區(qū)間內(nèi),則將該染色體加入優(yōu)勝染色體集合中;⑥重復(fù)步驟;⑤M次(M為種群中的染色體個數(shù))。
⑵ 精英法:其基本思想就是選取適應(yīng)度最高的一批染色體,具體步驟為:①將所有染色體按適應(yīng)度從高到低排列;②將前N個染色體加入優(yōu)勝染色體集合中。選取個數(shù)N=種群染色體總數(shù)×預(yù)設(shè)的存活率。
⑶ 混合法:結(jié)合了輪盤賭法與精英法思想。具體步驟為:①按照精英法,選取N個染色體;②剩余染色體按照輪盤賭法進(jìn)行選擇。
2.1.2 交叉操作
交叉操作模擬了生物界中的基因重組。交叉操作分為單點交叉法與多點交叉法。本系統(tǒng)采用單點交叉法,步驟如下:endprint
⑴ 在種群中隨機選擇兩個染色體,作為新一代染色體的父母;
⑵ 隨機生成一個范圍在[1,L-1]之間的整數(shù),作為交叉位置,其中L為染色體長度;
⑶ 父染色體與母染色體從交叉位置起,互換基因,得到新的子代染色體;
⑷ 重復(fù)步驟⑴M次,M為需要產(chǎn)生的子代染色體個數(shù)。
2.1.3 變異操作
變異操作以一定的概率改變?nèi)旧w中的某些基因,并產(chǎn)生新的染色體,以提供逃脫局部最小值的手段。本系統(tǒng)中,種群中染色體的變異概率可以由用戶設(shè)置(默認(rèn)為30%),若該染色體發(fā)生變異,則隨機抽取某位基因,并將該基因上的等位基因取反,即:從0變?yōu)?,或從1變?yōu)?。
2.1.4 使用遺傳算法生成實現(xiàn)路徑覆蓋的測試數(shù)據(jù)的具體步驟
系統(tǒng)利用遺傳算法生成實現(xiàn)路徑覆蓋測試的測試數(shù)據(jù)的具體步驟如下:
⑴ 對被測函數(shù)進(jìn)行插樁操作,即在保持原有邏輯結(jié)構(gòu)的基礎(chǔ)上在被測程序中加入檢查語句,使其能夠在測試時輸出程序執(zhí)行路徑;
⑵ 從用戶事先輸入的期望路徑集中選取本次搜索要覆蓋的期望路徑;
⑶ 根據(jù)預(yù)設(shè)的種群數(shù)量、染色體長度、選擇策略、變異率、存活率、隨機選擇率等參數(shù),隨機生成初始種群;
⑷ 選取當(dāng)前種群中適應(yīng)度最高的染色體,根據(jù)二進(jìn)制編碼[4]方式進(jìn)行解碼,解碼公式為,并將解碼后的值作為被測函數(shù)的輸入數(shù)據(jù),得到程序執(zhí)行路徑。系統(tǒng)提供了路徑匹配法與節(jié)點匹配法這兩種適應(yīng)度計算方法,由用戶根據(jù)被測函數(shù)具體情況進(jìn)行選擇。其中路徑匹配法得到的適應(yīng)度為程序執(zhí)行路徑與期望路徑的最長子串長度,節(jié)點匹配法得到的適應(yīng)度為程序執(zhí)行路徑與期望路徑中相同的節(jié)點個數(shù);
⑸ 若程序執(zhí)行路徑與期望路徑一致,則將測試數(shù)據(jù)加入測試數(shù)據(jù)集,停止進(jìn)化,回到步驟⑵;否則對種群進(jìn)行選擇、交叉與變異操作,并回到步驟⑷。其中的選擇操作可以是輪盤賭法、精英法或是混合法,由用戶根據(jù)數(shù)據(jù)搜索效率進(jìn)行選擇。
2.2 利用邊界值法生成實現(xiàn)邊界值測試的測試數(shù)據(jù)集
路徑覆蓋法只能對程序的邏輯結(jié)構(gòu)進(jìn)行測試,而不能有效地測試程序?qū)τ跀?shù)據(jù)邊界的處理是否正確,所以本系統(tǒng)使用邊界值法生成一組測試數(shù)據(jù)對其進(jìn)行補充,其基本思想是選取來自等價類的邊界的值,通常選取略小于最小值、最小值、略高于最小值、正常值、略低于最大值、最大值、略大于最大值這7個值。若輸入數(shù)據(jù)取值范圍為,則測試數(shù)據(jù)集(數(shù)據(jù)類型為整型,則μ=1,否則μ=0.1。若存在多個輸入數(shù)據(jù),則在一個測試用例中只有一個輸入數(shù)據(jù)能取邊界值,其余輸入數(shù)據(jù)都必須取正常值,以便在程序未通過測試時分析導(dǎo)致錯誤的原因。系統(tǒng)通過遍歷所有被測函數(shù)參數(shù)的上下界,并取得全部邊界值與正常值的組合,作為測試數(shù)據(jù)加入測試數(shù)據(jù)集中。
3 生成基于XML的測試用例文件
在得到測試數(shù)據(jù)集后,需要將測試數(shù)據(jù)轉(zhuǎn)換為計算機能夠自動執(zhí)行的測試用例。傳統(tǒng)的測試用例存儲方式,如Word或Excel文檔等,存在描述不規(guī)范,文件較大,不便于計算機自動處理等缺點。芮素娟[5]對基于XML的測試用例復(fù)用技術(shù)進(jìn)行了研究,表明XML具有層次化、擴展性好、輕量,能夠進(jìn)行數(shù)據(jù)有效性驗證、便于計算機處理等優(yōu)點。本系統(tǒng)采用XML來存儲測試用例與測試結(jié)果。
測試用例處理模塊利用.NET Framework中提供的XDocument類,將內(nèi)存中的測試套件對象(TestSuite)序列化為XML文件,每個測試套件元素中都包含測試套件名稱、被測函數(shù)名稱與一組測試用例子元素(TestCase);每個測試用例元素又包含一組測試斷言(Assertion)子元素;每個測試斷言元素中又包含一組輸入數(shù)據(jù)、期望結(jié)果、實際結(jié)果與測試結(jié)果。使用XSD(XML Schema Definition)表示的測試用例文件結(jié)構(gòu)如圖2所示。
4 執(zhí)行測試用例并記錄測試結(jié)果
測試用例處理模塊生成測試用例文件后,需要用戶編輯該文件并在每個測試斷言的ExpectedOutput標(biāo)簽之間輸入該條測試數(shù)據(jù)對應(yīng)的期望結(jié)果。在用戶指定要執(zhí)行的測試用例文件后,測試用例自動執(zhí)行模塊會將其反序列化為一個TestSuite對象,然后遍歷其中的所有的測試斷言,獲取測試數(shù)據(jù),并調(diào)用被測函數(shù)得到實際輸出結(jié)果,并與斷言中的期望結(jié)果作比較,若一致,則將測試結(jié)果記為“Passed”,否則記為“Failed”。所有測試完成后,統(tǒng)計測試用例總數(shù)、通過數(shù)與未通過數(shù),并記錄到測試用例文件中。測試用例文件結(jié)構(gòu)如圖3所示。
5 結(jié)束語
本系統(tǒng)能夠通過遺傳算法高效地獲取實現(xiàn)路徑覆蓋的測試數(shù)據(jù),尤其是在輸入數(shù)據(jù)取值范圍很大的情況下,能夠搜索到使用隨機法很難搜索到的測試數(shù)據(jù),且搜索速度有較大提高。在此基礎(chǔ)上,還能通過邊界值法生成一組補充測試數(shù)據(jù),進(jìn)一步提高測試的質(zhì)量。除此之外,系統(tǒng)利用XML描述并存儲測試用例與測試結(jié)果,提高了程序的擴展性,且便于計算機自動處理。今后系統(tǒng)可以從兩個方面改進(jìn):①引入控制流分析功能,實現(xiàn)被測函數(shù)插樁操作自動化;②采用自適應(yīng)遺傳算法,動態(tài)地改變各種參數(shù),進(jìn)一步提高測試數(shù)據(jù)查找效率。
參考文獻(xiàn)(References):
[1] Bird D. L., C. U. Munoz. Automatic Generation of andom Self-Checking Test Cases[J].IBM Systems Journal,1983.22(3):229-245
[2] Jones B. F., Eyres D. E., Sthamer H. H.A Strategy for sing Genetic Algorithms to Automate Branch and Fault-Based Testing[J]. The Computer Journal,1998.41(2):98-107
[3] 史亮.測試數(shù)據(jù)自動生成技術(shù)研究[D].東南大學(xué)博士學(xué)位論文,2006.
[4] 吉根林.遺傳算法研究綜述[J].計算機應(yīng)用與軟件,2004.2:69-73
[5] 芮素娟.基于XML的測試用例復(fù)用研究[D].西南大學(xué)碩士學(xué)位論文,2006.endprint