路徑覆蓋
1.什么是路徑覆蓋
路徑覆蓋是指選取足夠多的測試數(shù)據(jù),使程序的每條可能路徑都至少執(zhí)行一次(如果程序圖中有環(huán),則要求每個環(huán)至少經(jīng)過一次)。路徑覆蓋是覆蓋率最高的一種覆蓋技術(shù)。
路徑覆蓋要求設(shè)計足夠多的測試用例,在白盒測試法中,覆蓋程度最高的就是路徑覆蓋,因為其覆蓋程序中所有可能的路徑。對于比較簡單的小程序來說,實現(xiàn)路徑覆蓋是可能的,但是如果程序中出現(xiàn)了多個判斷和多個循環(huán),可能的路徑數(shù)目將會急劇增長,以致實現(xiàn)路徑覆蓋是幾乎不可能的。
路徑覆蓋率的公式:路徑覆蓋率=被執(zhí)行到的路徑數(shù)/程序中總的路徑數(shù)。
2.路徑覆蓋的測試步驟
1、將程序流程圖轉(zhuǎn)換成控制流圖;
2、經(jīng)過語法分析求的路徑表達式;
3、生成路徑圖;
4、進行路徑編碼;
5、經(jīng)過譯碼得到執(zhí)行的路徑;
6、通過路徑枚舉產(chǎn)生特定路徑測試用例;
7、修正的條件判斷覆蓋率。
3.完全路徑覆蓋測試方法[1]
雖然路徑覆蓋是覆蓋率最高的,但是,簡單的程序路徑數(shù)量很少,而復(fù)雜的程序路徑數(shù)量巨大,要實現(xiàn)路徑覆蓋幾乎不可能,即測試量過大;另外,即使?jié)M足了程序結(jié)構(gòu)一般意義上的路徑覆蓋,仍然不能保證被測程序的正確性,即測試不足。如果要求測試更加充分,則要求增加更多的測試用例來提高覆蓋率,測試量會更大,于是,測試中就產(chǎn)生了測試量過大和測試不足這一對矛盾。
對于獨立路徑數(shù)的計算可以采用下面的方法:
第一步,從流圖中找出程序所有的必經(jīng)節(jié)點(流圖中任何獨立路徑都必定經(jīng)過的節(jié)點叫做必經(jīng)節(jié)點),記作IV(i),其中i為整數(shù)且。
第二步,從流圖中找出從必經(jīng)節(jié)點N(i)到必經(jīng)節(jié)點N(i+1)的獨立路徑數(shù)W(i),其中i為整數(shù)且。
第三步,重復(fù)上一步,直到程序結(jié)尾。
第四步,根據(jù)乘法法則,獨立路徑數(shù)= W(i),其中i為整數(shù)且,即獨立路徑數(shù)=W(0) * W(1) * ? * W(N一1)。
完全路徑是指所有獨立路徑的集合,非完全路徑就是所有獨立路徑集合的真子集。由于程序中可能會包含有多個條件的判定,所以程序流程圖可能包含有隱含路徑,從而有程序流圖轉(zhuǎn)換成的對應(yīng)流圖可能包含有隱藏路徑。如圖1、圖2所示。
消除隱含路徑的辦法就是將含有多個條件的判定分為多個判定。即把圖1的程序流圖轉(zhuǎn)換成如圖3所示,圖4是其對應(yīng)的流圖。
圖4中,節(jié)點1,4,7為必經(jīng)節(jié)點,W(0)=3,W(1)=3,所以獨立路徑數(shù)=3*3=9。由此,要達到完全路徑覆蓋就需要設(shè)計9個測試用例,從而使得測試量更加龐大。根據(jù)線性代碼序列與跳轉(zhuǎn)的測試覆蓋準則,將程序在必經(jīng)節(jié)點處割斷,分別對每一段程序進行完全路徑覆蓋的充分測試。對于被割斷的程序片斷,由于沒有參數(shù)人口,可以在程序片斷的開頭增加代碼對參數(shù)進行初始化。從而達到完全測試,緩解測試量過大與測試不足的矛盾。
總結(jié)完全路徑覆蓋的具體步驟如下:
1、將判定語句的條件進行分離,細化程序流程圖,使其不含隱含路徑。
2、根據(jù)程序流程圖畫出流圖,找出必經(jīng)節(jié)點,必經(jīng)節(jié)點數(shù)為N。
3、將程序流程圖在必經(jīng)節(jié)點處割斷,將整個程序分解為N+1個程序片斷。
4、找出程序片斷i的完全路徑,為程序片斷i的每條獨立路徑設(shè)計用例,其中:。
5、結(jié)合所設(shè)計的測試用例,將程序片斷i的參數(shù)初始化,其中。
6、將測試用例付諸測試,重復(fù)第四步至第六步,直到i=N+1。