專利名稱:基于數(shù)據(jù)代碼分離技術(shù)的測試用例生成方法
技術(shù)領(lǐng)域:
本發(fā)明涉及軟件測試技術(shù),特別涉及一種基于數(shù)據(jù)代碼分離技術(shù)的測試用例生成方法。
背景技術(shù):
隨著軟件開發(fā)周期的時間限制、資源限制以及軟件的日趨復(fù)雜化,一般大型應(yīng)用軟件的白盒測試工作僅靠手工已不能完全勝任。尤其是在迭代開發(fā)過程中,每一個版本下的各個組件都需要不斷驗證。由此產(chǎn)生了數(shù)據(jù)代碼分離系統(tǒng)和自動化白盒測試技術(shù)。由于腳本編制工作,是一項較為繁瑣的工作,目前通常使用基于控制模型的白盒測試腳本自動生成算法,此種設(shè)計方式的益處主要有如下兩個方面1、基于圖的最小路徑覆蓋算法,可以在滿足覆蓋率要求的條件下,提高測試效率,節(jié)省資源;2、基于控制模型生成測試用例,在 保證了邏輯完整性及功能的時序性。然而,該設(shè)計方式對于安全要求較高,且沒有對源代碼進行智能化分析,影響了測試用例生成的效率。
發(fā)明內(nèi)容
(一)解決的技術(shù)問題本發(fā)明解決的技術(shù)問題是實現(xiàn)代碼智能化分析和測試用例自動生成的問題。(二)技術(shù)方案本發(fā)明提出了一種基于數(shù)據(jù)代碼分離技術(shù)的測試用例生成方法,所述方法包括S1、對程序源代碼進行預(yù)處理,并生成程序控制流圖;S2、根據(jù)所述程序控制流圖生成路徑矩陣A,并為每條路徑P中的每個謂詞設(shè)置對應(yīng)的優(yōu)先級因子β ;S3、將所述路徑根據(jù)所述優(yōu)先級因子β逆序排序,獲得矩陣A';S4、對于所述矩陣A',選取路徑Pi,當(dāng)選取的路徑Pi組成的矩陣Α"的秩等于路徑矩陣A的秩時,則路徑選取結(jié)束;S5、根據(jù)所述路徑Pi中謂詞的類型,生成測試數(shù)據(jù);S6、根據(jù)所述測試數(shù)據(jù)和所述路徑Pi,生成測試用例。優(yōu)選地,步驟S2中所述路徑矩陣A中每行表示一條路徑經(jīng)過的邊集合,每列表示每條路徑經(jīng)過邊的次數(shù)。優(yōu)選地,在步驟S3之前所述方法還包括生成路徑優(yōu)先級系數(shù),所述路徑優(yōu)先級系數(shù)為路徑矩陣A每行中謂詞的使用次數(shù)與所述每行中謂詞對應(yīng)的優(yōu)先級因子的乘積。優(yōu)選地,步驟S5之前還包括設(shè)定程序的初始輸入Itl以及迭代次數(shù)上限Τ,如果Itl能經(jīng)過路徑Pi,則獲得經(jīng)過路徑Pi的程序輸入If,即If=Itl ;若Itl不能經(jīng)過路徑Pi,則跳轉(zhuǎn)步驟S5。優(yōu)選地,所述步驟S5中若所述路徑Pi中謂詞的類型為非線性,則所述方法包括
S51、計算所述非線性謂詞的線性函數(shù)L(Ni,IpPi),其中Ik為輸入變量,Pi為選取的路徑,Ni為Pi上的結(jié)點;S52、用路徑Pi中的所有線性函數(shù)和L(Ni,Ik, Pi)構(gòu)造輸入變量的線性約束系統(tǒng),所述所有線性函數(shù)為所述路SPi中謂詞類型為線性的函數(shù);S53、計算所述線性約束系統(tǒng),得到輸入Ik+1 ;S54、若Ik+1能經(jīng)過路徑Pi,則If = Ik+1 ;否則,重復(fù)步驟S5f S53,直至得到能夠經(jīng)過路徑Pi的輸入,所述重復(fù)步驟的迭代次數(shù)上限為T。優(yōu)選地,步驟S51中所述計算所述非線性謂詞的線性函數(shù)L(Ni,Ik, Pi)的方法具體包括根據(jù)路徑Pi上的謂詞結(jié)點Ni關(guān)于輸入變量Ik,得到通用線性函數(shù)L (Ni, Ik, Pi),計算所述線性函數(shù)L (Ni,Ik, Pi),使得L (Ni,Ik,Pi) =0,則所述線性函數(shù)L (Ni,Ik, Pi)代表謂詞函數(shù)在Ik處的切平面,則稱L(Ni,Ik, Pi)為Ni的謂詞函數(shù)關(guān)于Ik的線性算術(shù)表示。優(yōu)選地,所述步驟S5中若所述路徑Pi中謂詞的類型為線性,則所述方法包括S52’、用路徑Pi中的線性函數(shù)構(gòu)造輸入變量的線性約束系統(tǒng);S53’、計算所述線性約束系統(tǒng),得到輸入Ik+1 ;S54’、若Ik+1能經(jīng)過路徑Pi,則If=Ik+1 ;否則,重復(fù)步驟S52’飛53’,直至得到能夠經(jīng)過路SPi的輸入,所述重復(fù)步驟的迭代次數(shù)上限為τ。優(yōu)選地,在步驟S6之后所述方法還包括對程序輸出狀態(tài)的集合進行映射,并根據(jù)每一個程序輸出狀態(tài)對應(yīng)的轉(zhuǎn)移概率,將程序輸出狀態(tài)映射到區(qū)間(Tl。優(yōu)選地,步驟S6中的所述測試用例是指從路徑起始結(jié)點到終止結(jié)點所經(jīng)過的邊的序列。優(yōu)選地,執(zhí)行測試用例生成過程,當(dāng)所述矩陣A"的秩大于路徑矩陣A的秩,且P(PlA)為A狀態(tài)時,檢查激勵P的概率&A) = 1,其中,A為輸入狀態(tài),即路徑矩陣A作
為輸入狀態(tài),P為激勵。(三)有益效果本發(fā)明在生成測試數(shù)據(jù)時進行代碼智能分析,通過自動提取路徑中謂詞條件中的測試數(shù)據(jù),構(gòu)成謂詞線性約束系統(tǒng),實現(xiàn)了代碼智能化分析,簡化人力設(shè)計測試用例和測試數(shù)據(jù)的工時,簡化測試腳本編寫時間,提高了測試效率。
圖1是本發(fā)明提出的方法流程圖;圖2是本發(fā)明中程序控制流圖。
具體實施例方式下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述。本發(fā)明提出了一種基于數(shù)據(jù)代碼分離技術(shù)的測試用例生成方法,參加圖1,所述方法包括S1、對程序源代碼進行預(yù)處理,并生成程序控制流S2、根據(jù)所述程序控制流圖生成路徑矩陣A,并為每條路徑P中的每個謂詞設(shè)置對應(yīng)的優(yōu)先級因子β ;S3、將所述路徑根據(jù)所述優(yōu)先級因子β逆序排序,獲得矩陣A';S4、對于所述矩陣A',選取路徑Pi,當(dāng)選取的路徑Pi組成的矩陣A"的秩等于路徑矩陣A的秩時,則路徑選取結(jié)束;S5、根據(jù)所述路徑Pi中謂詞的類型,生成測試數(shù)據(jù);S6、根據(jù)所述測試數(shù)據(jù)和所述路徑Pi,生成測試用例。本發(fā)明提出的一種基于數(shù)據(jù)代碼分離技術(shù)的測試用例生成方法具體為以下內(nèi)容
對程序源代碼進行預(yù)處理,所述預(yù)處理包括刪除注釋、空行,提取語句和控制流信息,以及程序中變量的定義和使用情況。在結(jié)構(gòu)測試中,對于給定覆蓋準則C,生成一組路徑P,使得這組路徑P能夠達到C所描述的覆蓋要求。本文所期望獲得的基路徑,是指能夠覆蓋邊集合E的最小P集合。在圖論中,圈復(fù)雜度被定義為V(G)=E_N+p,其中E表示邊集合,N表示程序控制流圖(Program flow graph, PFG)中結(jié)點的數(shù)量,p表示連通分支數(shù)。如果不考慮PFG的方向性,則V(G)=E-N+1。但是PFG并不是強連通的,解決方法是增加一條從入口到出口的邊,這樣PFG的圈復(fù)雜度就是V(G) =E-N+2。設(shè)PFG中E為{el,e2. . . en},則可將PFG轉(zhuǎn)化為矩陣A,其中每行表示一條路徑經(jīng)過的邊集合,每列表示每條路徑經(jīng)過邊的次數(shù)。由于任一矩陣的秩唯一且小于或等于列數(shù)。即不管有多少條可能路徑,矩陣的秩不會超過程序控制流圖中的邊數(shù)?;贛cCabe理論,矩陣的秩即是程序流圖的圈復(fù)雜度。對于程序控制流圖如圖2所示,根據(jù)圖2可以得到路徑P的集合為pl=<S, 1,2, 3,4, E>p2=〈S, I, 3,4,E>p3=<S, I, 2,3,4,5,4,E>p4=<S, 1,3,4, 5,4, E>p5=<S, I, 2,3,4,5,4,5,4,E>p6=<S, I, 3,4,5,4,5,4,E>根據(jù)路徑P的集合將PFG轉(zhuǎn)化為路徑矩陣A,
110 110 0 1"
10 10 10 0 1
A 110 11111A =
10 10 1111
110 112 2 1 10 10 12 2 1路徑上具有明確取值要求的判斷語句中的條件表達式稱為分支謂詞。在Macabe圈復(fù)雜度測試基礎(chǔ)上,對每個謂詞增加優(yōu)先級因子β,用以選取高優(yōu)先級路徑生成測試用例。使用路徑矩陣Α,每行中謂詞的使用次數(shù)與對應(yīng)謂詞的優(yōu)先級因子β計算乘積,獲得該行對應(yīng)路徑的優(yōu)先級系數(shù),并將路徑根據(jù)優(yōu)先級因子逆序排序,獲得矩陣A'。對于路徑矩陣A,由于任一矩陣的秩唯一且小于或等于列數(shù)。即不管有多少條可能路徑,矩陣的秩不會超過程序控制流圖中的邊數(shù)?;贛cCabe理論,路徑矩陣的秩就是程序流圖的圈復(fù)雜度入。對于矩陣A',根據(jù)自頂向下原則,選取路徑Pi用以計算測試數(shù)據(jù),并使Pi組成矩陣Α",當(dāng)矩陣Α"的秩等于λ時,路徑選取結(jié)束。因為若路徑Pi中的謂詞的函數(shù)是線性的,則其線性算術(shù)表示就是謂詞函數(shù)本身。根據(jù)篩選后得到的路徑Pi,設(shè)定程序的初始輸入Itl以及迭代次數(shù)上限Τ,如果Itl
能經(jīng)過路徑Pi,則獲得經(jīng)過路徑Pi的程序輸入If,即If=Itl ;若I0不能經(jīng)過路徑Pi,則分析Pi上謂詞類型,并根據(jù)謂詞類型生成測試數(shù)據(jù),步驟如下當(dāng)路徑Pi上謂詞的函數(shù)為非線性函數(shù),則1、計算該點謂詞函數(shù)的線性算術(shù)表示L(Ni,Ik, Pi)。2、根據(jù)路徑Pi上的謂詞結(jié)點η關(guān)于給定輸入Ik的輸入變量,寫出一個通用線性函數(shù)L(Ni,Ik,Pi),然后計算該函數(shù),使得L(Ni,Ik,Pi) =0,所述線性函數(shù)L (Ni,Ik,Pi)代表謂詞函數(shù)F在Ik處的切平面,則稱L(Ni,Ik,Pi)為結(jié)點Ni的謂詞函數(shù)F關(guān)于Ik的線性算術(shù)表不。3、用Pi中的所有線性謂詞函數(shù)和L(Ni,Ik, Pi)構(gòu)造輸入變量的線性約束系統(tǒng),所述所有線性謂詞函數(shù)為路徑Pi中謂詞類型為線性的函數(shù)。4、求解線性約束系統(tǒng),得到新的輸入Ik+1。5、若Ik+1能經(jīng)過路徑Pi,則If=Ik+1 ;否則,重復(fù)步驟廣4,直至得到能夠經(jīng)過路SPi的輸入,所述重復(fù)步驟的迭代次數(shù)上限為T。當(dāng)路徑P上謂詞函數(shù)為線性函數(shù),則S52’、用路徑Pi中的線性函數(shù)構(gòu)造輸入變量的線性約束系統(tǒng);S53’、計算所述線性約束系統(tǒng),得到輸入Ik+1 ;S54’、若Ik+1能經(jīng)過路徑Pi,則If=Ik+1 ;否則,重復(fù)步驟S52’飛53’,直至得到能夠經(jīng)過路SPi的輸入,所述重復(fù)步驟的迭代次數(shù)上限為τ。對于程序O: read (a, b, c)1: m=a+bPl:1f (2*a+b ^ 6) then2: n=m3:else n=b end ifP2:1f (n-c) ^ 4 then4:n=a*b*c5:m++P3: else if (a2+c2>100) then6 :m=a*c+l end ifP4:1f (n ^ 0) then7: write (m)
P5:else if(b-Sin(c))>0 then8: write (n) end if當(dāng)選取路徑P= {0,I, PI, 2,P2, 4,5,P4, 7},I0 = (I, 2,3)。因Ici不能使經(jīng)過路徑P,故繼續(xù)執(zhí)行算法后面的步驟。構(gòu)造謂詞的函數(shù)關(guān)于輸入變量Itl的線性約束系統(tǒng)2*a+b_6 ≥ O,a+b-c-4 ≥ O,a*b*c ≥ O。求解線性約束系統(tǒng)可求得一組解a=2, b=2, c=0。則新的輸入1:=(2, 2,O)。因I1可以經(jīng)過路徑P,故
算法結(jié)束。選取路徑P= {O, I, Pl, 3,P2, 4,5,P4, P5, 8},I0 = (I, 2,3)。因Ici不能經(jīng)過路徑P,故繼續(xù)執(zhí)行算法后面的步驟。因P中謂詞函數(shù)P5是非線性的,故求P5F=b-sin(c)的線性算術(shù)表示可令其線性算術(shù)表示為L(B P5,Ik,P)=kb+lc+p,利用均差近似導(dǎo)數(shù),可得k=l, 1=0. 89792,ρ=_2· 83488,所以謂詞函數(shù)F=b-sin(c)關(guān)于I。的線性算術(shù)表示為L(BP5, I0, P) =b+0. 89792c-2. 83488.構(gòu)造線性約束系統(tǒng)2*a+b_6 ≥ O,a+b-c-4 ≥ O,a*b*c ≥ O,b+0. 89792*c-2. 83488>0。求解線性約束系統(tǒng)得11=(2,2,1)可經(jīng)過路徑P,算法結(jié)束。對程序輸入狀態(tài)的下一個相鄰狀態(tài)即程序輸出狀態(tài)的集合進行映射。根據(jù)每一個程序輸出狀態(tài)對應(yīng)的轉(zhuǎn)移概率,將輸出狀態(tài)映射到區(qū)間(因為轉(zhuǎn)移概率和為1,則區(qū)間選在O I)。定義輸入狀態(tài)A和激勵P的函數(shù)F(A,p),pep, P(A)為當(dāng)前輸入狀態(tài)為A時的激勵集合。由函數(shù)F(A,P)可得輸出狀態(tài)集E(A)。根據(jù)生成測試數(shù)據(jù)Ii與Pi構(gòu)造測試用例,得到測試用例后,到達終止?fàn)顟B(tài)。直到終止?fàn)顟B(tài)停止。測試用例是從從路徑起始結(jié)點到終止結(jié)點所經(jīng)過的邊(或激勵)的序列。不斷從軟件使用模型的初始結(jié)點狀態(tài)開始,執(zhí)行測試用例的生成過程,直到選取的測試路徑數(shù)組的
秩超過圈復(fù)雜度,且P (P IA)為A狀態(tài)時,檢查激勵P的概率
權(quán)利要求
1.一種基于數(shù)據(jù)代碼分離技術(shù)的測試用例生成方法,其特征在于,所述方法包括 51、對程序源代碼進行預(yù)處理,并生成程序控制流圖; 52、根據(jù)所述程序控制流圖生成路徑矩陣A,并為每條路徑P中的每個謂詞設(shè)置對應(yīng)的優(yōu)先級因子β ; 53、將所述路徑根據(jù)所述優(yōu)先級因子β逆序排序,獲得矩陣A'; 54、對于所述矩陣A',選取路徑Pi,當(dāng)選取的路徑Pi組成的矩陣Α"的秩等于路徑矩陣A的秩時,則路徑選取結(jié)束; 55、根據(jù)所述路徑Pi中謂詞的類型,生成測試數(shù)據(jù); 56、根據(jù)所述測試數(shù)據(jù)和所述路徑Pi,生成測試用例。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟S2中所述路徑矩陣A中每行表示一條路徑經(jīng)過的邊集合,每列表示每條路徑經(jīng)過邊的次數(shù)。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,在步驟S3之前所述方法還包括生成路徑優(yōu)先級系數(shù),所述路徑優(yōu)先級系數(shù)為路徑矩陣A每行中謂詞的使用次數(shù)與所述每行中謂詞對應(yīng)的優(yōu)先級因子的乘積。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟S5之前還包括設(shè)定程序的初始輸入I0以及迭代次數(shù)上限Τ,如果Itl能經(jīng)過路徑Pi,則獲得經(jīng)過路徑Pi的程序輸入If,即If=I0 ;若I。不能經(jīng)過路徑Pi,則跳轉(zhuǎn)步驟S5。
5.根據(jù)權(quán)利要求1或4中任一項所述的方法,其特征在于,所述步驟S5中若所述路徑Pi中謂詞的類型為非線性,則所述方法包括 551、計算所述非線性謂詞的線性函數(shù)L(Ni,IkiPi),其中Ik為輸入變量,Pi為選取的路徑,Ni為Pi上的結(jié)點; 552、用路徑Pi中的所有線性函數(shù)和L(Ni,Ik,Pi)構(gòu)造輸入變量的線性約束系統(tǒng),所述所有線性函數(shù)為所述路徑Pi中謂詞類型為線性的函數(shù); 553、計算所述線性約束系統(tǒng),得到輸入Ik+1; 554、若Ik+1能經(jīng)過路徑Pi,則If=Ik+1;否則,重復(fù)步驟S5fS53,直至得到能夠經(jīng)過路徑Pi的輸入,所述重復(fù)步驟的迭代次數(shù)上限為T。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于,步驟S51中所述計算所述非線性謂詞的線性函數(shù)L(Ni,Ik,Pi)的方法具體包括根據(jù)路SPi上的謂詞結(jié)點Ni關(guān)于輸入變量Ik,得到通用線性函數(shù)L (Ni,Ik,Pi),計算所述線性函數(shù)L (Ni,Ik, Pi),使得L (Ni,Ik,Pi) =0,則所述線性函數(shù)L (Ni,Ik,Pi)代表謂詞函數(shù)在Ik處的切平面,則稱L (Ni,Ik,Pi)為Ni的謂詞函數(shù)關(guān)于Ik的線性算術(shù)表示。
7.根據(jù)權(quán)利要求1或4中任一項所述的方法,其特征在于,所述步驟S5中若所述路徑Pi中謂詞的類型為線性,則所述方法包括 S52’、用路徑Pi中的線性函數(shù)構(gòu)造輸入變量的線性約束系統(tǒng); S53’、計算所述線性約束系統(tǒng),得到輸入Ik+1 ; S54,、若Ik+1能經(jīng)過路徑Pi,則If=Ik+1 ;否則,重復(fù)步驟S52’飛53’,直至得到能夠經(jīng)過路徑Pi的輸入,所述重復(fù)步驟的迭代次數(shù)上限為T。
8.根據(jù)權(quán)利要求1所述的方法,其特征在于,在步驟S6之后所述方法還包括對程序輸出狀態(tài)的集合進行映射,并根據(jù)每一個程序輸出狀態(tài)對應(yīng)的轉(zhuǎn)移概率,將程序輸出狀態(tài)映射到區(qū)間(Tl。
9.根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟S6中的所述測試用例是指從路徑起始結(jié)點到終止結(jié)點所經(jīng)過的邊的序列。
10.根據(jù)權(quán)利要求f8任一項所述的方法,其特征在于,執(zhí)行測試用例生成過程,當(dāng)所述矩陣A "的秩大于路徑矩陣A的秩,且P(p|A)為A狀態(tài)時,檢查激勵p的概率
全文摘要
本發(fā)明提供一種基于數(shù)據(jù)代碼分離技術(shù)的測試用例生成方法,包括S1、對程序源代碼進行預(yù)處理,并生成程序控制流圖;S2、根據(jù)所述程序控制流圖生成路徑矩陣A,并為每條路徑P中的每個謂詞設(shè)置對應(yīng)的優(yōu)先級因子β;S3、將所述路徑根據(jù)所述優(yōu)先級因子β逆序排序,獲得矩陣A′;S4、對于所述矩陣A′,選取路徑Pi計算測試數(shù)據(jù),當(dāng)選取的路徑Pi組成的矩陣A″的秩等于路徑矩陣A的秩時,則路徑選取結(jié)束;S5、根據(jù)所述路徑Pi中謂詞的類型,生成測試數(shù)據(jù);S6、根據(jù)所述測試數(shù)據(jù)和所述路徑Pi,生成測試用例。本發(fā)明實現(xiàn)了代碼智能化分析,簡化人力設(shè)計測試用例和測試數(shù)據(jù)的工時,簡化測試腳本編寫時間,提高了測試效率。
文檔編號G06F11/36GK103019934SQ20121049604
公開日2013年4月3日 申請日期2012年11月28日 優(yōu)先權(quán)日2012年11月28日
發(fā)明者何璽勝, 胥志洪 申請人:北京交控科技有限公司