專利名稱:一種面向路徑的測試數(shù)據(jù)自動(dòng)生成方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)軟件測試中為指定的程序路徑自動(dòng)生成測試數(shù)據(jù)的方法,尤其是指定的程序路徑中包括函數(shù)調(diào)用或者可執(zhí)行程序調(diào)用時(shí)的測試數(shù)據(jù)自動(dòng)生成方法。
背景技術(shù):
計(jì)算機(jī)及軟件在國民經(jīng)濟(jì)和社會生活等方面的應(yīng)用越來越廣泛和深入。人們在開發(fā)軟件的過程中難免會引入錯(cuò)誤。軟件測試是揭示軟件錯(cuò)誤的重要手段。在軟件測試中,面向路徑的測試數(shù)據(jù)生成問題可以描述為給定一個(gè)程序P和P中一條路徑W,設(shè)P的輸入空間為D,求x∈D,使得P以x為輸入運(yùn)行,所經(jīng)過的路徑為W。軟件測試中的控制流測試中諸如語句覆蓋、分支覆蓋、條件覆蓋、判定一條件覆蓋、路徑覆蓋等問題,數(shù)據(jù)流測試中的定義覆蓋、引用覆蓋等問題,組裝測試中的凋用對覆蓋、數(shù)據(jù)流測試等問題,以及面向斷言的測試和回歸測試中的一些問題都可以歸結(jié)為該問題。目前,測試人員一般采用手工方法尋找x。自動(dòng)求解面向路徑的測試數(shù)據(jù)將有效地提高軟件測試的效率和質(zhì)量。
解決面向路徑的測試數(shù)據(jù)生成的關(guān)鍵在于約束系統(tǒng)的建立和求解。建立約束系統(tǒng)的困難是分析、化簡路徑W上的各種語句成分和各種數(shù)據(jù)類型,建立盡可能簡潔的約束系統(tǒng);求解約束系統(tǒng)的主要困難是處理可能存在的非線性約束。Matiyasevi 和E.J.Weyuker等人的研究表明不存在通用的有效的算法,對于任意的P和W,能生成使W被經(jīng)過的程序輸入。但是實(shí)際應(yīng)用的需要迫使人們進(jìn)行研究,并提出各種方法求解該問題。
對于某種面向路徑的測試數(shù)據(jù)生成方法,當(dāng)W上存在函數(shù)調(diào)用或者可執(zhí)行程序調(diào)用,但是沒有提供被調(diào)用的函數(shù)或程序的源代碼,只是給出該函數(shù)編譯后的目標(biāo)代碼或程序編譯后的可執(zhí)行代碼,且后面的謂詞函數(shù)對這些目標(biāo)代碼或可執(zhí)行代碼存在數(shù)據(jù)依賴關(guān)系,此時(shí),若該方法仍能生成測試數(shù)據(jù),則稱該方法能夠用于黑盒測試,否則稱該方法不能用于黑盒測試。
目前,國內(nèi)外面向路徑的測試數(shù)據(jù)生成方法可分為四類隨機(jī)法、試探法、靜態(tài)法和動(dòng)態(tài)法。隨機(jī)法實(shí)質(zhì)上是困難的。試探法主要包括遺傳算法和模擬退火法兩種。遺傳算法本身很復(fù)雜,其理論研究目前相當(dāng)有限,結(jié)果也不太深入,作為遺傳算法的理論基石之一的隱性并行性的證明還存在嚴(yán)重缺陷。模擬退火法的收斂速度很緩慢。靜態(tài)法包括符號執(zhí)行法和區(qū)間算術(shù)法,它們都需要對W上的語句進(jìn)行轉(zhuǎn)換,故不能用于黑盒測試。符號執(zhí)行方法通常要進(jìn)行復(fù)雜的代數(shù)運(yùn)算,且難于處理依賴于輸入變量的循環(huán)條件、數(shù)組元素下標(biāo)和函數(shù)調(diào)用。區(qū)間算術(shù)法需要對變量的取值區(qū)間進(jìn)行對分窮舉,當(dāng)變量的取值區(qū)間為無窮區(qū)間時(shí),該方法也是困難的。動(dòng)態(tài)法可分為直線式程序法和Bogdan Korel、M.Gallagher等人、Neelam Gupta等人分別提出的方法等幾種。直線式程序法要求用戶先提供所有整數(shù)類型的變量值,并且在數(shù)值優(yōu)化過程有可能陷于局部極值。Bogdan Korel和M.Gallagher等人分別提出的方法一次只考慮一個(gè)分支謂詞和一個(gè)輸入變量,且使用回溯技術(shù),迭代次數(shù)多,資源消耗大;且Bogdan Korel提出的方法為了減小搜索的盲目性,需要采用動(dòng)態(tài)數(shù)據(jù)流分析技術(shù)確定影響分支謂詞的變量,不能用于黑盒測試。
Neelam Gupta等人于1998年在ACM SIGSOFT第六屆軟件工程基礎(chǔ)國際研討會的論文集(Proceedings of The ACM SIGSOFT Sixth InternationalSymposium on the Foundations of Software Engineering)上發(fā)表的論文“Automated test data generation using an iterative relaxationmethod”中提出一種動(dòng)態(tài)方法,從程序輸入空間D中任選一組程序輸入考察W上各分支謂詞,通過靜態(tài)、動(dòng)態(tài)數(shù)據(jù)流分析確定各謂詞函數(shù)對于輸入變量的依賴關(guān)系,構(gòu)造謂詞片和動(dòng)態(tài)切片,建立這些謂詞函數(shù)關(guān)于當(dāng)前輸入的線性算術(shù)表示,然后建立輸入變量的增量的線性約束系統(tǒng),進(jìn)而建立輸入變量的增量的線性方程系統(tǒng),采用高斯消去法求解后得到各輸入變量的增量,從而獲得一組新的程序輸入。
該方法在構(gòu)造線性約束系統(tǒng)的過程中必須分析W上各語句之間的靜態(tài)、動(dòng)態(tài)數(shù)據(jù)依賴關(guān)系,故構(gòu)造線性約束系統(tǒng)的效率較低,求解問題的能力較弱,不能用于黑盒測試當(dāng)W上有循環(huán)語句時(shí),必須指明該循環(huán)的循環(huán)體執(zhí)行的次數(shù),并將循環(huán)在W上展開;當(dāng)W上存在函數(shù)調(diào)用時(shí),需要采用類似宏替換的方法用實(shí)參替換被調(diào)用的函數(shù)體中的形參,將被調(diào)用的函數(shù)體在調(diào)用處展開。該方法不允許W上有g(shù)oto語句;且該方法采用高斯消去法求解所建立的線性方程系統(tǒng)存在以下缺點(diǎn)若自由變量取值不適當(dāng),可能導(dǎo)致線性方程系統(tǒng)不相容。
Neelam Gupta等人于1999年在IEEE第十四屆自動(dòng)化軟件工程國際會議的論文集(Proceedings of The 14th IEEE International Conference onAutomated Software Engineering)上發(fā)表的論文“UNA based iterativetest data generation and its evaluation”中提出基于最小二乘解的約束求解方法,克服了基于高斯消去法的約束求解方法的缺點(diǎn),但仍存在以下缺點(diǎn)(1)存在這樣的線性混合整數(shù)規(guī)劃問題,至少有一組解,但是基于最小二乘解的約束求解方法找不到;(2)對于所有規(guī)模的問題,基于最小二乘解的約束求解方法尋找實(shí)數(shù)值解的迭代算法在最壞情況下不收斂。
Jon Edvardsson等人于2001年在第八屆歐洲軟件工程會議與ACMSIGSOFT第九屆軟件工程基礎(chǔ)國際研討會的聯(lián)合會議的論文集(Proceedings of The Joint 8th European Software EngineeringConference and 9th ACM SIGSOFT Symposium on the Foundations ofSoftware Engineering)上發(fā)表的論文“Analysis of the constraint solverin UNA based test data generation”中提出的基于線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃的約束求解方法可以克服基于最小二乘解的約束求解方法的缺點(diǎn)。但是基于線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃的約束求解方法仍存在以下缺點(diǎn)存在可行的W,并且W上某些謂詞函數(shù)中含有輸入變量的非線性函數(shù),由于采用線性算術(shù)表示對謂詞函數(shù)進(jìn)行線性化,根據(jù)某些初始程序輸入建立的線性約束系統(tǒng)轉(zhuǎn)化為一個(gè)矛盾的線性方程系統(tǒng),如果采用基于線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃的約束求解方法,則無法生成相應(yīng)的測試數(shù)據(jù)。此外,人們在建立約束系統(tǒng)后,還研究了一些其它的約束求解方法,效果均不理想。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題就是針對現(xiàn)有的面向路徑W測試數(shù)據(jù)自動(dòng)生成方法的不足,提出一種新的測試數(shù)據(jù)自動(dòng)生成方法,無須分析W上各語句之間的數(shù)據(jù)依賴關(guān)系,通過計(jì)算W上各謂詞函數(shù)的線性算術(shù)表示,為輸入變量建立線性約束系統(tǒng),采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃和最小二乘解法相結(jié)合的約束求解方法,經(jīng)過若干次迭代尋找所需的測試數(shù)據(jù),該方法既能用于白盒測試,又能用于黑盒測試。
本發(fā)明的技術(shù)方案是本發(fā)明由輸入接口、詞法分析器、語法分析器、約束構(gòu)造器、約束求解器、路徑滿足檢查器、輸出接口模塊實(shí)現(xiàn)測試數(shù)據(jù)自動(dòng)生成。本發(fā)明總體邏輯結(jié)構(gòu)是用戶指定程序路徑W,詞法分析器對W進(jìn)行詞法分析后,語法分析器根據(jù)詞法分析的結(jié)果對W進(jìn)行語法分析,將W轉(zhuǎn)換為約束構(gòu)造程序和路徑滿足檢查程序,約束構(gòu)造程序經(jīng)編譯產(chǎn)生約束構(gòu)造器,路徑滿足檢查程序經(jīng)編譯產(chǎn)生路徑滿足檢查器;約束構(gòu)造器根據(jù)當(dāng)前程序輸入和各輸入變量的增量執(zhí)行W上的語句,不分析W上的語句之間的數(shù)據(jù)依賴關(guān)系,構(gòu)造W上各謂詞函數(shù)的線性算術(shù)表示,然后建立輸入變量的線性約束系統(tǒng);約束求解器采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃和最小二乘解法相結(jié)合的方法求解線性約束系統(tǒng)若W上的謂詞函數(shù)均為輸入變量的線性函數(shù),則采用基于線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃方法求解,若W上的謂詞函數(shù)中含有輸入變量的非線性函數(shù),則采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃和最小二乘解法相結(jié)合的方法求解;求解后獲得新的程序輸入即測試數(shù)據(jù);最后由路徑滿足檢查器進(jìn)行檢查,若該程序輸入能使W被經(jīng)過則結(jié)束,若該程序輸入不能使W被經(jīng)過則根據(jù)W上所有謂詞函數(shù)是否為輸入變量的線性函數(shù)以及迭代次數(shù)上限決定是否繼續(xù)迭代求解;求解結(jié)果由輸出接口輸出。本發(fā)明定義了以下四個(gè)名詞定義1.分支謂詞程序路徑W上具有明確取值要求的判斷語句中的條件表達(dá)式稱為分支謂詞。不失一般性,設(shè)分支謂詞為Exp1?Exp2的形式,其中Exp1?Exp2是關(guān)系表達(dá)式,Exp1和Exp2是算術(shù)表達(dá)式,?∈{>,≥,=,<,≤}。
循環(huán)語句可以轉(zhuǎn)換為等價(jià)的用判斷語句和轉(zhuǎn)移語句表達(dá)的形式。當(dāng)人們關(guān)心W上的循環(huán)體的內(nèi)部執(zhí)行情況時(shí),可以將循環(huán)展開。當(dāng)人們不關(guān)心循環(huán)體的內(nèi)部執(zhí)行情況時(shí),可以直接將該循環(huán)作為一個(gè)黑盒放在W上,不必將其展開。
當(dāng)人們不關(guān)心W上判斷語句是執(zhí)行“真”分支還是“假”分支時(shí),可以直接將該判斷語句作為一個(gè)黑盒放在W上。定義2.謂詞結(jié)點(diǎn)稱分支謂詞所在的判斷語句為謂詞結(jié)點(diǎn)。定義3.謂詞函數(shù)謂詞結(jié)點(diǎn)的分支謂詞Exp1?Exp2可被轉(zhuǎn)換成等價(jià)的分支謂詞形式F?0,其中F為算術(shù)表達(dá)式Exp1-Exp2,稱F為該謂詞結(jié)點(diǎn)的謂詞函數(shù)。定義4.線性算術(shù)表示設(shè)ni為W上的謂詞結(jié)點(diǎn),并且X=<x1,…,xt>和Y=<y1,…,yt)為程序輸入和輸入變量的增量,其中t為W上輸入變量的個(gè)數(shù),yj≠0,j=1,...,t,若ni的謂詞函數(shù)為F,則稱L(i,X,Y,W)=di1v1+…+ditvt+ci為W上ni處F關(guān)于X和Y的線性算術(shù)表示,其中dij=(Pnewij-Poldi)/yj,ci=Poldi-di1×x1-…-dit×xt,Poldi和Pnewij分別為按照程序輸入X和X+<0,…,0,yj,0,…,0>依次執(zhí)行W上的ni之前的除謂詞結(jié)點(diǎn)之外的語句,計(jì)算F所得之值。
本發(fā)明允許程序中變量的數(shù)據(jù)類型為整數(shù)類型,實(shí)數(shù)類型,基本數(shù)據(jù)類型為整數(shù)類型或?qū)崝?shù)類型的數(shù)組、結(jié)構(gòu)等復(fù)合類型,以及指向上述各種類型的指針類型。
如果程序中包含了布爾類型的變量,就將其轉(zhuǎn)化為實(shí)數(shù)類型,用大于或等于零的數(shù)表示“真”值,用負(fù)數(shù)表示“假”值。如果一條路徑上的某分支謂詞中的條件表達(dá)式由兩個(gè)或兩個(gè)以上的布爾類型的變量的合取組成(如A∧B),那么就將這個(gè)分支謂詞視同在經(jīng)過該路徑時(shí)必須同時(shí)滿足的多個(gè)分支謂詞A≥0、B≥0。如果一條路徑上的某分支謂詞中的條件表達(dá)式由兩個(gè)或兩個(gè)以上的布爾變量的析取組成(如A∨B),那么在該路徑上一次只取一個(gè)分支謂詞A≥0或B≥0與其它分支謂詞一起考慮。如果用其中的一個(gè)沒找到解,就試另一個(gè)。
若分支謂詞為Exp1≠Exp2,則將其轉(zhuǎn)化為等價(jià)的形式(Exp1>Exp2)∨(Exp1<Exp2),然后按與布爾類型的變量的析取類似的方法進(jìn)行處理即可。
字符類型的變量的取值實(shí)質(zhì)上是取值范圍受限的整數(shù)值。對于字符類型的變量,用ASCII字符集將字符類型的值映射為整數(shù)類型,并引入附加的約束以限制它的整數(shù)解落在有效的取值范圍內(nèi),然后用ASCII字符集將整數(shù)解映射回相應(yīng)的字符類型的值。按類似的方法可以處理枚舉類型的變量。
W中允許包括函數(shù)調(diào)用或者可執(zhí)行程序調(diào)用,本發(fā)明將被調(diào)用的函數(shù)或可執(zhí)行程序視為黑盒,直接將調(diào)用語句放在W上。若黑盒中包含輸入語句,用戶還需提供黑盒的接口規(guī)范規(guī)定的黑盒中的輸入變量的個(gè)數(shù)及各輸入變量的數(shù)據(jù)類型。
本發(fā)明具體實(shí)現(xiàn)步驟是1.用戶從輸入接口指定程序路徑W、各輸入變量的初值和增量以及其它參數(shù)值,如W上的所有謂詞函數(shù)是否均為輸入變量的線性函數(shù)、當(dāng)W上的某謂詞函數(shù)為輸入變量的非線性函數(shù)時(shí)迭代求解的次數(shù)上限、以及當(dāng)W上存在黑盒且黑盒中包含輸入語句時(shí),根據(jù)黑盒的接口規(guī)范所規(guī)定的黑盒中的輸入變量的個(gè)數(shù)及各輸入變量的數(shù)據(jù)類型等。
2.詞法分析器對W進(jìn)行詞法分析后,語法分析器根據(jù)詞法分析的結(jié)果對W進(jìn)行語法分析,將W轉(zhuǎn)換為約束構(gòu)造程序和路徑滿足檢查程序,約束構(gòu)造程序經(jīng)編譯產(chǎn)生約束構(gòu)造器,路徑滿足檢查程序經(jīng)編譯產(chǎn)生路徑滿足檢查器。
3.約束構(gòu)造器根據(jù)當(dāng)前程序輸入和各輸入變量的增量執(zhí)行W上的語句,構(gòu)造W上各謂詞函數(shù)的線性算術(shù)表示,方法是用戶輸入程序路徑W、輸入變量的初值X=<x1,…,xt>和輸入變量的增量Y=<y1,…,yt>。對于W上的m個(gè)謂詞結(jié)點(diǎn)n1…,nm,依次令ni的謂詞函數(shù)的線性算術(shù)表示為L(i,X,Y,W)=di1v1+…+ditvt+ci,按照X依次執(zhí)行W上的ni之前的除謂詞結(jié)點(diǎn)之外的語句,計(jì)算ni的謂詞函數(shù)值Poldi,并且令ci=Poldi,其中i=1,...,m。然后計(jì)算各線性算術(shù)表示的系數(shù)值和常數(shù)項(xiàng),計(jì)算方法是對于W上的t個(gè)輸入變量v1,…,vt的初值x1,…,xt,依次將第j個(gè)輸入變量vj的值xj與其增量yj相加,其余輸入變量的值保持不變,將新的輸入記作Z,然后按照Z依次執(zhí)行W上的ni之前的除謂詞結(jié)點(diǎn)之外的語句,計(jì)算ni的謂詞函數(shù)值Pnewij,并且令dij=(Pnewij-Poldi)/yj,ci=ci-dij×xj,其中i=1,...,m,j=1,...,t。然后建立輸入變量的線性約束系統(tǒng)如果謂詞結(jié)點(diǎn)nj的分支謂詞F?0的值應(yīng)該為“真”,那么由nj的謂詞函數(shù)的線性算術(shù)表示L(i,X,Y,W)建立的線性約束為L(i,X,Y,W)?0,其中的關(guān)系操作符與F?0中的相同;如果謂詞結(jié)點(diǎn)ni的分支謂詞F?0的值應(yīng)該為“假”,那么由ni的謂詞函數(shù)的線性算術(shù)表示L(i,X,Y,W)建立的線性約束為L(i,X,Y,W)??0,其中的關(guān)系操作符“??”與F?0中的“?”相反,即當(dāng)“?”為“>”時(shí),“??”為“≤”;當(dāng)“?”為“≥”時(shí),“??”為“<”;當(dāng)“?”為“<”時(shí),“??”為“≥”;當(dāng)“?”為“≥”時(shí),“??”為“<”;當(dāng)“?”為“=”時(shí),“??”為“≠”,即(L(i,X,Y,W)>0)∨(L(i,X,Y,W)<0)。
4.約束求解器采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃和最小二乘解法相結(jié)合的方法求解該線性約束系統(tǒng)若用戶指定W上的謂詞函數(shù)均為輸入變量的線性函數(shù),則采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃方法求解;若用戶指定W上的謂詞函數(shù)中含有輸入變量的非線性函數(shù),則先采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃方法求解,若無法找到解,則將該線性約束系統(tǒng)轉(zhuǎn)換為線性方程系統(tǒng),求它的最小二乘解。
4.1若用戶指定W上的謂詞函數(shù)均為輸入變量的線性函數(shù),并且線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃方法找到解,則由路徑滿足檢查器進(jìn)行檢查,若該解能使W被經(jīng)過則從輸出接口輸出解,然后結(jié)束;若該解不能使W被經(jīng)過則從輸出接口給出求解精度可能不夠的警告,然后結(jié)束。
4.2若用戶指定W上的謂詞函數(shù)均為輸入變量的線性函數(shù),所有輸入變量均無整數(shù)限制,并且線性規(guī)劃方法找不到解,則從輸出接口給出W不可行的結(jié)論,然后結(jié)束。
4.3若用戶指定W上的謂詞函數(shù)均為輸入變量的線性函數(shù),某輸入變量有整數(shù)限制,并且線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃方法找不到解,則從輸出接口給出W可能不可行的結(jié)論,然后結(jié)束。
4.4若用戶指定W上的某謂詞函數(shù)為輸入變量的非線性函數(shù),則先采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃方法求解,若找到解,則由路徑滿足檢查器進(jìn)行檢查,若該解能使W被經(jīng)過則從輸出接口輸出解,然后結(jié)束;若該解不能使W被經(jīng)過,并且當(dāng)前迭代次數(shù)已經(jīng)達(dá)到用戶指定的迭代次數(shù)上限,則從輸出接口給出W可能不可行的結(jié)論,然后結(jié)束;若該解不能使W被經(jīng)過,并且當(dāng)前迭代次數(shù)尚未達(dá)到用戶指定的迭代次數(shù)上限,則當(dāng)前迭代次數(shù)加一,將該解作為新的當(dāng)前程序輸入,轉(zhuǎn)第3步進(jìn)行下次迭代。
4.5若用戶指定W上的謂詞函數(shù)中含有輸入變量的非線性函數(shù),則先采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃方法求解,若找不到解,則將該線性約束系統(tǒng)轉(zhuǎn)換為線性方程系統(tǒng),求它的最小二乘解。由路徑滿足檢查器進(jìn)行檢查,若該最小二乘解能使W被經(jīng)過則從輸出接口輸出該最小二乘解,然后結(jié)束;若該最小二乘解不能使W被經(jīng)過,并且當(dāng)前迭代次數(shù)已經(jīng)達(dá)到用戶指定的迭代次數(shù)上限,則從輸出接口給出W可能不可行的結(jié)論,然后結(jié)束;若該最小二乘解不能使W被經(jīng)過,并且當(dāng)前迭代次數(shù)尚未達(dá)到用戶指定的迭代次數(shù)上限,則當(dāng)前迭代次數(shù)加一,將最小二乘解作為新的當(dāng)前程序輸入,轉(zhuǎn)第3步進(jìn)行下次迭代。
采用本發(fā)明進(jìn)行軟件測試數(shù)據(jù)自動(dòng)生成可以達(dá)到如下有益效果1.無須分析程序路徑W上各語句之間的數(shù)據(jù)依賴關(guān)系,構(gòu)造線性約束系統(tǒng)的效率高,分析表明,Neelam Gupta等人提出的方法構(gòu)造線性約束系統(tǒng)的時(shí)間復(fù)雜性為O(k2·n+k·n·lmax·t),空間復(fù)雜性為O(k2·n),本發(fā)明構(gòu)造線性約束系統(tǒng)的時(shí)間復(fù)雜性和空間復(fù)雜性分別為O(k·t)和O(m·t),其中k,n,lmax,t,m分別表示W(wǎng)上的語句個(gè)數(shù)、被定值變量個(gè)數(shù)(即輸入變量個(gè)數(shù)與被賦值變量個(gè)數(shù)之和)、各謂詞結(jié)點(diǎn)的謂詞片中語句個(gè)數(shù)的最大值、輸入變量個(gè)數(shù)和謂詞結(jié)點(diǎn)個(gè)數(shù),并且m≤k,t≤n。
2.無須分析程序路徑W上各語句之間的數(shù)據(jù)依賴關(guān)系,生成測試數(shù)據(jù)的能力強(qiáng),不僅能夠用于白盒測試,而且能夠用于黑盒測試。當(dāng)W上有循環(huán)語句而且人們不關(guān)心循環(huán)體的內(nèi)部執(zhí)行情況時(shí),本發(fā)明能夠直接將該循環(huán)作為一個(gè)黑盒放在W上,不必將其展開。當(dāng)人們不關(guān)心W上判斷語句是執(zhí)行“真”分支還是“假”分支時(shí),本發(fā)明同樣可以直接將該判斷語句作為一個(gè)黑盒放在W上。當(dāng)W上存在函數(shù)調(diào)用或可執(zhí)行程序調(diào)用時(shí),本發(fā)明可以將被調(diào)用的函數(shù)體或可執(zhí)行程序視為黑盒,不必在調(diào)用處展開,從而進(jìn)一步提高了效率。本發(fā)明能夠直接處理goto語句。
3.約束求解器采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃和最小二乘解法相結(jié)合的方法求解線性約束系統(tǒng),結(jié)合了線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃和最小二乘解法的優(yōu)點(diǎn),通用性好,對于謂詞函數(shù)均為輸入變量的線性函數(shù)或者謂詞函數(shù)中含有輸入變量的非線性函數(shù)的一些程序路徑能夠有效地找到解。
4.當(dāng)程序路徑W上各謂詞函數(shù)均為輸入變量的線性函數(shù)且所有輸入變量均無整數(shù)限制時(shí),迭代一次后,本發(fā)明或者能找到所需的測試數(shù)據(jù),或者保證該程序路徑不可行。
5.可移植性好,不受程序設(shè)計(jì)語言和操作系統(tǒng)的限制,易于移植到各種程序設(shè)計(jì)語言和操作系統(tǒng)。
6.適用范圍廣,能夠用于單元測試、集成(組裝)測試等階段以及面向斷言的測試數(shù)據(jù)自動(dòng)生成和回歸測試數(shù)據(jù)的自動(dòng)生成。
圖1是本發(fā)明總體邏輯結(jié)構(gòu)圖。
圖2是本發(fā)明的總流程圖。
圖3是本發(fā)明構(gòu)造線性算術(shù)表示的示意圖。
圖4是本發(fā)明求解線性約束系統(tǒng)的示意圖。
具體實(shí)施例方式圖1是本發(fā)明總體邏輯結(jié)構(gòu)圖。本發(fā)明由輸入接口、詞法分析器、語法分析器、約束構(gòu)造器、約束求解器、路徑滿足檢查器、輸出接口模塊實(shí)現(xiàn)測試數(shù)據(jù)自動(dòng)生成。其總體邏輯結(jié)構(gòu)是用戶指定程序路徑W,詞法分析器對W進(jìn)行詞法分析后,語法分析器根據(jù)詞法分析的結(jié)果對W進(jìn)行語法分析,將W轉(zhuǎn)換為約束構(gòu)造程序和路徑滿足檢查程序,約束構(gòu)造程序經(jīng)編譯產(chǎn)生約束構(gòu)造器,路徑滿足檢查程序經(jīng)編譯產(chǎn)生路徑滿足檢查器;約束構(gòu)造器根據(jù)當(dāng)前程序輸入和各輸入變量的增量執(zhí)行W上的語句,不分析W上的語句之間的數(shù)據(jù)依賴關(guān)系,計(jì)算W上各謂詞函數(shù)的線性算術(shù)表示,然后建立輸入變量的線性約束系統(tǒng);約束求解器采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃和最小二乘解法相結(jié)合的方法求解線性約束系統(tǒng);求解后獲得新的程序輸入即測試數(shù)據(jù);最后由路徑滿足檢查器進(jìn)行檢查,若該程序輸入能使W被經(jīng)過則結(jié)束,若該程序輸入不能使W被經(jīng)過則根據(jù)W上所有謂詞函數(shù)是否為輸入變量的線性函數(shù)以及迭代次數(shù)上限決定是否繼續(xù)迭代求解;求解結(jié)果由輸出接口輸出。
圖2是本發(fā)明的總流程圖,圖4描述了本發(fā)明求解線性約束系統(tǒng)的方法。本發(fā)明實(shí)現(xiàn)步驟是1.用戶從輸入接口指定程序路徑W、各輸入變量的初值和增量以及其它參數(shù)值,如W上的所有謂詞函數(shù)是否均為輸入變量的線性函數(shù)、當(dāng)W上的某謂詞函數(shù)為輸入變量的非線性函數(shù)時(shí)迭代求解的次數(shù)上限、以及當(dāng)W上存在黑盒且黑盒中包含輸入語句時(shí),根據(jù)黑盒的接口規(guī)范所規(guī)定的黑盒中的輸入變量的個(gè)數(shù)及各輸入變量的數(shù)據(jù)類型等。
2.詞法分析器對W進(jìn)行詞法分析后,語法分析器根據(jù)詞法分析的結(jié)果對W進(jìn)行語法分析,將W轉(zhuǎn)換為約束構(gòu)造程序和路徑滿足檢查程序,約束構(gòu)造程序經(jīng)編譯產(chǎn)生約束構(gòu)造器,路徑滿足檢查程序經(jīng)編譯產(chǎn)生路徑滿足檢查器。
3.約束構(gòu)造器根據(jù)當(dāng)前程序輸入和各輸入變量的增量執(zhí)行W上的語句,計(jì)算W上各謂詞函數(shù)的線性算術(shù)表示,建立輸入變量的線性約束系統(tǒng)。
4.約束求解器采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃和最小二乘解法相結(jié)合的方法求解該線性約束系統(tǒng),如圖4若用戶指定W上的謂詞函數(shù)均為輸入變量的線性函數(shù),則采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃方法求解;若用戶指定W上的謂詞函數(shù)中含有輸入變量的非線性函數(shù),則先采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃方法求解,若無法找到解,則將該線性約束系統(tǒng)轉(zhuǎn)換為線性方程系統(tǒng),求它的最小二乘解。
4.1若用戶指定W上的謂詞函數(shù)均為輸入變量的線性函數(shù),并且線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃方法找到解,則由路徑滿足檢查器進(jìn)行檢查,若該解能使W被經(jīng)過則從輸出接口輸出解,然后結(jié)束;若該解不能使W被經(jīng)過則從輸出接口給出求解精度可能不夠的警告,然后結(jié)束。
4.2若用戶指定W上的謂詞函數(shù)均為輸入變量的線性函數(shù),所有輸入變量均無整數(shù)限制,并且線性規(guī)劃方法找不到解,則從輸出接口給出W不可行的結(jié)論,然后結(jié)束。
4.3若用戶指定W上的謂詞函數(shù)均為輸入變量的線性函數(shù),某輸入變量有整數(shù)限制,并且線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃方法找不到解,則從輸出接口給出W可能不可行的結(jié)論,然后結(jié)束。
4.4若用戶指定W上的某謂詞函數(shù)為輸入變量的非線性函數(shù),則先采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃方法求解,若找到解,則由路徑滿足檢查器進(jìn)行檢查,若該解能使W被經(jīng)過則從輸出接口輸出解,然后結(jié)束;若該解不能使W被經(jīng)過,并且當(dāng)前迭代次數(shù)已經(jīng)達(dá)到用戶指定的迭代次數(shù)上限,則從輸出接口給出W可能不可行的結(jié)論,然后結(jié)束;若該解不能使W被經(jīng)過,并且當(dāng)前迭代次數(shù)尚未達(dá)到用戶指定的迭代次數(shù)上限,則當(dāng)前迭代次數(shù)加一,將該解作為新的當(dāng)前程序輸入,轉(zhuǎn)第3步進(jìn)行下次迭代。
4.5若用戶指定W上的謂詞函數(shù)中含有輸入變量的非線性函數(shù),則先采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃方法求解,若找不到解,則將該線性約束系統(tǒng)轉(zhuǎn)換為線性方程系統(tǒng),求它的最小二乘解。由路徑滿足檢查器進(jìn)行檢查,若該最小二乘解能使W被經(jīng)過則從輸出接口輸出該最小二乘解,然后結(jié)束;若該最小二乘解不能使W被經(jīng)過,并且當(dāng)前迭代次數(shù)已經(jīng)達(dá)到用戶指定的迭代次數(shù)上限,則從輸出接口給出W可能不可行的結(jié)論,然后結(jié)束;若該最小二乘解不能使W被經(jīng)過,并且當(dāng)前迭代次數(shù)尚未達(dá)到用戶指定的迭代次數(shù)上限,則當(dāng)前迭代次數(shù)加一,將最小二乘解作為新的當(dāng)前程序輸入,轉(zhuǎn)第3步進(jìn)行下次迭代。
圖3描述了本發(fā)明構(gòu)造線性算術(shù)表示的方法。用戶輸入程序路徑W、輸入變量的初值X=<x1,…,xt>和輸入變量的增量Y=<y1,…,yt>。對于W上的m個(gè)謂詞結(jié)點(diǎn)n1,…,nm,依次令ni的謂詞函數(shù)的線性算術(shù)表示為L(i,X,Y,W)=di1v1+…+ditvt+ci,按照X依次執(zhí)行W上的ni之前的除謂詞結(jié)點(diǎn)之外的語句,計(jì)算ni的謂詞函數(shù)值Poldi,并且令ci=Poldi,其中i=1,...,m。然后計(jì)算各線性算術(shù)表示的系數(shù)值和常數(shù)項(xiàng),計(jì)算方法是對于W上的t個(gè)輸入變量v1,…,vt的初值x1,…,xt,依次將第j個(gè)輸入變量vj的值xj與其增量yj相加,其余輸入變量的值保持不變,將新的輸入記作Z,然后按照Z依次執(zhí)行W上的ni之前的除謂詞結(jié)點(diǎn)之外的語句,計(jì)算ni的謂詞函數(shù)值Pnewij,并且令dij=(Pnewij-Poldi)/yj,ci=ci-dij×xj,其中i=1,...,m,j=1,...,t。
根據(jù)軟件工程的思想,本發(fā)明采用面向?qū)ο蟮姆椒?,使用UML進(jìn)行設(shè)計(jì),在Windows98操作系統(tǒng)下用C++語言和Java語言對本發(fā)明進(jìn)行了實(shí)現(xiàn),開發(fā)出為C語言和Java語言程序路徑自動(dòng)生成測試數(shù)據(jù)的原型工具(Path-wise Test Data Generator,簡稱PTDG)。
在以下函數(shù)中,對于一個(gè)具有十個(gè)元素的數(shù)組X,其中各元素的值是任意輸入的,要求采用冒泡排序方法對X中各元素進(jìn)行排序,使得各元素按不減序排列,即X
<=X[1]<=X[2]<=X[3]<=X[4]<=X[5]<=X[6]<=X[7]<=X[8]<=X[9]。但是在該函數(shù)中存在一個(gè)錯(cuò)誤,即外層循環(huán)的結(jié)束條件“i<=7”應(yīng)為“i<=8”。
<pre listing-type="program-listing">void Bubble_Sort(int X[]) { int temp,i,j;<!-- SIPO <DP n="10"> --><dp n="d10"/> scanf(″%d%d%d%d%d%d%d%d%d%d″, &amp;X
, &amp;X[1], &amp;X[2], &amp;X[3], &amp;X[4], &amp;X[5], &amp;X[6], &amp;X[7], &amp;X[8], &amp;X[9]); for(i=0;i<=7;i++) for(j=0;j<=8;j++) if(X[j]>X[j+1]){ temp=X [j]; X[j]=X[j+1]; X[j+1]=temp;} }</pre>當(dāng)在以下程序路徑W1=<n1,n2,n3>中調(diào)用該函數(shù),n1int X[10];n2Bubble_Sort(X);n3@X
>X[1]@PTDG從初始輸入<X
=X[1]=X[2]=X[3]=X[4]=X[5]=X[6]=X[7]=X[8]=X[9]=1>出發(fā),假設(shè)各輸入變量的增量為<1,1,1,1,1,1,1,1,1,-1>,經(jīng)過兩次迭代能夠找到使W1被經(jīng)過的程序輸入<X
=X[1]=X[2]=X[3]=X[4]=X[5]=X[6]=X[7]=X[8]=0,X[9]=-1>。
上述結(jié)果表明,存在程序輸入<X
=X[1]=X[2]=X[3]=X[4]=X[5]=X[6]=X[7]=X[8]=0,X[9]=-1>,當(dāng)按照這組輸入執(zhí)行W1時(shí),W1是可行的,即調(diào)用函數(shù)Bubble_Sort后,會出現(xiàn)“X
>X[1]”的結(jié)果,故違反了設(shè)計(jì)要求,從而發(fā)現(xiàn)函數(shù)中存在錯(cuò)誤。上述結(jié)果也表明PTDG可以直接處理函數(shù)調(diào)用。進(jìn)一步的實(shí)驗(yàn)表明當(dāng)Bubble_Sort的函數(shù)體儀為目標(biāo)代碼而無源代碼時(shí),PTDG仍然能夠找到相同的解,而Neelam Gupta等人提出的方法則無法構(gòu)造線性算術(shù)表示。因此本發(fā)明能夠用于黑盒測試。
在以下程序中,謂詞函數(shù)中含有輸入變量的非線性函數(shù)“x*x”。
n1float x;n2scanf(″%f″,&x);n3if(x<-1)n4if(x*x>0)
n5printf(″Ok!″);n6else printf(″No.″);n7else printf(″No.″);對于其中的路徑W2=<n1,n2,n3,n4,n5>,從初始輸入x=1出發(fā),假設(shè)輸入變量x的增量為1,PTDG所得到的如下線性約束系統(tǒng)n3x+1<0n43x-2>0是矛盾的,儀采用基于線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃的約束求解方法無法進(jìn)行求解,PTDG采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃和最小二乘解法相結(jié)合的約束求解方法卻能夠經(jīng)過六次迭代找到使W2被經(jīng)過的程序輸入-1.388210。由此可見本發(fā)明強(qiáng)大的尋找測試數(shù)據(jù)的能力。
發(fā)明人還用其它一些實(shí)際的程序路徑對PTDG進(jìn)行實(shí)驗(yàn)。實(shí)驗(yàn)結(jié)果表明PTDG能夠處理的程序中的語句包括順序、條件、循環(huán)、轉(zhuǎn)移等語句,其中順序語句包括說明語句、賦值語句、輸入語句、輸出語句等;能夠?yàn)檎麛?shù)類型、浮點(diǎn)類型、雙精度浮點(diǎn)類型的輸入變量生成測試數(shù)據(jù);可以直接處理數(shù)組、結(jié)構(gòu)、指針和函數(shù)調(diào)用。并且可以擴(kuò)充為支持布爾類型、字符類型、枚舉類型。另外的實(shí)驗(yàn)表明PTDG能夠用于面向斷言的測試以及回歸測試等場合的測試數(shù)據(jù)自動(dòng)生成。
人們通常分單元測試、組裝測試、確認(rèn)測試等階段對大型軟件進(jìn)行測試。本發(fā)明可以直接應(yīng)用在單元測試的控制流測試中諸如語句覆蓋、分支覆蓋、條件覆蓋、判定-條件覆蓋、路徑覆蓋等,數(shù)據(jù)流測試中的定義覆蓋、引用覆蓋等方面。由于本發(fā)明能夠用于黑盒測試,故本發(fā)明支持更高層次的軟件測試,譬如組裝測試中的調(diào)用對覆蓋、數(shù)據(jù)流測試。本發(fā)明也可以用于面向斷言的測試以及回歸測試等方面。
權(quán)利要求
1.一種面向路徑的測試數(shù)據(jù)自動(dòng)生成方法,由輸入接口、詞法分析器、語法分析器、約束構(gòu)造器、約束求解器、路徑滿足檢查器、輸出接口模塊實(shí)現(xiàn)測試數(shù)據(jù)自動(dòng)生成,其特征在于其實(shí)現(xiàn)步驟是[1]用戶從輸入接口指定程序路徑W、各輸入變量的初值和增量以及其它參數(shù)值,如W上的所有謂詞函數(shù)是否均為輸入變量的線性函數(shù)、當(dāng)W上的某謂詞函數(shù)為輸入變量的非線性函數(shù)時(shí)迭代求解的次數(shù)上限、以及當(dāng)W上存在黑盒且黑盒中包含輸入語句時(shí),根據(jù)黑盒的接口規(guī)范所規(guī)定的黑盒中的輸入變量的個(gè)數(shù)及各輸入變量的數(shù)據(jù)類型等;[2]詞法分析器對W進(jìn)行詞法分析后,語法分析器根據(jù)詞法分析的結(jié)果對W進(jìn)行語法分析,將W轉(zhuǎn)換為約束構(gòu)造程序和路徑滿足檢查程序,約束構(gòu)造程序經(jīng)編譯產(chǎn)生約束構(gòu)造器,路徑滿足檢查程序經(jīng)編譯產(chǎn)生路徑滿足檢查器;[3]約束構(gòu)造器根據(jù)當(dāng)前程序輸入和各輸入變量的增量執(zhí)行W上的語句,不分析W上的語句之間的數(shù)據(jù)依賴關(guān)系,構(gòu)造W上各謂詞函數(shù)的線性算術(shù)表示,然后建立輸入變量的線性約束系統(tǒng);[4]約束求解器采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃和最小二乘解法相結(jié)合的方法求解該線性約束系統(tǒng)若用戶指定W上的謂詞函數(shù)均為輸入變量的線性函數(shù),則采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃方法求解;若用戶指定W上的謂詞函數(shù)中含有輸入變量的非線性函數(shù),則先采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃方法求解,若無法找到解,則將該線性約束系統(tǒng)轉(zhuǎn)換為線性方程系統(tǒng),求它的最小二乘解;求解后獲得新的程序輸入即測試數(shù)據(jù);最后由路徑滿足檢查器進(jìn)行檢查,若該程序輸入能使W被經(jīng)過則結(jié)束,若該程序輸入不能使W被經(jīng)過則根據(jù)W上所有謂詞函數(shù)是否為輸入變量的線性函數(shù)以及迭代次數(shù)上限決定是否繼續(xù)迭代求解;求解結(jié)果由輸出接口輸出。
2.權(quán)利要求1所述的一種面向路徑的測試數(shù)據(jù)自動(dòng)生成方法,其特征在于所述約束構(gòu)造器構(gòu)造W上各謂詞函數(shù)的線性算術(shù)表示的方法是用戶輸入程序路徑W、輸入變量的初值X=<x1,…,xt>和輸入變量的增量Y=<y1,…,yt>;對于W上的m個(gè)謂詞結(jié)點(diǎn)n1,.…,nm,依次令ni的謂詞函數(shù)的線性算術(shù)表示為L(i,X,Y,W)=di1v1+…+ditvt+ci,按照X依次執(zhí)行W上的ni之前的除謂詞結(jié)點(diǎn)之外的語句,計(jì)算ni的謂詞函數(shù)值Poldi,并且令ci=Poldi,其中i=1,...,m;然后計(jì)算各線性算術(shù)表示的系數(shù)值和常數(shù)項(xiàng),計(jì)算方法是對于W上的t個(gè)輸入變量v1,…,vt的初值x1,…,xt,依次將第j個(gè)輸入變量vj的值xj與其增量yj相加,其余輸入變量的值保持不變,將新的輸入記作Z,然后按照Z依次執(zhí)行W上的ni之前的除渭詞結(jié)點(diǎn)之外的語句,計(jì)算ni的謂詞函數(shù)值Pnewij,并且令dij=(Pnewij-Poldi)/yi,ci=ci-dij×xj,其中i=1,...,m,j=1,...,t;然后建立輸入變量的線性約束系統(tǒng)如果渭詞結(jié)點(diǎn)ni的分支調(diào)詞F?0的值應(yīng)該為“真”,那么由ni的謂詞函數(shù)的線性算術(shù)表示L(i,X,Y,W,)建立的線性約束為L(i,X,Y,W)?0,其中的關(guān)系操作符與F?0中的相同;如果謂詞結(jié)點(diǎn)ni的分支謂詞F?0的值應(yīng)該為“假”,那么由ni的謂詞函數(shù)的線性算術(shù)表示L(i,X,Y,W)建立的線性約束為L(i,X,Y,W)??0,其中的關(guān)系操作符“??”與F?0中的“?”相反,即當(dāng)“?”為“>”時(shí),“??”為“≤”;當(dāng)“?”為“≥”時(shí),“??”為“<”;當(dāng)“?”為“<”時(shí),“??”為“≥”;當(dāng)“?”為“≥”時(shí),“??”為“<”;當(dāng)“?”為“=”時(shí),“??”為“≠”,即(L(i,X,Y,W)>0)∨(L(i,X,Y,W)<0)。
3.如權(quán)利要求1所述的一種面向路徑的測試數(shù)據(jù)自動(dòng)生成方法,其特征在于所述線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃和最小二乘解法相結(jié)合的方法求解線性約束系統(tǒng)的過程是3.1若用戶指定W上的謂詞函數(shù)均為輸入變量的線性函數(shù),并且線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃方法找到解,則由路徑滿足檢查器進(jìn)行檢查,若該解能使W被經(jīng)過則從輸出接口輸出解,然后結(jié)束;若該解不能使W被經(jīng)過則從輸出接口給出求解精度可能不夠的警告,然后結(jié)束;3.2若用戶指定W上的謂詞函數(shù)均為輸入變量的線性函數(shù),所有輸入變量均無整數(shù)限制,并且線性規(guī)劃方法找不到解,則從輸出接口給出W不可行的結(jié)論,然后結(jié)束;3.3若用戶指定W上的謂詞函數(shù)均為輸入變量的線性函數(shù),某輸入變量有整數(shù)限制,并且線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃方法找不到解,則從輸出接口給出W可能不可行的結(jié)論,然后結(jié)束;3.4若用戶指定W上的某謂詞函數(shù)為輸入變量的非線性函數(shù),則先采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃方法求解,若找到解,則由路徑滿足檢查器進(jìn)行檢查,若該解能使W被經(jīng)過則從輸出接口輸出解,然后結(jié)束;若該解不能使W被經(jīng)過,并且當(dāng)前迭代次數(shù)已經(jīng)達(dá)到用戶指定的迭代次數(shù)上限,則從輸出接口給出W可能不可行的結(jié)論,然后結(jié)束;若該解不能使W被經(jīng)過,并且當(dāng)前迭代次數(shù)尚未達(dá)到用戶指定的迭代次數(shù)上限,則當(dāng)前迭代次數(shù)加一,將該解作為新的當(dāng)前程序輸入,轉(zhuǎn)第[3]步進(jìn)行下次迭代;3.5若用戶指定W上的調(diào)詞函數(shù)中含有輸入變量的非線性函數(shù),則先采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃方法求解,若找不到解,則將該線性約束系統(tǒng)轉(zhuǎn)換為線性方程系統(tǒng),求它的最小二乘解;山路徑滿足檢查器進(jìn)行檢查,若該最小二乘解能使W被經(jīng)過則從輸出接口輸出該最小二乘解,然后結(jié)束;若該最小二乘解不能使W被經(jīng)過,并且當(dāng)前迭代次數(shù)已經(jīng)達(dá)到用戶指定的迭代次數(shù)上限,則從輸出接口給出W可能不可行的結(jié)論,然后結(jié)束;若該最小二乘解不能使W被經(jīng)過,并且當(dāng)前迭代次數(shù)尚未達(dá)到用戶指定的迭代次數(shù)上限,則當(dāng)前迭代次數(shù)加一,將最小二乘解作為新的當(dāng)前程序輸入,轉(zhuǎn)第[3]步進(jìn)行下次迭代。
全文摘要
本發(fā)明公開了一種面向路徑的測試數(shù)據(jù)自動(dòng)生成方法,目的是提出一種無數(shù)據(jù)依賴關(guān)系分析的能夠用于白盒、黑盒的測試數(shù)據(jù)自動(dòng)生成的方法。本發(fā)明約束構(gòu)造器根據(jù)當(dāng)前程序輸入和各輸入變量的增量執(zhí)行路徑W上的語句,不分析W上的語句之間的數(shù)據(jù)依賴關(guān)系,構(gòu)造W上各謂詞函數(shù)的線性算術(shù)表示,然后建立輸入變量的線性約束系統(tǒng);約束求解器采用線性規(guī)劃、線性整數(shù)規(guī)劃、線性混合整數(shù)規(guī)劃和最小二乘解法相結(jié)合的方法求解線性約束系統(tǒng),經(jīng)過若干次迭代尋找所需的測試數(shù)據(jù)。本發(fā)明構(gòu)造線性約束系統(tǒng)的效率高,生成測試數(shù)據(jù)的能力強(qiáng),既能用于白盒測試,又能用于黑盒測試;通用性和可移植性好,適用范圍廣。
文檔編號G06F11/36GK1402133SQ0213961
公開日2003年3月12日 申請日期2002年9月13日 優(yōu)先權(quán)日2002年9月13日
發(fā)明者單錦輝, 王戟, 齊治昌 申請人:中國人民解放軍國防科學(xué)技術(shù)大學(xué)