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