本發(fā)明是對(duì)測試用例集的一種優(yōu)化處理方法,旨在使得該技術(shù)處理后的測試用例在檢測運(yùn)用模型驅(qū)動(dòng)開發(fā)的軟件時(shí),能夠高效檢錯(cuò),達(dá)到減少測試成本的效果。
背景技術(shù):
軟件測試在軟件開發(fā)過程中有著極其重要的作用,但軟件測試也是軟件開發(fā)中一個(gè)高成本的過程。測試人員或者通過手工有選擇的設(shè)計(jì)測試用例,或者通過軟件測試工具為一個(gè)軟件自動(dòng)生成測試用例,并利用測試用例對(duì)軟件進(jìn)行測試。通過手工設(shè)計(jì)測試用例,主觀性強(qiáng),測試質(zhì)量很難保證,因此通過測試用例生成工具自動(dòng)生成測試用例是目前軟件測試的發(fā)展趨勢(shì)。但對(duì)于測試用例自動(dòng)生成而言,最大的問題在于如何從龐大的測試用例集中挑選出優(yōu)秀的測試用例子集使得該子集能夠在擁有良好的測試覆蓋率的前提下,降低軟件測試的開銷。
國內(nèi)外的研究學(xué)者針對(duì)測試用例的選擇和使用問題做了大量的相關(guān)研究工作,測試用例約簡技術(shù)(Test Case Reduction,TCR)和測試用例排序技術(shù)(Test Case Prioritization,TCP)就是其中相對(duì)成熟的兩種技術(shù),這兩種技術(shù)通過較小的代價(jià)解決了測試用例的選擇問題。
然而這兩種技術(shù)仍存在一定的局限性,比如:TCR技術(shù)在約簡測試用例集的過程中,可能將一些原本能夠檢測軟件漏洞的測試用例當(dāng)做冗余測試用例刪除,因此使得精簡后的測試用例集在錯(cuò)誤檢測能力上有所下降,失去了檢測出某些潛在漏洞的能力。而傳統(tǒng)TCP技術(shù)注重于按照某一種排序策略對(duì)測試用例進(jìn)行排序亦或是根據(jù)軟件代碼與錯(cuò)誤間的聯(lián)系使覆蓋易錯(cuò)區(qū)域測試用例優(yōu)先執(zhí)行,忽略了軟件模型與錯(cuò)誤之間存在的聯(lián)系,使得傳統(tǒng)TCP技術(shù)在運(yùn)用到基于模型的軟件測試時(shí)無法取得良好的效果。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明針對(duì)傳統(tǒng)的TCP技術(shù)提出了一種改進(jìn)型的算法,基于軟件UML模型的測試用例排序方法不局限于測試用例集本身,且不依賴于特定的軟件代碼,而是通過對(duì)軟件設(shè)計(jì)模型的分析,綜合考慮模型中反映的軟件復(fù)雜度以及方法調(diào)用的依賴關(guān)系,從而提高測試用例的檢錯(cuò)能力和測試效率。此外,因?yàn)榛谀P偷臏y試不依賴于代碼,且軟件模型的建立位于軟件開發(fā)過程的前端,也使得基于軟件UML模型的測試用例排序方法可以實(shí)現(xiàn)全流程測試。
本發(fā)明方法具體包括以下步驟:
步驟1、獲取軟件各類的Chidamber和Kemerer度量元(CK度量元,Chidamber and Kemerer度量元),具體的獲取如下:
通過統(tǒng)計(jì)UML類圖中的各類的方法數(shù)量,獲得各類的類加權(quán)方法數(shù)(WMC,Weighted Methods per Class)、用深度優(yōu)先搜索在類圖中搜索出類的最深前驅(qū),計(jì)算類到最深前驅(qū)的距離,獲得各類的繼承樹深度(DIT,Depth of Inheritance Tree)、分析各類的直接子類數(shù)量,獲得各類的類子類數(shù)(NOC,Number of Children)、統(tǒng)計(jì)各類的非繼承關(guān)系數(shù)量,獲得類耦合度(CBO,Coupling Between Object Class)、通過分析UML順序圖方法中類實(shí)例化對(duì)象之間的方法調(diào)用關(guān)系,獲得各類的類響應(yīng)度(RFC,Response For a Class)。
步驟2、獲取CK度量元值與軟件故障的關(guān)系公式,然后根據(jù)關(guān)系公式和各類的CK度量元值估算類的錯(cuò)誤概率。具體的實(shí)施如下:
首先根據(jù)歷史版本的CK度量元以及類是否錯(cuò)誤的信息訓(xùn)練二元邏輯斯蒂模型,模型如下:
因變量p為類是否包含錯(cuò)誤的概率,類包含錯(cuò)誤值取1,否則取0;自變量集X=(1,x1,x2,……,xn)T為類的各CK度量元的值;參數(shù)集B=(β0,β1,……,βn)為對(duì)應(yīng)CK度量元的參數(shù)。用訓(xùn)練集訓(xùn)練二元邏輯斯蒂回歸模型,獲取較為準(zhǔn)確的B。
如果缺少歷史信息可以采用權(quán)威的CK度量元數(shù)據(jù)集訓(xùn)練模型,CK數(shù)據(jù)集網(wǎng)址如下:http://openscience.us/repo/defect/ck/。其中包含tomcat、ant、log4j等Apache開源軟件各版本的CK數(shù)據(jù)集。將當(dāng)前版本的類CK度量元信息使用訓(xùn)練后的二元邏輯斯蒂公式計(jì)算類的錯(cuò)誤概率。
步驟3、獲取時(shí)間自動(dòng)機(jī)遷移之間的依賴關(guān)系。時(shí)間自動(dòng)機(jī)由UML順序圖生成。遷移的數(shù)據(jù)依賴遷移集DD、控制依賴遷移集CD即為遷移的依賴關(guān)系,具體的獲取方式如下:
3-1.提取所有遷移中使用數(shù)據(jù)集合Use和定義數(shù)據(jù)集合Def。
3-1-1.分割字符串。字符串Str中包含有遷移上的判斷條件以及輸入輸出,以邏輯、算數(shù)等運(yùn)算符為分割點(diǎn)分割字符串Str,獲得含有變量和變量取值的集合Temp。
3-1-2.刪除變量的賦值。變量的賦值為數(shù)字,從集合Temp中刪去完全為數(shù)字形式的元素,獲得變量集Var。
3-1-3.變量歸類。如果字符串Str存儲(chǔ)的信息類型為內(nèi)部返回時(shí),變量集Var加入Def集合中;如果字符串Str存儲(chǔ)的信息類型為其余類型時(shí),則加入U(xiǎn)se集合。
3-2.生成遷移的數(shù)據(jù)依賴遷移集DD。
3-2-1.采用深度優(yōu)先搜索方式生成所有遷移的所有無環(huán)路徑。
3-2-2.對(duì)路徑進(jìn)行逐條分析,當(dāng)除起始遷移TRs外的遷移TRn的Use集包含有遷移TRs的Def集的元素時(shí),從Def集中刪除該元素,遷移TRn依賴于遷移TRs,將遷移TRn加入遷移TRs的數(shù)據(jù)依賴遷移集DD中。當(dāng)Def為空時(shí)結(jié)束本條路徑的分析,開始分析下一條路徑。
3-3.生成遷移的控制依賴遷移集CD。
確定可能存在控制依賴關(guān)系的遷移集合CT。根據(jù)控制依賴定義,遷移TRa到終止?fàn)顟B(tài)必須經(jīng)過遷移TRb,而遷移TRa的起始狀態(tài)到終止?fàn)顟B(tài)不必須經(jīng)過遷移TRb,遷移TRa控制依賴于遷移TRb。因此,只有起始狀態(tài)出度大于1的遷移可能產(chǎn)生控制依賴。創(chuàng)建包含狀態(tài)和出度兩個(gè)屬性的數(shù)組,遍歷遷移,被遍歷遷移的起始狀態(tài)的出度加1。根據(jù)要求選擇出度大于1的狀態(tài)集State,再從遷移集中選擇出起始狀態(tài)屬于狀態(tài)集State的遷移集合CT。
生成遷移TR到自動(dòng)機(jī)終止?fàn)顟B(tài)必須經(jīng)過的遷移集TMT。采用深度優(yōu)先搜索方式生成以遷移TR為起始的所有無環(huán)路徑,找出所有路徑都經(jīng)過的遷移放入該遷移的遷移集TMT。生成遷移TR的起始狀態(tài)S到自動(dòng)機(jī)終止?fàn)顟B(tài)必須經(jīng)過的遷移集SMT。采用深度優(yōu)先搜索方式生成狀態(tài)S的所有無環(huán)路徑,找出所有路徑都經(jīng)過的遷移放入狀態(tài)S的遷移集SMT。
集合運(yùn)算,遷移TR的遷移集TMT集合與狀態(tài)S的遷移集SMT集合的差集,即為遷移TR依賴的遷移集合CDB。在集合CDB中的遷移的控制依賴遷移集CD中加入遷移TR。
步驟4、計(jì)算遷移的重要度。
根據(jù)遷移的被依賴度Dep以及遷移對(duì)應(yīng)的類錯(cuò)誤概率p計(jì)算該遷移的重要度。被依賴度Dep為依賴于遷移TR的遷移數(shù)量,包含有控制依賴遷移數(shù)量|CD|和數(shù)據(jù)依賴遷移數(shù)量|DD|,同時(shí)為避免被依賴度Dep為0,導(dǎo)致遷移重要度無法反映類錯(cuò)誤概率的影響,使遷移的被依賴度Dep在原有的基礎(chǔ)上加0.5。p為遷移對(duì)應(yīng)類的錯(cuò)誤概率,遷移重要度IM計(jì)算公式如下:
Dep=|DD|+|CD|+0.5
IM=Dep*p
步驟5、計(jì)算測試用例優(yōu)先級(jí),根據(jù)優(yōu)先級(jí)增量(Additional)排序策略排序測試用例,具體排序過程如下:
5-1.設(shè)輸入測試用例集合TC。所有遷移的集合Trans作為未覆蓋遷移集合和以及空的已排序隊(duì)列Queue。
5-2.測試用例中所有屬于集合Trans的遷移的重要度之和作為該測試用例的優(yōu)先級(jí),計(jì)算集合TC中各測試用例優(yōu)先級(jí)。
5-3.選擇優(yōu)先級(jí)最大的測試用例,當(dāng)優(yōu)先級(jí)相同時(shí)選擇較長的測試用例。從集合TC中將選擇的測試用例取出放入隊(duì)列Queue中,同時(shí)從集合Trans中刪除隊(duì)列Queue包含的遷移。
5-4.判斷集合TC是否為空,如果為空,排序結(jié)束,輸出測試用例隊(duì)列Queue;否則,返回步驟5-2。
本發(fā)明的有益效果:
1.該技術(shù)考慮到軟件系統(tǒng)中類的復(fù)雜度,測試用例所涉及到的遷移所對(duì)應(yīng)的類越復(fù)雜越容易發(fā)現(xiàn)軟件系統(tǒng)中所存在的錯(cuò)誤,因此考慮類復(fù)雜度的測試用例排序能夠更高效地發(fā)現(xiàn)軟件系統(tǒng)中存在的錯(cuò)誤。
2.該技術(shù)考慮到軟件系統(tǒng)執(zhí)行過程中消息傳遞的關(guān)系,測試用例所涉及到的遷移依賴關(guān)系越多說明消息在軟件系統(tǒng)中影響越大也越復(fù)雜越易出錯(cuò),因此考慮遷移依賴關(guān)系的測試用例排序能更高效地發(fā)現(xiàn)軟件系統(tǒng)中存在的錯(cuò)誤及其衍生錯(cuò)誤。
3.該技術(shù)通過優(yōu)先排序,優(yōu)先執(zhí)行權(quán)限高的測試用例,因此在測試時(shí)間有限的情況下,仍然能對(duì)重要的測試用例優(yōu)先執(zhí)行,從而削減軟件測試成本。
附圖說明
圖1為基于UML模型的測試用例優(yōu)先排序方法整體流程
圖2為某無人機(jī)飛控系統(tǒng)自穩(wěn)模塊UML類圖。
圖3為某無人機(jī)飛控系統(tǒng)自穩(wěn)模塊部分UML順序圖。
圖4為數(shù)據(jù)依賴生成具體流程。
圖5為控制依賴生成具體流程。
圖6為Additional排序策略流程。
具體實(shí)施方式
下面根據(jù)附圖結(jié)合一個(gè)無人機(jī)飛控系統(tǒng)自穩(wěn)模塊的測試用例優(yōu)先排序過程對(duì)本發(fā)明進(jìn)行詳細(xì)說明。本發(fā)明整體流程如附圖圖1所示,具體步驟如下:
步驟1、獲取軟件各類的Chidamber和Kemerer度量元。
步驟2、獲取CK度量元值與軟件故障的關(guān)系公式,然后根據(jù)關(guān)系公式和各類的CK度量元值估算類的錯(cuò)誤概率。
步驟3、獲取時(shí)間自動(dòng)機(jī)遷移之間的依賴關(guān)系。時(shí)間自動(dòng)機(jī)由UML順序圖生成。
步驟4、計(jì)算遷移的重要度。
步驟5、計(jì)算測試用例優(yōu)先級(jí),根據(jù)優(yōu)先級(jí)增量排序測試用例。
進(jìn)一步,在步驟1中,無人機(jī)飛控系統(tǒng)自穩(wěn)模塊的UML類圖如附圖圖2所示,以及UML順序圖如附圖圖3所示。類圖中類包含屬性和方法,類與類的連線表示類之間的關(guān)系,包括繼承關(guān)系和組合關(guān)系兩大類。順序圖中包含類的實(shí)例化對(duì)象以及對(duì)象間的方法調(diào)用,實(shí)例化對(duì)象以及方法可以對(duì)應(yīng)到類圖中的類以及類的方法。類的方法數(shù)量即為類的WMC;通過深度優(yōu)先搜索在類圖中搜索出類的最深繼承關(guān)系前驅(qū),類到最深繼承關(guān)系前驅(qū)的距離即為類的DIT;類的直接子類數(shù)量即為類的NOC;類的非繼承關(guān)系數(shù)量即為類的耦合度;UML順序圖中類實(shí)例化對(duì)象調(diào)用其他類實(shí)例化對(duì)象的方法數(shù)量即為類的響應(yīng)度。
進(jìn)一步,在步驟2中,無人機(jī)飛控系統(tǒng)自穩(wěn)模塊無法獲取歷史版本信息,因此采用權(quán)威的CK度量元數(shù)據(jù)集訓(xùn)練二元邏輯斯蒂模型,訓(xùn)練后的模型如下:
p為類的錯(cuò)誤概率,x1到x5分別表示類CK度量元中的WMC、DIT、NOC、CBO、RFC。然后將由步驟1得到的類CK度量元值,以類為單位代入模型中估算該類的錯(cuò)誤概率。
進(jìn)一步,在步驟3中,自動(dòng)機(jī)的遷移依賴關(guān)系計(jì)算分為3個(gè)部分:數(shù)據(jù)處理、數(shù)據(jù)依賴生成、控制依賴生成。
3-1.提取所有遷移中使用數(shù)據(jù)集合Use和定義數(shù)據(jù)集合Def。
3-1-1.分割字符串。字符串Str中包含有遷移上的判斷條件以及輸入輸出,以邏輯、算數(shù)等運(yùn)算符為分割點(diǎn)分割字符串Str,獲得含有變量和變量取值的集合Temp。
3-1-2.刪除變量的賦值。變量的賦值為數(shù)字,從集合Temp中刪去完全為數(shù)字形式的元素,獲得變量集Var。
3-1-3.變量歸類。如果字符串Str存儲(chǔ)的信息類型為內(nèi)部返回時(shí),變量集Var加入Def集合中;如果字符串Str存儲(chǔ)的信息類型為其余類型時(shí),則加入U(xiǎn)se集合。
3-2.生成遷移的數(shù)據(jù)依賴遷移集DD。
3-2-1.采用深度優(yōu)先搜索方式生成所有遷移的所有無環(huán)路徑。
3-2-2.對(duì)路徑進(jìn)行逐條分析,當(dāng)除起始遷移TRs外的遷移TRn的Use集包含有遷移TRs的Def集的元素時(shí),從Def集中刪除該元素,遷移TRn依賴于遷移TRs,將遷移TRn加入遷移TRs的數(shù)據(jù)依賴遷移集DD中。當(dāng)Def為空時(shí)結(jié)束本條路徑的分析,開始分析下一條路徑。
3-3.生成遷移的控制依賴遷移集CD。
確定可能存在控制依賴關(guān)系的遷移集合CT。根據(jù)控制依賴定義,遷移TRa到終止?fàn)顟B(tài)必須經(jīng)過遷移TRb,而遷移TRa的起始狀態(tài)到終止?fàn)顟B(tài)不必須經(jīng)過遷移TRb,遷移TRa控制依賴于遷移TRb。因此,只有起始狀態(tài)出度大于1的遷移可能產(chǎn)生控制依賴。創(chuàng)建包含狀態(tài)和出度兩個(gè)屬性的數(shù)組,遍歷遷移,被遍歷遷移的起始狀態(tài)的出度加1。根據(jù)要求選擇出度大于1的狀態(tài)集State,再從遷移集中選擇出起始狀態(tài)屬于狀態(tài)集State的遷移集合CT。
生成遷移TR到自動(dòng)機(jī)終止?fàn)顟B(tài)必須經(jīng)過的遷移集TMT。采用深度優(yōu)先搜索方式生成以遷移TR為起始的所有無環(huán)路徑,找出所有路徑都經(jīng)過的遷移放入該遷移的遷移集TMT。生成遷移TR的起始狀態(tài)S到自動(dòng)機(jī)終止?fàn)顟B(tài)必須經(jīng)過的遷移集SMT。采用深度優(yōu)先搜索方式生成狀態(tài)S的所有無環(huán)路徑,找出所有路徑都經(jīng)過的遷移放入狀態(tài)S的遷移集SMT。
集合運(yùn)算;遷移TR的遷移集TMT集合與狀態(tài)S的遷移集SMT集合的差集,即為遷移TR依賴的遷移集合CDB。在集合CDB中的遷移的控制依賴遷移集CD中加入遷移TR。
進(jìn)一步,在步驟4中,已知自動(dòng)機(jī)的遷移由順序圖的消息轉(zhuǎn)換而來,而順序圖的消息對(duì)應(yīng)類圖中的方法,根據(jù)遷移的被依賴度Dep以及遷移對(duì)應(yīng)的類錯(cuò)誤概率p計(jì)算該遷移的重要度。被依賴度Dep為依賴于遷移TR的遷移數(shù)量,包含有控制依賴遷移數(shù)量|CD|和數(shù)據(jù)依賴遷移數(shù)量|DD|,同時(shí)為避免被依賴度Dep為0,導(dǎo)致遷移重要度無法反映類錯(cuò)誤概率的影響,使遷移的被依賴度Dep在原有的基礎(chǔ)上加0.5。p為遷移對(duì)應(yīng)類的錯(cuò)誤概率,遷移重要度IM計(jì)算公式如下:
Dep=|DD|+|CD|+0.5
IM=Dep*p
將步驟2得到的類錯(cuò)誤概率以及步驟3得到的遷移被依賴度代入公式,計(jì)算出遷移的重要度。
進(jìn)一步,在步驟5中,采用Additional策略排序測試用例,策略流程如附圖6所示,具體排序過程如下:
設(shè)輸入測試用例集合TC。所有遷移的集合Trans作為未覆蓋遷移集合和以及空的已排序隊(duì)列Queue。
第一步:測試用例中所有屬于集合Trans的遷移的重要度之和作為該測試用例的優(yōu)先級(jí),計(jì)算集合TC中各測試用例優(yōu)先級(jí)。
第二步:選擇優(yōu)先級(jí)最大的測試用例,當(dāng)優(yōu)先級(jí)相同時(shí)選擇較長的測試用例。從集合TC中將選擇的測試用例取出放入隊(duì)列Queue中,同時(shí)從集合Trans中刪除隊(duì)列Queue包含的遷移。
第三步:判斷集合TC是否為空,如果為空,排序結(jié)束,輸出測試用例隊(duì)列Queue;否則,返回第一步。