綜合測(cè)試的基本方法
時(shí)常有這樣的情況發(fā)生,每個(gè)模塊都能單獨(dú)工作,但這些模塊集成在一起之后卻不能正常工作。主要原因是,模塊相互調(diào)用時(shí)接口會(huì)引入許多新問(wèn)題。例如,數(shù)據(jù)經(jīng)過(guò)接口可能丟失;一個(gè)模塊對(duì)另一模塊可能造成不應(yīng)有的影響;幾個(gè)子功能組合起來(lái)不能實(shí)現(xiàn)主功能;誤差不斷積累達(dá)到不可接受的程度;全局?jǐn)?shù)據(jù)結(jié)構(gòu)出現(xiàn)錯(cuò)誤,等等。綜合測(cè)試是組裝軟件的系統(tǒng)測(cè)試技術(shù),按設(shè)計(jì)要求把通過(guò)單元測(cè)試的各個(gè)模塊組裝在一起之后,進(jìn)行綜合測(cè)試以便發(fā)現(xiàn)與接口有關(guān)的各種錯(cuò)誤。
某設(shè)計(jì)人員習(xí)慣于把所有模塊按設(shè)計(jì)要求一次全部組裝起來(lái),然后進(jìn)行整體測(cè)試,這稱為非增量式集成。這種方法容易出現(xiàn)混亂。因?yàn)闇y(cè)試時(shí)可能發(fā)現(xiàn)一大堆錯(cuò)誤,為每個(gè)錯(cuò)誤定位和糾正非常困難,并且在改正一個(gè)錯(cuò)誤的同時(shí)又可能引入新的錯(cuò)誤,新舊錯(cuò)誤混雜,更難斷定出錯(cuò)的原因和位置。與之相反的是增量式集成方法,程序一段一段地?cái)U(kuò)展,測(cè)試的范圍一步一步地增大,錯(cuò)誤易于定位和糾正,界面的測(cè)試亦可做到完全徹底。下面討論兩種增量式集成方法。
1.自頂向下集成
自頂向下集成是構(gòu)造程序結(jié)構(gòu)的一種增量式方式,它從主控模塊開(kāi)始,按照軟件的控制層次結(jié)構(gòu),以深度優(yōu)先或廣度優(yōu)先的策略,逐步把各個(gè)模塊集成在一起。深度優(yōu)先策略首先是把主控制路徑上的模塊集成在一起,至于選擇哪一條路徑作為主控制路徑,這多少帶有隨意性,一般根據(jù)問(wèn)題的特性確定。以下圖為例,若選擇了最左一條路徑,首先將模塊M1,M2,M5和M8集成在一起,再將M6集成起來(lái),然后考慮中間和右邊的路徑。廣度優(yōu)先策略則不然,它沿控制層次結(jié)構(gòu)水平地向下移動(dòng)。仍以下圖為例,它首先把M2、M3和M4與主控模塊集成在一起,再將M5和M6 和其他模塊集資集成起來(lái)。
自頂向下綜合測(cè)試的具體步驟為:
(1)以主控模塊作為測(cè)試驅(qū)動(dòng)模塊,把對(duì)主控模塊進(jìn)行單元測(cè)試時(shí)引入的所有樁模塊用實(shí)際模塊替代;
(2)依據(jù)所選的集成策略(深度優(yōu)先或廣度優(yōu)先),每次只替代一個(gè)樁模塊;
(3)每集成一個(gè)模塊立即測(cè)試一遍;
(4)只有每組測(cè)試完成后,才著手替換下一個(gè)樁模塊;
(5)為避免引入新錯(cuò)誤,須不斷地進(jìn)行回歸測(cè)試(即全部或部分地重復(fù)已做過(guò)的測(cè)試)。
從第二步開(kāi)始,循環(huán)執(zhí)行上述步驟,直至整個(gè)程序結(jié)構(gòu)構(gòu)造完畢。下圖中,實(shí)線表示已部分完成的結(jié)構(gòu),若采用深度優(yōu)先策略,下一步將用模塊M7替換樁模塊S7,當(dāng)然M7本身可能又帶有樁模塊,隨后將被對(duì)應(yīng)的實(shí)際模塊一一替代。
自頂向下集成的優(yōu)點(diǎn)在于能盡早地對(duì)程序的主要控制和決策機(jī)制進(jìn)行檢驗(yàn),因此較早地發(fā)現(xiàn)錯(cuò)誤。缺點(diǎn)是在測(cè)試較高層模塊時(shí),低層處理采用樁模塊替代,不能反映真實(shí)情況,重要數(shù)據(jù)不能及時(shí)回送到上層模塊,因此測(cè)試并不充分。解決這個(gè)問(wèn)題有幾種辦法,第一種是把某些測(cè)試推遲到用真實(shí)模塊替代樁模塊之后進(jìn)行,第二種是開(kāi)發(fā)能模擬真實(shí)模塊的樁模塊;第三種是自底向上集成模塊。第一種方法又回退為非增量式的集成方法,使錯(cuò)誤難于定位和糾正,并且失去了在組裝模塊時(shí)進(jìn)行一些特定測(cè)試的可能性;第二種方法無(wú)疑要大大增加開(kāi)銷;第三種方法比較切實(shí)可行,下面專門討論。
2.自底向上集成
自底向上測(cè)試是從“原子”模塊(即軟件結(jié)構(gòu)最低層的模塊)開(kāi)始組裝測(cè)試,因測(cè)試到較高層模塊時(shí),所需的下層模塊功能均已具備,所以不再需要樁模塊。
自底向上綜合測(cè)試的步驟分為:
(1)把低層模塊組織成實(shí)現(xiàn)某個(gè)子功能的模塊群(cluster);
(2)開(kāi)發(fā)一個(gè)測(cè)試驅(qū)動(dòng)模塊,控制測(cè)試數(shù)據(jù)的輸入和測(cè)試結(jié)果的輸出;
(3)對(duì)每個(gè)模塊群進(jìn)行測(cè)試;
(4)刪除測(cè)試使用的驅(qū)動(dòng)模塊,用較高層模塊把模塊群組織成為完成更大功能的新模塊群。
從第一步開(kāi)始循環(huán)執(zhí)行上述各步驟,直至整個(gè)程序構(gòu)造完畢。
下圖說(shuō)明了上述過(guò)程。首先“原子”模塊被分為三個(gè)模塊群,每個(gè)模塊群引入一個(gè)驅(qū)動(dòng)模塊進(jìn)行測(cè)試。因模塊群1、模塊群2中的模塊均隸屬于模塊Ma,因此在驅(qū)動(dòng)模塊D1、D2去掉后,模塊群1與模塊群2直接與Ma接口,這時(shí)可對(duì)MaD3被去掉后,M3與模塊群3直接接口,可對(duì)Mb進(jìn)行集成測(cè)試,最后Ma、Mb和 Mc全部集成在一起進(jìn)行測(cè)試。
自底向上集成方法不用樁模塊,測(cè)試用例的設(shè)計(jì)亦相對(duì)簡(jiǎn)單,但缺點(diǎn)是程序最后一個(gè)模塊加入時(shí)才具有整體形象。它與自頂向綜合測(cè)試方法優(yōu)缺點(diǎn)正好相反。因此,在測(cè)試軟件系統(tǒng)時(shí),應(yīng)根據(jù)軟件的特點(diǎn)和工程的進(jìn)度,選用適當(dāng)?shù)臏y(cè)試策略,有時(shí)混和使用兩種策略更為有效,上層模塊用自頂向下的方法,下層模塊用自底向上的方法。
此外,在綜合測(cè)試中尤其要注意關(guān)鍵模塊,所謂關(guān)鍵模塊一般都具有下述一或多個(gè)特征:①對(duì)應(yīng)幾條需求;②具有高層控制功能;③復(fù)雜、易出錯(cuò);④有特殊的性能要求。關(guān)鍵模塊應(yīng)盡早測(cè)試,并反復(fù)進(jìn)行回歸測(cè)試。