王 立 新
(安徽建筑大學 電子與信息工程學院,安徽 合肥 230022)
?
逆向模型測試中的測試用例集生成方法
王 立 新
(安徽建筑大學 電子與信息工程學院,安徽 合肥 230022)
簡要介紹了逆向建模測試的相關概念;給出了逆向建模測試的過程;系統(tǒng)介紹了逆向建模測試過程中測試用例生成的方法;提出了一種利用參數約束關系的逆向建模測試用例集精簡方法,并給出了該方法的相關實驗數據。
逆向建模;軟件測試;組合覆蓋測試
對于開發(fā)時間較早的現在仍在應用的軟件和組件,很多都存在這樣那樣的問題,歸納起來包括:文檔完整性欠缺,存在信息不一致問題,有的軟件還多次打補丁,給軟件使用造成比較多的麻煩。然而,這些歷史遺產又不能完全拋棄,有時候是需要建立模型的以便于擴充功能、修正錯誤等,但由于上述問題,要使用一般的正向建立模型的方法是不可行的,這就產生了如何建立模型的問題。
而逆向模型測試[1]就是從欠缺完整性的文檔,在可能存在不一致的信息中構造出測試用例,再運行測試用例并獲取系統(tǒng)的動態(tài)信息,最終構建出系統(tǒng)的動態(tài)模型,在多次與用戶目標需求迭代比較和修正后,獲得系統(tǒng)或組件的模型以及其它信息。
逆向測試過程一般可分為以下幾個階段,如圖1所示。
圖1 逆向測試過程
(1)從使用手冊、設計說明等不完整的文檔中提取測試用例,這個步驟是逆向測試第一步;
(2)測試這些用例;
(3)獲取運行測試用例過程中的運行結果和動態(tài)數據,存儲于結果數據數據庫,為后面的系統(tǒng)分析起支撐作用;
(4)對測試的結果數據進行梳理并進行整理后存儲在庫中,這是由于動態(tài)的狀態(tài)變化數據信息很大,需要數據庫來存儲和處理;
(5)處理測試數據,獲取初步的系統(tǒng)模型;
(6)根據現有文檔和所預測的初步模型比對,對初步模型進行修正以及精細化;
(7)對修正后系統(tǒng)模型進行分析,重新從分析結果中得到新的用例;
(8)這步是在前面步驟之后,用新的用例轉(2)再測試。
多次的迭代測試之后,修改出錯和偏差,逐漸逼近滿足需要的模型和規(guī)格,直至達到用戶的需求為止。
從逆向建模的測試過程來看,測試用例是逆向建模的基礎和關鍵。但是由于沒有文檔或者文檔不完全,造成了測試用例的生成困難。因此對于逆向建模的測試用例集的獲取就是一個比較棘手的問題。
一般情況下,根據逆向工程[2]的步驟,我們可以首先從文檔中獲取相關的輸入和輸出信息,然后再組織成為測試用例,這是首先想到的可利用信息,除此之外,我們還可以從多處獲取用于生成測試用例的信息,比如系統(tǒng)的界面和膠水代碼等。這些信息的獲取就是我們生成初始測試用例的基礎,也是我們精細化模型的基礎。
我們分析這些信息以后,利用這些信息來組合、進行系統(tǒng)或者組件的黑盒測試是最為方便的。也就是對系統(tǒng)或組件的輸入信息進行組合,然后運行系統(tǒng)或組件,考察輸出的信息或者狀態(tài)結果信息。也即對輸入信息進行組合從而獲取測試用例集是最為可行和有效的方法。
組合測試[3]也稱為組合覆蓋測試,根據不同的組合參數數目k(1≤k≤n),可分為:(a)單參數覆蓋、(b)雙參數組合覆蓋、 (c)n維參數全組合覆蓋等。在組合覆蓋測試中,全組合覆蓋測試是最完全和最徹底的。
通常情況下,如輸入參數很少的情況下,那么全組合覆蓋測試集的測試用例數目是可以接受的,但對于組合參數數目較多的情況下,參數組合爆炸的難題就出現了,很多情況下,就是由于測試組合用例數目太大而使得測試工作不可能完成。
圖2是一個學生信息注冊界面。如果性別2個選項,出生年有46個選項,月份12個選項,日平均30個選項,籍貫34個選項,市(區(qū))平均有12個選項,學院有7個選項,系平均3個選項,專業(yè)有24個選項,學籍狀況有3個選項,那么我們初步計算一下,輸入選項的全組合大概有2.0431595*E10,這時的情形就是組合爆炸,對于這樣一個天文數字的組合信息,組合測試不可能進行的。
那么為了軟件測試高效性和可行性,R. Mandl[4]首次提出了雙參數組合(成對組合)測試概念,即對參數的所有取值進行兩兩組合,在滿足覆蓋準則要求的情況下,生成元素的兩兩組合覆蓋測試用例集來測試軟件。Kuhn D. R.等則發(fā)現大約20 %~40 %的系統(tǒng)或者組件出錯或者故障是由某單個參數引起的,七成左右的出錯或故障由某2個參數引起的,而九成以上出錯或故障是由2或3個參數作用引起的[5];而Cohen[6]、史亮[7]等人也取得了不少的研究成果。成對組合覆蓋測試用例集的生成最有名的方法包括AETG[8]、IPO和PSST[9]等。
圖2 學生學位審查系統(tǒng)注冊界面
3.1 無效參數組合的概念
盡管單參數覆蓋測試和成對組合覆蓋測試或者三參數組合覆蓋測試能以數目可以接受的測試用例來測試待測的軟件系統(tǒng)或組件,但很多情況下也需要更全面的測試,也有參數較多的情況下,成對組合覆蓋的用例數目也是不能令人滿意的,于是很多研究者提出了各種精簡組合測試用例集的方法。在圖2的界面中,我們可以看到一些參數組合是不成立的,即不可能用來進行測試的,如1999年2月30日(1999,2,30)就是無效組合,這是因為在系統(tǒng)或者組件程序內部大多已經有代碼對此進行約束了,而在一些組合測試方法中,測試用例的生成大多數未考慮有參數依賴的情況。而在用沒有考慮參數約束的組合測試用例集中,就會包含無效的參數組合的用例,如果利用輸入參數的約束關系消除這些測試用例,可以減少測試用例集中的用例數,提高測試的效率,這對測試是很有利的。
輸入選取圖2中的性別(男,女)、出生年(1951等46個)、學籍狀況(在讀、休學、畢業(yè))、學院(電信等7個)和專業(yè)(計算機科學與技術等24個)5個參數的情況下,如果生成全組合覆蓋測試用例,其測試用例數目是不可接受。我們采用微軟公司的PICT軟件生成的2維組合用例,盡管輸入參數不多,但最終的成對組合測試用例是1584個,這其中含有部分無效的2維輸入參數組合,需要對其進行精簡。
圖2中,在籍貫的省和市中就存在參數之間的約束關系,如選取江蘇省,那么合肥就不能在組合測試用例中產生,這時因為模塊內的代碼體現了約束關系,使得省和省內的城市關聯起來,在界面的下拉列表中選取了江蘇省后,就不會在市的下拉列表中出現非江蘇省的城市。同樣,年、月和日的下拉列表中也會體現約束關系,如(1999年,2月,29日)、(1999年,2月,30日)和(1999年,2月,31日)等這樣的輸入參數的組合等。那么如果我們輸入的測試用例中包含(江蘇省,合肥市)或(2月,30日)這樣的組合,那么在界面上輸入不了,也就是不可能進行測試。更進一步地說,就是需要我們在k維參數組合測試用例來測試集生成以后,需要檢查是否包含了無效的參數組合,如果有的話,需要在測試用例集中剔除。也即我們可以基于參數間的約束關系,能夠不同程度地精簡測試用例集。對于上文中的無效參數組合也可以用來測試膠水代碼的正確性,將另文研究。
3.2 輸入參數之間的依賴關系
那么怎樣找出這些輸入參數之間的約束關系呢?通過圖2中的輸入參數進行了約束關系的分析,我們選擇了幾個關鍵性的輸入參數對它們進行組合測試,并獲取它們之間的約束關系。
我們對輸入參數約束關系進行符號化標記:例如xy表示輸入參數值x約束y參數值(屬oneone);如x∧yz表示輸入參數值x和y共同約束參數值z(屬manyone型);如zx∧y表示輸入參數z約束x和y( 屬onemany);如x∧yz∧w表示x和y值約束輸入參數值z和w(manymany屬)。
在具體的圖2的界面中,有“南京”“蘇州”和“揚州”等城市受到“江蘇”的約束;在出生日期的年月日輸入參數組合上,“日(1-31)”受到“月(1-12)”的一些月份的約束,比如:1-28日在所有的月份都有效,可以成對組合,但29日不但受到月份為“2”的約束,還受到年份的約束,但30日和31日只是在其它月份出現,不會出現在“2”月份。而2月29日的出現,如果認定它是合法的,那么還要檢查年份是否是閏年,閏年符合條件a:能被4整除而不能被100整除;b:能被400整除。故月和日組合(2,30)和(2,31)就是無效的成對組合,年月日組合(2015,2,29 )也是無效的三組合。
3.3 利用約束關系的精簡測試用例集
輸入參數約束關系可以用來對k維組合測試用例集進行精簡。主要有兩種方式:第一種方式是首先生成輸入參數的全組合的集合,此時,這些組合集中有無效參數的組合,需要逐一檢查剔除,然后根據覆蓋率的要求,再從中刪除一些組合;
第二種方式是在算法生成k維組合用例的同時,及時測校當前k維的參數組合是否含有無效的約束關系,如包含無效約束,則重新生成k維的參數組合,如不包含無效組合,則是最終的測試用例集的一員,直到達到組合覆蓋率的要求為止。
第一種方式算法條理清晰,實現起來比較簡單,但算法的時間復雜度較高,特別是輸入參數比較多的情況下,往往時效上不可接受。第二種方式,需要在檢測當前的參數組合是否有效的同時,也檢查組合覆蓋率,時效性相對較好。
第二種精簡組合用例方式的算法如下:
(1)根據輸入參數之間依賴集,生成無效參數組合集;
(2)生成k維參數組合;
(3)對該k維參數組合進行如下步驟:
a.檢測每個無效參數組合是否在該參數組合中;
b.如果該參數組合中有無效參數組合就剔除,并且轉(2);
c.否則就把該組合加到測試用例集中,并且檢查組合覆蓋率是否達到,如果沒有達到要求的覆蓋率則轉2;否則轉4;
(4)程序結束。
在第2節(jié)的圖2中,包含2個Text文本框、10個ComboBox單選下拉列表,還有2個按鈕,包括:性別,出生年、月、日,籍貫的省、市,學院、系、專業(yè)和學籍狀況。出生日期(年月日),省和市(區(qū))的約束關系在被測的系統(tǒng)程序中或模塊之間已經體現,在界面上就不會輸入這些無效組合。在上述實驗實例中,我們就參數之間的約束關系對其中6個輸入控件的參數值之間進行細致嚴密的分析,分析出它們之間的約束類型,并且由此能生成k維的輸入參數依賴關系集。
具體的約束關系見表1:例如:日期中的日受到月份的約束,日也受到年份的約束;籍貫中的市受到省的約束;不同的系分屬不同的學院,故系受到學院的約束;而專業(yè)分屬不同的系來招生管理,因此專業(yè)受到系的約束;學籍狀況包含在讀、休學和畢業(yè),一般學校都有學生在校修學的最長期限,不可能有超過6年還在讀的現象等,因此學籍狀況受到出生年月日的約束等;當前學歷和出生年月日有約束關系等。這些約束關系不僅可以幫助軟件和組件使用者正確地使用,還可以在逆向構建模型時,對組合測試用例的精簡起到很大的幫助。
表1 學籍查詢系統(tǒng)學生界面的輸入參數約束關系
我們在以上的這些約束關系中,抽出了一些約束關系,并對相關輸入參數進行相應的取值:(1)性別(S):男,女;(2)出生年(Y): 1951,1952,1953,…,1988,2016; (3)學籍狀況(SS):在讀,畢業(yè),休學;(4)當前學歷(E):高中,中專,大專,本科,雙學士,碩士;(5)專業(yè)(P):計算機科學與技術,網絡工程,土木工程,經濟管理,園林設計,材料工程,動畫設計,機械工程,自動化,財務管理……(專業(yè)24個);(6)學院(X):電信學院, 機電學院, 材化學院, 管理學院, 法政學院, 數理學院, 建筑土木學院。
在這個實例系統(tǒng)界面中,為測試的高效和方便,利用這些輸入參數的約束關系,要把全組合測試用例集和二維組合測試用例集中包含無效組合的用例剔除出來,實驗結果如下:
實驗1:全組合測試用例生成和精簡: 全組合用例數A:21*461*31*61*241*1=39744 約束關系數: 4 精簡后用例數R:約等于39 744-19 008-5 184=15 552 R/A (%):39.1
實驗2:成對組合測試用例生成和精簡: 生成的成對組合用例數P:1 584 約束關系數:4 成對組合用例集中包含無效參數組合的用例數:552 不影響覆蓋率而剔除的無效用例數:305 精簡后用例數R:1 279 R/P (%):<80.7
上述實驗的測試用例數還是比較大的,本實驗只是用來說明用輸入參數的依賴關系可以精簡測試用例集。實驗結果表明,利用此方法可在測試用例數目上,使全組合和二維組合用例集得到不同程度地精簡。本實驗中,用例集精簡后的用例數和精簡前的用例數之比分別為39.1%和小于80.7%,這說明該方法具有實用價值。
在逆向建模測試過程中,測試用例的生成和精簡是一個不可回避的問題。在本文中詳細地敘述了通過各種方式可以獲得系統(tǒng)和組件的輸入信息,并利用參數約束關系來精簡成對組合測試用例集。從實驗數據來看,在一些情況下利用輸入參數的約束關系來精簡組合測試用例集的方法是可行的。
[1] BERTOLION A. Software testing research:Achievements,challenges,dreams[C]. New York:Future of Software Engineering,IEEE,2007:85-103.
[2] 劉明. 軟件逆向工程分析技術研究及應用[J].航空計算技術,2011,41(2):93-95,104.
[3] NORITAKA K,TATSUHIRO T,TOHRU K.A new method for constructing pair-wise covering designs for software testing[J].Information Processing Letters,2002,81(2):85-91.
[4] MANDL R.Orthogonal latin squares:An application of experimental design to compiler testing[J].Communications of the ACM,1985,28(10):1054-1058.
[5] KUHN D R,WALLACE D R.Software fault interactions and implications for software testing[J].IEEE Transactions on Software Engineering,2004,30(6):418-421.
[6] COHEN D,DALAL S R,FREDMAN M L,et al.The AETG system:An approach to testing based on combinatorial design[J].IEEE Transaction on Software Engineering,1997,23(7):437-444.
[7] 史亮.基于解空間樹的組合測試用例生成[J].計算機學報,2006,29(6):849-857.
[8] TAI K C,YU L.A test generation strategy for pairwise testing[J].IEEE Transactions on Software Engineering,2002,28(1):109-111.
[9] 于秀山,于洪敏.軟件測試新技術技術與實踐[M].北京:電子工業(yè)出版社,2006:13-17.
Test Case Generation Method in Reverse-model Test
WANG Lixin
(School of Electronic and Information Engineering, Anhui Jianzhu University, Hefei Anhui 230022, China)
Firstly the concept of reverse modeling test is briefly introduced, and then the process of reverse modeling and testing is described. The method of test case generation in the process of reverse modeling is presented, and a reduction method of test suite based on parameter constraint is also given. At last the experimental data of this method are shown.
reverse modeling; software testing; combined coverage testing
2017-03-17
安徽省教育廳自然科學基金(KJ2011B041);安徽建筑大學博士及引進人才基金資助項目(建院函(2012)33號);安徽省教育廳自然科學研究重點項目(KJ2016A155)
王立新(1966-),男,安徽合肥人,副教授,博士,主要從事軟件測試研究。E-mail:wlxhs@ahjzu.edu.cn
TP301.6
A
1004-2237(2017)03-0022-05
10.3969/j.issn.1004-2237.2017.03.005