基于迭代的區(qū)間運(yùn)算的軟件測(cè)試用例自動(dòng)生成方法及系統(tǒng)的制作方法
【專利摘要】本發(fā)明涉及一種基于迭代的區(qū)間運(yùn)算的軟件測(cè)試用例自動(dòng)生成方法及系統(tǒng),包括:S1、讀取待測(cè)程序中的預(yù)定路徑,通過遍歷所述待測(cè)程序的控制流圖得到所述預(yù)定路徑的各個(gè)變量的變量取值區(qū)間;S2、將所述變量取值區(qū)間通過迭代的區(qū)間運(yùn)算遍歷所述控制流圖,得到各個(gè)所述變量的初始穩(wěn)定變量取值區(qū)間;S3、對(duì)所述初始穩(wěn)定變量取值區(qū)間中的無窮變量取值區(qū)間進(jìn)行初始化處理,通過迭代的區(qū)間運(yùn)算遍歷所述控制流圖,并將運(yùn)算結(jié)果保存到所述初始穩(wěn)定變量取值區(qū)間;S4、根據(jù)預(yù)設(shè)的機(jī)制對(duì)變量進(jìn)行排序,并確定當(dāng)前變量;S5、對(duì)所述當(dāng)前變量的初始穩(wěn)定變量取值區(qū)間進(jìn)行回退運(yùn)算、迭代的區(qū)間運(yùn)算及回溯運(yùn)算,生成測(cè)試用例;S6、對(duì)生成的所述測(cè)試用例進(jìn)行驗(yàn)證。
【專利說明】基于迭代的區(qū)間運(yùn)算的軟件測(cè)試用例自動(dòng)生成方法及系統(tǒng)
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及軟件測(cè)試技術(shù),尤其涉及一種基于迭代的區(qū)間運(yùn)算的軟件測(cè)試用例自 動(dòng)生成方法及系統(tǒng)。
【背景技術(shù)】
[0002] 軟件測(cè)試是在軟件投入運(yùn)行前,對(duì)軟件需求分析、設(shè)計(jì)規(guī)格說明和編碼的最終復(fù) 審,是軟件質(zhì)量保證的關(guān)鍵步驟。統(tǒng)計(jì)表明,軟件測(cè)試與維護(hù)的費(fèi)用要占到整個(gè)軟件開發(fā) 費(fèi)用的50%以上。在軟件測(cè)試中,不少測(cè)試方法包含著大量的人工操作,這些操作在手工 完成時(shí)令人厭煩且容易出錯(cuò),更有甚者,用手工計(jì)算已經(jīng)超出了問題的范圍或者用手工方 法是完全行不通的。為了減少人工測(cè)試的成本并提高測(cè)試的可靠性,研究人員一直致力于 實(shí)現(xiàn)測(cè)試自動(dòng)化,而其中一個(gè)重要的活動(dòng)就是自動(dòng)生成測(cè)試用例。
[0003] 在眾多的軟件測(cè)試方法中,面向路徑的測(cè)試用例生成問題(簡(jiǎn)稱為問題Q)可以 描述為:給定一個(gè)程序或者程序模塊P和P中任意一條路徑W,一個(gè)變量Xi如果出現(xiàn)在 程序模塊P的一個(gè)輸入聲明中或者是P的一個(gè)輸入?yún)?shù),則稱xi為P的一個(gè)輸入變量。 輸入變量xi的定義域Dxi為xi所有可能的取值集合。一個(gè)輸入向量X= {xl,x2,…, xm} G (DxlXDx2X-XDxm)稱為程序模塊P的一個(gè)程序輸入,簡(jiǎn)稱為P的一個(gè)輸入,其中 m為P中輸入變量的個(gè)數(shù)。設(shè)P的所有輸入數(shù)據(jù)表示為解空間D,求X e D,其目標(biāo)是在測(cè)試 結(jié)束時(shí),使得以X為輸入運(yùn)行程序模塊P,程序沿路徑W運(yùn)行。研究表明,對(duì)于任意的P和W, 不存在通用的有效算法求解x,并且無法保證W -定是可達(dá)路徑,在生成測(cè)試用例過程中需 要對(duì)W的可達(dá)性進(jìn)行判斷。目前路徑W的測(cè)試用例生成主要是靠人工來完成,需要大量的 時(shí)間。在很多情況下,如果路徑W比較復(fù)雜,例如,包括的分支比較多,或者分支比較復(fù)雜, 人工生成測(cè)試用例幾乎是不大可能的。
[0004] 在目前國(guó)內(nèi)外從事軟件測(cè)試的企業(yè)中,大都采用人工方式或計(jì)算機(jī)輔助方式生成 用例。這兩種生成測(cè)試用例方法的缺點(diǎn)是:1)生成用例需要花費(fèi)大量的時(shí)間,測(cè)試效率低; 2)需要專業(yè)的軟件測(cè)試人員,并且需要該人員對(duì)被測(cè)軟件很熟悉;3)測(cè)試效果可信度低。
【發(fā)明內(nèi)容】
[0005] 本發(fā)明提供一種基于迭代的區(qū)間運(yùn)算的軟件測(cè)試用例自動(dòng)生成方法及系統(tǒng),能夠 按照給定的待測(cè)軟件程序的控制流圖,針對(duì)指定路徑生成符合要求的測(cè)試用例,提高了軟 件測(cè)試的效率與自動(dòng)化程度。同時(shí)對(duì)測(cè)試用例生成過程中的區(qū)間運(yùn)算進(jìn)行迭代處理,以達(dá) 到不可達(dá)路徑檢測(cè)和變量取值區(qū)間削減的目的。
[0006] 根據(jù)上述目的,本發(fā)明提供了一種基于迭代的區(qū)間運(yùn)算的軟件測(cè)試用例自動(dòng)生成 方法,所述方法包括:
[0007] S1、讀取待測(cè)程序中的預(yù)定路徑,通過遍歷所述待測(cè)程序的控制流圖得到所述預(yù) 定路徑的各個(gè)變量的變量取值區(qū)間;
[0008] S2、將所述變量取值區(qū)間通過迭代的區(qū)間運(yùn)算遍歷所述控制流圖,得到各個(gè)所述 變量的初始穩(wěn)定變量取值區(qū)間;
[0009] S3、對(duì)所述初始穩(wěn)定變量取值區(qū)間中的無窮變量取值區(qū)間進(jìn)行初始化處理,通過 迭代的區(qū)間運(yùn)算遍歷所述控制流圖,并將運(yùn)算結(jié)果保存到所述初始穩(wěn)定變量取值區(qū)間;
[0010] S4、根據(jù)預(yù)設(shè)的機(jī)制對(duì)變量進(jìn)行排序,并確定當(dāng)前變量;
[0011] S5、對(duì)所述當(dāng)前變量的初始穩(wěn)定變量取值區(qū)間進(jìn)行回退運(yùn)算、迭代的區(qū)間運(yùn)算及 回溯運(yùn)算,生成測(cè)試用例;
[0012]S6、對(duì)生成的所述測(cè)試用例進(jìn)行驗(yàn)證。
[0013] 其中,所述步驟S2具體包括:
[0014] S21、將各個(gè)所述變量以及對(duì)應(yīng)的變量取值區(qū)間傳入所述控制流圖的入口節(jié)點(diǎn),通 過遍歷所述控制流圖進(jìn)行區(qū)間運(yùn)算;
[0015] S22、當(dāng)任一所述變量的當(dāng)前區(qū)間運(yùn)算發(fā)生矛盾,則判定路徑不可達(dá),結(jié)束所述當(dāng) 前區(qū)間運(yùn)算;
[0016] S23、當(dāng)所有所述變量的當(dāng)前區(qū)間運(yùn)算不矛盾,判斷當(dāng)前區(qū)間運(yùn)算結(jié)果與上一次區(qū) 間運(yùn)算的結(jié)果是否相同;
[0017] S24、如果任一所述變量的當(dāng)前區(qū)間運(yùn)算結(jié)果和所述上一次區(qū)間運(yùn)算結(jié)果不同,判 斷任一所述變量的當(dāng)前區(qū)間運(yùn)算的結(jié)果比所述上一次區(qū)間運(yùn)算的結(jié)果是否有縮小,若有縮 小則將所有所述變量的當(dāng)前區(qū)間運(yùn)算結(jié)果設(shè)置為新的輸入條件,返回步驟S21繼續(xù)進(jìn)行區(qū) 間運(yùn)算,若沒有縮小,結(jié)束當(dāng)前區(qū)間運(yùn)算;
[0018] S25、如果所有所述變量的當(dāng)前區(qū)間運(yùn)算結(jié)果和所述上一次區(qū)間運(yùn)算結(jié)果相同,則 將各個(gè)所述變量的當(dāng)前變量取值區(qū)間進(jìn)行壓縮并保存到所述各個(gè)變量的初始穩(wěn)定變量取 值區(qū)間中。
[0019] 其中,所述步驟S3具體包括:
[0020]S31、對(duì)各個(gè)所述變量的初始穩(wěn)定變量取值區(qū)間中的無窮變量取值區(qū)間按照區(qū)間 初始化策略進(jìn)行壓縮,形成各個(gè)所述變量的有界變量取值區(qū)間;
[0021] S32、將各個(gè)所述變量和對(duì)應(yīng)的有界變量取值區(qū)間傳入到所述控制流圖的入口節(jié) 點(diǎn),通過遍歷所述控制流圖進(jìn)行區(qū)間運(yùn)算;
[0022] S33、當(dāng)任一所述變量的當(dāng)前區(qū)間運(yùn)算發(fā)生矛盾則將發(fā)生矛盾的有界變量取值區(qū) 間的邊界進(jìn)行放大,然后重新執(zhí)行步驟S32;
[0023] S34、當(dāng)所有所述變量的當(dāng)前區(qū)間運(yùn)算不矛盾,判斷當(dāng)前區(qū)間運(yùn)算結(jié)果與上一次區(qū) 間運(yùn)算的結(jié)果是否相同;
[0024] S35、如果任一所述變量的當(dāng)前區(qū)間運(yùn)算結(jié)果和所述上一次區(qū)間運(yùn)算結(jié)果不同,判 斷任一所述變量的當(dāng)前區(qū)間運(yùn)算的結(jié)果比所述上一次區(qū)間運(yùn)算的結(jié)果是否有縮小,若有縮 小則將所有所述變量的當(dāng)前區(qū)間運(yùn)算結(jié)果設(shè)置為新的輸入條件,返回步驟S32繼續(xù)進(jìn)行區(qū) 間運(yùn)算,若沒有縮小,結(jié)束當(dāng)前區(qū)間運(yùn)算;
[0025] S36、如果所有所述變量的當(dāng)前區(qū)間運(yùn)算結(jié)果和上一次區(qū)間運(yùn)算結(jié)果相同,則將各 個(gè)所述變量的當(dāng)前區(qū)間運(yùn)算壓縮并保存到所述初始穩(wěn)定變量取值區(qū)間。
[0026] 其中,所述步驟S5具體包括:
[0027] S51、為所述當(dāng)前變量選擇回退值;
[0028] S52,將所述回退值傳入所述控制流圖的入口節(jié)點(diǎn),通過遍歷所述控制流圖進(jìn)行區(qū) 間運(yùn)算;
[0029] S53、判斷當(dāng)前區(qū)間運(yùn)算是否發(fā)生矛盾,發(fā)生則進(jìn)行步驟S54,否則執(zhí)行步驟S56;
[0030] S54、根據(jù)矛盾信息選取下一回退值,然后執(zhí)行步驟S52判斷是否發(fā)生矛盾,當(dāng)所 述當(dāng)前變量的所有回退值的區(qū)間運(yùn)算都發(fā)生矛盾時(shí),執(zhí)行步驟S55;
[0031] S55、對(duì)當(dāng)前變量進(jìn)行回溯,然后重新為所述當(dāng)前變量選取回退值,并執(zhí)行步驟 S52,當(dāng)回溯后的所述當(dāng)前變量的所有回退值的區(qū)間運(yùn)算都發(fā)生矛盾時(shí),結(jié)束運(yùn)算;
[0032] S56、當(dāng)區(qū)間運(yùn)算不矛盾,判斷當(dāng)前區(qū)間運(yùn)算結(jié)果與上一次區(qū)間運(yùn)算的結(jié)果是否相 同;
[0033] S57、如果任一所述變量的當(dāng)前區(qū)間運(yùn)算結(jié)果和所述上一次區(qū)間運(yùn)算結(jié)果不同,判 斷任一所述變量的當(dāng)前區(qū)間運(yùn)算的結(jié)果比所述上一次區(qū)間運(yùn)算的結(jié)果是否有縮小,若有縮 小則將所有所述變量的當(dāng)前區(qū)間運(yùn)算結(jié)果設(shè)置為新的輸入條件,返回步驟S52繼續(xù)進(jìn)行區(qū) 間運(yùn)算,若沒有縮小,結(jié)束當(dāng)前區(qū)間運(yùn)算;
[0034] S58、如果所有所述變量的當(dāng)前區(qū)間運(yùn)算結(jié)果和上一次區(qū)間運(yùn)算結(jié)果相同,則將當(dāng) 前變量的初始穩(wěn)定變量取值區(qū)間保存到穩(wěn)定變量取值區(qū)間中,生成測(cè)試用例。
[0035] 其中,步驟S6包括:
[0036] S61、用所述生成的測(cè)試用例驅(qū)動(dòng)所述待測(cè)程序,并根據(jù)插裝的代碼記錄實(shí)際執(zhí)行 的路徑;
[0037] S62、比較實(shí)際執(zhí)行的路徑和預(yù)設(shè)路徑,判斷實(shí)際執(zhí)行的路徑與預(yù)設(shè)路徑是否符 合,如果不符合則所述測(cè)試用例生成失敗;如果符合,則將得到的測(cè)試用例存儲(chǔ)并將其返回 給用戶。
[0038] 根據(jù)本發(fā)明的另一個(gè)方面,提供一種基于迭代的區(qū)間運(yùn)算的軟件測(cè)試用例自動(dòng)生 成系統(tǒng),所述系統(tǒng)包括:
[0039] 預(yù)處理模塊,用于讀取待測(cè)程序中的預(yù)定路徑,通過遍歷所述待測(cè)程序的控制流 圖得到所述預(yù)定路徑的各個(gè)變量的變量取值區(qū)間;
[0040] 初始區(qū)間運(yùn)算模塊,用于將所述變量取值區(qū)間通過迭代的區(qū)間運(yùn)算遍歷所述控制 流圖,得到各個(gè)所述變量的初始穩(wěn)定變量取值區(qū)間;
[0041] 無窮變量區(qū)間運(yùn)算模塊,用于對(duì)所述初始穩(wěn)定變量取值區(qū)間中的無窮變量取值區(qū) 間進(jìn)行初始化處理,通過迭代的區(qū)間運(yùn)算遍歷所述控制流圖,并將所述運(yùn)算結(jié)果保存到所 述初始穩(wěn)定變量取值區(qū)間;
[0042] 排序模塊,用于根據(jù)預(yù)設(shè)的機(jī)制對(duì)變量進(jìn)行排序,并確定當(dāng)前變量;
[0043] 測(cè)試用例生成模塊,用于對(duì)所述當(dāng)前變量的初始穩(wěn)定變量取值區(qū)間進(jìn)行回退運(yùn) 算、迭代的區(qū)間運(yùn)算及回溯運(yùn)算,生成測(cè)試用例;
[0044] 驗(yàn)證模塊,用于對(duì)生成的所述測(cè)試用例進(jìn)行驗(yàn)證。
[0045] 其中,所述初始區(qū)間運(yùn)算模塊包括:
[0046] 輸入單元,用于將各個(gè)變量及對(duì)應(yīng)的變量取值區(qū)間傳入所述控制流圖的入口節(jié) 占.
[0047] 運(yùn)算單元,用于將輸入的所述各個(gè)變量的變量取值區(qū)間通過遍歷所述控制流圖進(jìn) 行區(qū)間運(yùn)算;
[0048] 判斷單元,用于判斷任一變量的當(dāng)前區(qū)間運(yùn)算是否發(fā)生矛盾,當(dāng)發(fā)生矛盾則結(jié)束 當(dāng)前區(qū)間運(yùn)算,當(dāng)不矛盾時(shí)將判斷結(jié)果輸入到所述更新單元;
[0049] 更新單元,用于將當(dāng)前運(yùn)算結(jié)果與上一次運(yùn)算結(jié)果進(jìn)行比較,如果當(dāng)前區(qū)間運(yùn)算 結(jié)果比所述上一次區(qū)間運(yùn)算結(jié)果有縮小,則將當(dāng)前區(qū)間運(yùn)算結(jié)果設(shè)置為新的輸入條件,輸 入到區(qū)間運(yùn)算單元繼續(xù)進(jìn)行區(qū)間運(yùn)算;
[0050] 存儲(chǔ)單元,用于將所述判斷單元中所述當(dāng)前區(qū)間運(yùn)算結(jié)果和所述上一次區(qū)間運(yùn)算 結(jié)果相同時(shí)的當(dāng)前變量取值區(qū)間進(jìn)行壓縮并保存到初始穩(wěn)定變量取值區(qū)間中。
[0051] 其中,所述測(cè)試用例生成模塊包括:
[0052] 賦值單元,用于為所述當(dāng)前變量選擇回退值;
[0053] 當(dāng)前變量取值區(qū)間運(yùn)算單元,用于將所述回退值傳入入口節(jié)點(diǎn)條件,通過遍歷所 述控制流圖進(jìn)行區(qū)間運(yùn)算;
[0054] 區(qū)間運(yùn)算判斷單元,用于判斷當(dāng)前區(qū)間運(yùn)算是否發(fā)生矛盾,當(dāng)當(dāng)前區(qū)間運(yùn)算發(fā)生 矛盾則根據(jù)矛盾信息選取下一回退值或回溯后重新為當(dāng)前變量選取回退值,并重新進(jìn)行區(qū) 間運(yùn)算,如果再無前驅(qū)變量,則分支限界失敗,測(cè)試用例生成失敗;
[0055] 比較單元,用于在當(dāng)前區(qū)間運(yùn)算不矛盾時(shí),將當(dāng)前區(qū)間運(yùn)算結(jié)果與上一次區(qū)間運(yùn) 算的結(jié)果進(jìn)行比較,如果當(dāng)前區(qū)間運(yùn)算的結(jié)果比所述上一次區(qū)間運(yùn)算的結(jié)果小,則將當(dāng)前 區(qū)間運(yùn)算結(jié)果設(shè)置為新的輸入條件,輸入到當(dāng)前變量取值區(qū)間運(yùn)算單元繼續(xù)進(jìn)行區(qū)間運(yùn) 算;
[0056] 測(cè)試用例存儲(chǔ)單元,用于將所述判斷單元中所述當(dāng)前區(qū)間運(yùn)算結(jié)果和所述上一次 區(qū)間運(yùn)算結(jié)果相同時(shí)的當(dāng)前變量取值區(qū)間進(jìn)行壓縮并保存到初始穩(wěn)定無窮變量取值區(qū)間, 生成測(cè)試用例。
[0057] 本發(fā)明的基于迭代的區(qū)間運(yùn)算的軟件測(cè)試用例自動(dòng)生成方法及系統(tǒng),由于采用了 迭代的區(qū)間運(yùn)算技術(shù),在每次路徑分析的時(shí)候都能最大程度地求精以到達(dá)不動(dòng)點(diǎn),所以能 夠在用例生成開始之前進(jìn)行路徑可達(dá)性判斷,如果路徑可達(dá)則準(zhǔn)確地按照給定的待測(cè)軟件 程序元素搜索得到符合要求的測(cè)試用例集合,同時(shí)本發(fā)明還可對(duì)生成的測(cè)試用例進(jìn)行驗(yàn) 證,提高了測(cè)試用例的準(zhǔn)確性,大大提高了軟件測(cè)試的效率與自動(dòng)化程度。
【專利附圖】
【附圖說明】
[0058] 通過參考附圖會(huì)更加清楚的理解本發(fā)明的特征和優(yōu)點(diǎn),附圖是示意性的而不應(yīng)理 解為對(duì)本發(fā)明進(jìn)行任何限制,在附圖中:
[0059] 圖1示出了本發(fā)明的基于迭代的區(qū)間運(yùn)算的軟件測(cè)試用例自動(dòng)生成方法的流程 圖。
[0060] 圖2示出了本發(fā)明的軟件測(cè)試用例自動(dòng)生成方法的步驟S2的具體流程圖。
[0061] 圖3示出了本發(fā)明的軟件測(cè)試用例自動(dòng)生成方法的步驟S3的具體流程圖。
[0062] 圖4示出了本發(fā)明的軟件測(cè)試用例自動(dòng)生成方法的步驟S5的具體流程圖。
[0063] 圖5示出了本發(fā)明的軟件測(cè)試用例自動(dòng)生成系統(tǒng)的結(jié)構(gòu)框圖。
【具體實(shí)施方式】
[0064] 下面將結(jié)合附圖對(duì)本發(fā)明的實(shí)施例進(jìn)行詳細(xì)描述。
[0065] 本發(fā)明的基于迭代的區(qū)間運(yùn)算的軟件測(cè)試用例自動(dòng)生成方法,其基本思想是:首 先讀取待測(cè)軟件源程序中的給定路徑,通過遍歷控制流圖進(jìn)行預(yù)處理,包括表達(dá)式提取、獲 取變量級(jí)別和相關(guān)變量閉包集、初始化變量性質(zhì)列表,從而獲取路徑末尾節(jié)點(diǎn)各變量取值 區(qū)間;然后,通過迭代遍歷控制流圖判定路徑是否可達(dá),并對(duì)輸入?yún)^(qū)間進(jìn)行壓縮;然后,對(duì) 于無窮邊界通過迭代遍歷控制流圖判定路徑是否可達(dá),并對(duì)輸入?yún)^(qū)間進(jìn)行壓縮;然后,通過 決策機(jī)制對(duì)變量進(jìn)行排序,并通過回退運(yùn)算、蘊(yùn)涵運(yùn)算及回溯運(yùn)算,生成測(cè)試用例;最后, 驅(qū)動(dòng)執(zhí)行被測(cè)程序,將上述給出的程序元素的實(shí)際執(zhí)行路徑和目標(biāo)路徑進(jìn)行比較,檢查所 得測(cè)試用例是否符合所要求路徑。
[0066] 在本實(shí)施例中,抽象待測(cè)程序的抽象語法樹和控制流圖的生成屬于現(xiàn)有技術(shù),為 了描述簡(jiǎn)單,在本實(shí)施例中不再描述。
[0067] 抽象語法樹包括表示類型信息的對(duì)象和符號(hào)表,并將它們連接成樹形結(jié)構(gòu),這是 編譯器前端的最根本的輸出,抽象語法樹包含所有的從源代碼所得到的相關(guān)信息,并且能 夠完全體現(xiàn)源程序的語法結(jié)構(gòu)。上述抽象語法樹具有一致的結(jié)構(gòu)模式,由不同類型的節(jié)點(diǎn) 組成,每一類節(jié)點(diǎn)都被描述成一個(gè)類結(jié)構(gòu)。所有的語法樹結(jié)點(diǎn)都支持一個(gè)統(tǒng)一的訪問者模 式接口,這樣就能很方便地對(duì)抽象語法樹通過訪問者模式進(jìn)行進(jìn)一步的不同形式的加工、 遍歷訪問和輸出。
[0068] 一個(gè)程序控制流圖可表示為(N,E,Entry,Exit)。其中,N代表結(jié)點(diǎn)的集合,反映 程序中的語句和條件判斷;E代表有向邊的集合,反映程序中語句間的控制流關(guān)系;Entry 為程序固定的唯一入口結(jié)點(diǎn);Exit為程序唯一的退出結(jié)點(diǎn)。簡(jiǎn)單地說:控制流圖就是具有 單一、固定入口結(jié)點(diǎn)和出口結(jié)點(diǎn)的有向圖。
[0069] 圖1示出了本發(fā)明的基于迭代的區(qū)間運(yùn)算的軟件測(cè)試用例自動(dòng)生成方法的流程 圖。
[0070] 參照?qǐng)D1,本發(fā)明的軟件測(cè)試用例自動(dòng)生成方法包括步驟:
[0071] S1、讀取待測(cè)程序中的預(yù)定路徑,通過遍歷所述待測(cè)程序的控制流圖得到所述預(yù) 定路徑的各個(gè)變量的變量取值區(qū)間。
[0072] 具體地,步驟Sl包括:
[0073] 步驟S11、通過遍歷控制流圖,提取含有表達(dá)式的節(jié)點(diǎn),并存儲(chǔ)于線性表列中。
[0074] 步驟12、遍歷步驟Sll的線性列表中的每個(gè)節(jié)點(diǎn),提取變量和表達(dá)式。
[0075] 通過遍歷線性列表中的每個(gè)節(jié)點(diǎn),將條件語句中表達(dá)式和變量提取出來,其中,表 達(dá)式用于條件的計(jì)算,變量作為后續(xù)搜索過程的操作對(duì)象。這個(gè)過程是沿著步驟Sll給出 的路徑來進(jìn)行的,過程中還要考慮路徑上的賦值語句。某些條件能夠唯一地確定某個(gè)或某 些變量的值。而這些隱含的值就如同賦值一樣,不再需要進(jìn)一步搜索。這可以大大縮少搜 索空間。對(duì)這種條件要優(yōu)先進(jìn)行計(jì)算;
[0076] 例如,條件語句:if (a == 3)…,此時(shí),變量a的取值空間就只能是{3};
[0077] 上述優(yōu)先計(jì)算能唯一確定值的條件的策略衍生的一個(gè)搜索原則是有限區(qū)域優(yōu)先 搜索:某些變量在最初或經(jīng)過某些條件約束,使搜索區(qū)域變得只有有限幾個(gè)點(diǎn),在這種條件 下優(yōu)先搜索這種變量有助于盡早發(fā)現(xiàn)矛盾或搜索成功。
[0078] 例如,假設(shè)X為一個(gè)整型變量,if(l彡X彡3)…,該條件確定了 xG [1,2,3]。
[0079] 步驟S13、求得路徑末尾節(jié)點(diǎn)各輸入變量取值區(qū)間。
[0080] 原始輸入變量通常包括函數(shù)參數(shù)、函數(shù)中用到的全局變量和靜態(tài)變量,首先通過 遍歷抽象語法樹,識(shí)別出這些變量。變量的取值區(qū)間通常根據(jù)被測(cè)程序的語言中對(duì)應(yīng)的類 型和操作系統(tǒng)運(yùn)行環(huán)境來確定。變量取值區(qū)間定義的格式為:
[0081] {(xl,Dxl),(x2,Dx2),…},其中X代表變量名,D代表其區(qū)間。
[0082] S2、將所述變量取值區(qū)間通過迭代的區(qū)間運(yùn)算遍歷所述控制流圖,得到各個(gè)所述 變量的初始穩(wěn)定變量取值區(qū)間。
[0083] 圖2示出了本發(fā)明的軟件測(cè)試用例生成方法的步驟S2的具體流程圖。
[0084] 參照?qǐng)D2,步驟S2具體包括:
[0085] S21、將各個(gè)所述變量以及對(duì)應(yīng)的變量取值區(qū)間傳入所述控制流圖的入口節(jié)點(diǎn),通 過遍歷所述控制流圖進(jìn)行區(qū)間運(yùn)算;
[0086] S22、當(dāng)任一所述變量的當(dāng)前區(qū)間運(yùn)算發(fā)生矛盾,則判定路徑不可達(dá),結(jié)束所述當(dāng) 前區(qū)間運(yùn)算;
[0087] S23、當(dāng)所有所述變量的當(dāng)前區(qū)間運(yùn)算不矛盾,則與上一次區(qū)間運(yùn)算的結(jié)果進(jìn)行比 較,判斷當(dāng)前區(qū)間運(yùn)算結(jié)果與上一次區(qū)間運(yùn)算的結(jié)果是否相同;
[0088] S24、如果任一所述變量的當(dāng)前區(qū)間運(yùn)算結(jié)果和所述上一次區(qū)間運(yùn)算結(jié)果不同,判 斷任一所述變量的當(dāng)前區(qū)間運(yùn)算的結(jié)果比所述上一次區(qū)間運(yùn)算的結(jié)果是否有縮小,若有縮 小則將所有所述變量的當(dāng)前區(qū)間運(yùn)算結(jié)果設(shè)置為新的輸入條件,返回步驟S21繼續(xù)進(jìn)行區(qū) 間運(yùn)算,若沒有縮小,結(jié)束當(dāng)前區(qū)間運(yùn)算;
[0089] S25、如果所有所述變量的當(dāng)前區(qū)間運(yùn)算結(jié)果和所述上一次區(qū)間運(yùn)算結(jié)果相同,則 將各個(gè)所述變量的當(dāng)前變量取值區(qū)間進(jìn)行壓縮并保存到所述各個(gè)變量的初始穩(wěn)定變量取 值區(qū)間中。
[0090] 在本實(shí)施例中,不可達(dá)路徑是指在給定的輸入?yún)^(qū)間內(nèi),該路徑是永遠(yuǎn)不可能被執(zhí) 行。
[0091] 分析表明,一般的程序中存在大量的不可達(dá)路徑。在產(chǎn)生測(cè)試用例的過程中,選擇 不可達(dá)路徑是可能的,這也是影響測(cè)試效率的主要因素之一,因此應(yīng)該盡早停止對(duì)該路徑 的計(jì)算,退出測(cè)試用例生成模塊。
[0092]例如:
[0093]
【權(quán)利要求】
1. 基于迭代的區(qū)間運(yùn)算的軟件測(cè)試用例自動(dòng)生成方法,其特征在于,所述方法包括: 51、 讀取待測(cè)程序中的預(yù)定路徑,通過遍歷所述待測(cè)程序的控制流圖得到所述預(yù)定路 徑的各個(gè)變量的變量取值區(qū)間; 52、 將所述變量取值區(qū)間通過迭代的區(qū)間運(yùn)算遍歷所述控制流圖,得到各個(gè)所述變量 的初始穩(wěn)定變量取值區(qū)間; 53、 對(duì)所述初始穩(wěn)定變量取值區(qū)間中的無窮變量取值區(qū)間進(jìn)行初始化處理,得到有界 變量取值區(qū)間,并將所述有界變量取值區(qū)間通過迭代的區(qū)間運(yùn)算遍歷所述控制流圖,并將 運(yùn)算結(jié)果保存到所述初始穩(wěn)定變量取值區(qū)間; 54、 根據(jù)預(yù)設(shè)的機(jī)制對(duì)變量進(jìn)行排序,并確定當(dāng)前變量; 55、 對(duì)所述當(dāng)前變量的初始穩(wěn)定變量取值區(qū)間進(jìn)行回退運(yùn)算、迭代的區(qū)間運(yùn)算及回溯 運(yùn)算,生成測(cè)試用例; 56、 對(duì)生成的所述測(cè)試用例進(jìn)行驗(yàn)證。
2. 根據(jù)權(quán)利要求1所述的軟件測(cè)試用例自動(dòng)生成方法,其特征在于,所述步驟S2具體 包括: 521、 將各個(gè)所述變量以及對(duì)應(yīng)的變量取值區(qū)間傳入所述控制流圖的入口節(jié)點(diǎn),通過遍 歷所述控制流圖進(jìn)行區(qū)間運(yùn)算; 522、 當(dāng)任一所述變量的當(dāng)前區(qū)間運(yùn)算發(fā)生矛盾,則判定路徑不可達(dá),結(jié)束所述當(dāng)前區(qū) 間運(yùn)算; 523、 當(dāng)所有所述變量的當(dāng)前區(qū)間運(yùn)算不矛盾,判斷當(dāng)前區(qū)間運(yùn)算結(jié)果與上一次區(qū)間運(yùn) 算的結(jié)果是否相同; 524、 如果任一所述變量的當(dāng)前區(qū)間運(yùn)算結(jié)果和所述上一次區(qū)間運(yùn)算結(jié)果不同,判斷任 一所述變量的當(dāng)前區(qū)間運(yùn)算的結(jié)果與所述上一次區(qū)間運(yùn)算的結(jié)果相比是否有縮小,若有縮 小則將所有所述變量的當(dāng)前區(qū)間運(yùn)算結(jié)果設(shè)置為新的輸入條件,返回步驟S21繼續(xù)進(jìn)行區(qū) 間運(yùn)算,若沒有縮小,結(jié)束當(dāng)前區(qū)間運(yùn)算; 525、 如果所有所述變量的當(dāng)前區(qū)間運(yùn)算結(jié)果和所述上一次區(qū)間運(yùn)算結(jié)果相同,則將各 個(gè)所述變量的當(dāng)前變量取值區(qū)間進(jìn)行壓縮并保存到所述各個(gè)變量的初始穩(wěn)定變量取值區(qū) 間中。
3. 根據(jù)權(quán)利要求1所述的軟件測(cè)試用例自動(dòng)生成方法,其特征在于,所述步驟S3具體 包括: 531、 對(duì)各個(gè)所述變量的初始穩(wěn)定變量取值區(qū)間中的無窮變量取值區(qū)間按照區(qū)間初始 化策略進(jìn)行壓縮,形成各個(gè)所述變量的有界變量取值區(qū)間; 532、 將各個(gè)所述變量和對(duì)應(yīng)的有界變量取值區(qū)間傳入到所述控制流圖的入口節(jié)點(diǎn),通 過遍歷所述控制流圖進(jìn)行區(qū)間運(yùn)算; 533、 當(dāng)任一所述變量的當(dāng)前區(qū)間運(yùn)算發(fā)生矛盾則將發(fā)生矛盾的有界變量取值區(qū)間的 邊界進(jìn)行放大,然后重新執(zhí)行步驟S32 ; 534、 當(dāng)所有所述變量的當(dāng)前區(qū)間運(yùn)算不矛盾,判斷當(dāng)前區(qū)間運(yùn)算結(jié)果與上一次區(qū)間運(yùn) 算的結(jié)果是否相同; 535、 如果任一所述變量的當(dāng)前區(qū)間運(yùn)算結(jié)果和所述上一次區(qū)間運(yùn)算結(jié)果不同,判斷任 一所述變量的當(dāng)前區(qū)間運(yùn)算的結(jié)果比所述上一次區(qū)間運(yùn)算的結(jié)果是否有縮小,若有縮小則 將所有所述變量的當(dāng)前區(qū)間運(yùn)算結(jié)果設(shè)置為新的輸入條件,返回步驟S32繼續(xù)進(jìn)行區(qū)間運(yùn) 算,若沒有縮小,結(jié)束當(dāng)前區(qū)間運(yùn)算; S36、如果所有所述變量的當(dāng)前區(qū)間運(yùn)算結(jié)果和上一次區(qū)間運(yùn)算結(jié)果相同,則將各個(gè)所 述變量的當(dāng)前區(qū)間運(yùn)算壓縮并保存到所述初始穩(wěn)定變量取值區(qū)間。
4. 根據(jù)權(quán)利要求1所述的軟件測(cè)試用例自動(dòng)生成方法,其特征在于,所述步驟S5具體 包括: 551、 為所述當(dāng)前變量選擇回退值; 552、 將所述回退值傳入所述控制流圖的入口節(jié)點(diǎn),通過遍歷所述控制流圖進(jìn)行區(qū)間運(yùn) 算; 553、 判斷當(dāng)前區(qū)間運(yùn)算是否發(fā)生矛盾,發(fā)生則進(jìn)行步驟S54,否則執(zhí)行步驟S56 ; 554、 根據(jù)矛盾信息選取下一回退值,然后執(zhí)行步驟S52判斷是否發(fā)生矛盾,當(dāng)所述當(dāng) 前變量的所有回退值的區(qū)間運(yùn)算都發(fā)生矛盾時(shí),執(zhí)行步驟S55 ; 555、 對(duì)當(dāng)前變量進(jìn)行回溯,然后重新為所述當(dāng)前變量選取回退值,并執(zhí)行步驟S52,當(dāng) 回溯后的所述當(dāng)前變量的所有回退值的區(qū)間運(yùn)算都發(fā)生矛盾時(shí),結(jié)束運(yùn)算; 556、 當(dāng)區(qū)間運(yùn)算不矛盾,判斷當(dāng)前區(qū)間運(yùn)算結(jié)果與上一次區(qū)間運(yùn)算的結(jié)果是否相同; 557、 如果任一所述變量的當(dāng)前區(qū)間運(yùn)算結(jié)果和所述上一次區(qū)間運(yùn)算結(jié)果不同,判斷任 一所述變量的當(dāng)前區(qū)間運(yùn)算的結(jié)果比所述上一次區(qū)間運(yùn)算的結(jié)果是否有縮小,若有縮小則 將所有所述變量的當(dāng)前區(qū)間運(yùn)算結(jié)果設(shè)置為新的輸入條件,返回步驟S52繼續(xù)進(jìn)行區(qū)間運(yùn) 算,若沒有縮小,結(jié)束當(dāng)前區(qū)間運(yùn)算; 558、 如果所有所述變量的當(dāng)前區(qū)間運(yùn)算結(jié)果和上一次區(qū)間運(yùn)算結(jié)果相同,則將當(dāng)前變 量的初始穩(wěn)定變量取值區(qū)間保存到穩(wěn)定變量取值區(qū)間中,生成測(cè)試用例。
5. 根據(jù)權(quán)利要求1所述的軟件測(cè)試用例自動(dòng)生成方法,其特征在于,所述步驟S6包 括: 561、 在待測(cè)程序中插裝額外的代碼,以獲得待測(cè)程序在執(zhí)行時(shí)行為的信息; 562、 用所述生成的測(cè)試用例驅(qū)動(dòng)所述待測(cè)程序,并根據(jù)插裝的代碼記錄實(shí)際執(zhí)行的路 徑; 563、 比較實(shí)際執(zhí)行的路徑和預(yù)設(shè)路徑,判斷實(shí)際執(zhí)行的路徑與預(yù)設(shè)路徑是否符合,如 果不符合則所述測(cè)試用例生成失??;如果符合,則將得到的測(cè)試用例存儲(chǔ)并將其返回給用 戶。
6. 基于迭代的區(qū)間運(yùn)算的軟件測(cè)試用例自動(dòng)生成系統(tǒng),其特征在于,所述系統(tǒng)包括: 預(yù)處理模塊,用于讀取待測(cè)程序中的預(yù)定路徑,通過遍歷所述待測(cè)程序的控制流圖得 到所述預(yù)定路徑的各個(gè)變量的變量取值區(qū)間; 初始區(qū)間運(yùn)算模塊,用于將所述變量取值區(qū)間通過迭代的區(qū)間運(yùn)算遍歷所述控制流 圖,得到各個(gè)所述變量的初始穩(wěn)定變量取值區(qū)間; 無窮變量區(qū)間運(yùn)算模塊,用于對(duì)所述初始穩(wěn)定變量取值區(qū)間中的無窮變量取值區(qū)間進(jìn) 行初始化處理,通過迭代的區(qū)間運(yùn)算遍歷所述控制流圖,并將所述運(yùn)算結(jié)果保存到所述初 始穩(wěn)定變量取值區(qū)間; 排序模塊,用于根據(jù)預(yù)設(shè)的機(jī)制對(duì)變量進(jìn)行排序,并確定當(dāng)前變量; 測(cè)試用例生成模塊,用于對(duì)所述當(dāng)前變量的初始穩(wěn)定變量取值區(qū)間進(jìn)行回退運(yùn)算、迭 代的區(qū)間運(yùn)算及回溯運(yùn)算,生成測(cè)試用例; 驗(yàn)證模塊,用于對(duì)生成的所述測(cè)試用例進(jìn)行驗(yàn)證。
7. 根據(jù)權(quán)利要求6所述的軟件測(cè)試用例自動(dòng)生成系統(tǒng),其特征在于,所述初始區(qū)間運(yùn) 算模塊包括: 輸入單元,用于將各個(gè)變量及對(duì)應(yīng)的變量取值區(qū)間傳入所述控制流圖的入口節(jié)點(diǎn); 運(yùn)算單元,用于將輸入的所述各個(gè)變量的變量取值區(qū)間通過遍歷所述控制流圖進(jìn)行區(qū) 間運(yùn)算; 判斷單元,用于判斷任一變量的當(dāng)前區(qū)間運(yùn)算是否發(fā)生矛盾,當(dāng)發(fā)生矛盾時(shí)結(jié)束當(dāng)前 區(qū)間運(yùn)算,當(dāng)不矛盾時(shí)將判斷結(jié)果輸入到所述更新單元; 更新單元,用于將當(dāng)前運(yùn)算結(jié)果與上一次運(yùn)算結(jié)果進(jìn)行比較,如果當(dāng)前區(qū)間運(yùn)算結(jié)果 比所述上一次區(qū)間運(yùn)算結(jié)果有縮小,則將當(dāng)前區(qū)間運(yùn)算結(jié)果設(shè)置為新的輸入條件,輸入到 區(qū)間運(yùn)算單元繼續(xù)進(jìn)行區(qū)間運(yùn)算; 存儲(chǔ)單元,用于將所述判斷單元中所述當(dāng)前區(qū)間運(yùn)算結(jié)果和所述上一次區(qū)間運(yùn)算結(jié)果 相同時(shí)的當(dāng)前變量取值區(qū)間進(jìn)行壓縮并保存到初始穩(wěn)定變量取值區(qū)間中。
8. 根據(jù)權(quán)利要求6所述的軟件測(cè)試用例自動(dòng)生成系統(tǒng),其特征在于,所述測(cè)試用例生 成模塊包括: 賦值單元,用于為所述當(dāng)前變量選擇回退值; 當(dāng)前變量取值區(qū)間運(yùn)算單元,用于將所述回退值傳入入口節(jié)點(diǎn)條件,通過遍歷所述控 制流圖進(jìn)行區(qū)間運(yùn)算; 區(qū)間運(yùn)算判斷單元,用于判斷當(dāng)前區(qū)間運(yùn)算是否發(fā)生矛盾,當(dāng)發(fā)生矛盾時(shí)根據(jù)矛盾信 息選取下一回退值或回溯后重新為當(dāng)前變量選取回退值,并重新進(jìn)行區(qū)間運(yùn)算,如果再無 前驅(qū)變量,則分支限界失敗,測(cè)試用例生成失??; 比較單元,用于在當(dāng)前區(qū)間運(yùn)算不矛盾時(shí),將當(dāng)前區(qū)間運(yùn)算結(jié)果與上一次區(qū)間運(yùn)算的 結(jié)果進(jìn)行比較,如果當(dāng)前區(qū)間運(yùn)算的結(jié)果比所述上一次區(qū)間運(yùn)算的結(jié)果小,則將當(dāng)前區(qū)間 運(yùn)算結(jié)果設(shè)置為新的輸入條件,輸入到當(dāng)前變量取值區(qū)間運(yùn)算單元繼續(xù)進(jìn)行區(qū)間運(yùn)算; 測(cè)試用例存儲(chǔ)單元,用于將所述判斷單元中所述當(dāng)前區(qū)間運(yùn)算結(jié)果和所述上一次區(qū)間 運(yùn)算結(jié)果相同時(shí)的當(dāng)前變量取值區(qū)間進(jìn)行壓縮并保存到初始穩(wěn)定無窮變量取值區(qū)間,生成 測(cè)試用例。
【文檔編號(hào)】G06F11/36GK104317708SQ201410562727
【公開日】2015年1月28日 申請(qǐng)日期:2014年10月21日 優(yōu)先權(quán)日:2014年10月21日
【發(fā)明者】王雅文, 邢穎, 宮云戰(zhàn), 張旭舟, 黃俊飛, 金大海 申請(qǐng)人:北京郵電大學(xué)