面向?qū)ο筌浖y試技術(shù)研究
軟件測試是伴隨著軟件的產(chǎn)生而產(chǎn)生的。軟件危機(jī)的頻繁出現(xiàn)促使了軟件測試的地位得到了大幅提升。軟件測試已經(jīng)不僅僅是局限于軟件開發(fā)過程中的一個(gè)階段,它已經(jīng)開始貫穿于整個(gè)軟件開發(fā)過程,成為軟件產(chǎn)品質(zhì)量控制與質(zhì)量管理的重要手段之一。
一、前言
軟件測試技術(shù)作為軟件工程學(xué)科的一個(gè)分支,是保證軟件質(zhì)量和可靠性的關(guān)鍵,因此它也是軟件開發(fā)過程中的一個(gè)重要環(huán)節(jié)。它的核心思想是:對于輸入域的特定輸入,觀察軟件的執(zhí)行結(jié)果,驗(yàn)證該結(jié)果與期望結(jié)果是否一致,然后根據(jù)結(jié)果作相應(yīng)的糾錯(cuò)和調(diào)整。
在測試過程中,測試用例的選擇決定測試的有效性,這也就直接影響到成本,是軟件測試的關(guān)鍵和難點(diǎn)。目前,軟件測試技術(shù)的發(fā)展還不是很成熟,測試人員在選擇測試用例時(shí)通常根據(jù)直覺和經(jīng)驗(yàn)進(jìn)行,給測試帶來很大的盲目性,最終導(dǎo)致的后果是使軟件后期維護(hù)的費(fèi)用在成本中居高不下??茖W(xué)生成測試用例對提高軟件質(zhì)量不僅重要而且必要。
隨著面向?qū)ο筌浖_發(fā)技術(shù)的廣泛應(yīng)用和軟件測試自動化的要求,特別是基于的軟件開發(fā)技術(shù)的逐漸普及,基于模型的軟件測試逐漸得到了軟件開發(fā)人員和軟件測試人員的認(rèn)可和接受。它是一種新興的測試用例生成技術(shù)。有優(yōu)于以前的測試技術(shù)的方面。其中模型以其定義良好、功能強(qiáng)大、普遍適用的優(yōu)點(diǎn),為基于模型的測試提供了非常好的契機(jī)。
二、面向?qū)ο筇卣鲗浖y試的影響
面向?qū)ο蠹夹g(shù)是一個(gè)全新的開發(fā)模式,具有以下特點(diǎn):
(1)它要綜合考慮軟件開發(fā)過程所有階段。
(2)在軟件開發(fā)的整個(gè)生存周期中,每個(gè)階段之間是連續(xù)的。
(3)開發(fā)過程分為面向?qū)ο蠓治觯?0A)、面向?qū)ο笤O(shè)計(jì)(OOD)、面向?qū)ο缶幊蹋∣OP)、面向?qū)ο鬁y試(OOT)四個(gè)連續(xù)的部分。
Coad和Yourdon給面}向?qū)ο蟮母拍钕铝艘粋€(gè)定義:
面向?qū)ο?對象+類+繼承+通信
如果一個(gè)軟件系統(tǒng)是使用這樣4個(gè)概念設(shè)計(jì)和實(shí)現(xiàn)的,則認(rèn)為這個(gè)軟件系統(tǒng)是面向?qū)ο蟮?。一個(gè)而向?qū)ο蟮某绦虻拿恳粋€(gè)組成部分都是對象,計(jì)算是通過對象和對象之間的通信來執(zhí)行的。
面向?qū)ο蠹夹g(shù)的本質(zhì)是定義了類的抽象,將變量和與作用于它的操作封裝到一塊。然后用不同的類和方法組合成一個(gè)對象系統(tǒng)。面向?qū)ο筌浖鹘y(tǒng)軟件中的一個(gè)過程或一個(gè)方法內(nèi)的復(fù)雜性轉(zhuǎn)移到對象之間的交互中。面向?qū)ο笳Z言一些本質(zhì)特征形成了如下的一些新的故障、錯(cuò)誤風(fēng)險(xiǎn)。
1、基本功能模塊
在面向?qū)ο笙到y(tǒng)中,系統(tǒng)的基本構(gòu)造單元是封裝了數(shù)據(jù)和方法的類和對象,而不再是一個(gè)個(gè)能完成特定功能的功能模型。每個(gè)對象有自己的生存期,有自己的狀態(tài)。消息是對象之間相互請示或協(xié)作的途徑,是外界使用對象方法及獲取對象狀態(tài)的唯一方式。對象的功能是在消息的觸發(fā)下,由對象所屬類中定義的方法與相關(guān)對象的合作共同完成,并且對象在不同狀態(tài)下對消息的響應(yīng)可能完全同。
工作過程中,對象的狀態(tài)可能被改變,產(chǎn)生新的狀態(tài),即發(fā)生狀態(tài)的轉(zhuǎn)移。對象中的數(shù)據(jù)和方法是一個(gè)有機(jī)的整體,在軟件測試過程中,不能僅僅檢查輸入數(shù)據(jù)產(chǎn)生的輸出結(jié)果是否與預(yù)期結(jié)果相吻合,還要考慮對象的狀態(tài)變化。因此,除了要對對象的狀態(tài)與方法間的相互影響進(jìn)行測試,還要進(jìn)行狀態(tài)測試。
2、系統(tǒng)的功能實(shí)現(xiàn)
在面向?qū)ο笙到y(tǒng)中,系統(tǒng)的功能體現(xiàn)在對象間的協(xié)作上,而不再是簡單的過程調(diào)用關(guān)系。面向?qū)ο蟪绦虻膱?zhí)行實(shí)際上是執(zhí)行一個(gè)由消息連接起來的方法序列,方法的實(shí)現(xiàn)與所屬對象本身的狀態(tài)有關(guān),各方法之間可能有相互作用。為實(shí)現(xiàn)某一特定的功能,可能要激活調(diào)用屬于不同對象類的多個(gè)成員函數(shù),形成成員函數(shù)的啟用鏈。因此,基于功能分解的自頂向下或自底向上的集成測試策略不適用于面向?qū)ο筌浖到y(tǒng)的測試。
3、封裝對測試的影響
封裝是指在詞法單位之中或之間決定名字可見性的訪問控制機(jī)制。它支持信息的隱蔽和模塊化,有助于防止全局變量訪問的問題。盡管封裝不會直接促成錯(cuò)誤的發(fā)生,它卻給測試帶來了障礙。封裝使對象的內(nèi)部狀態(tài)隱蔽,如果類中未提供足夠的存取函數(shù)來表明對象的實(shí)現(xiàn)方式和內(nèi)部狀態(tài),則類的信息隱蔽機(jī)制將給測試帶來困難。
4、繼承對測試的影響
繼承也是面向?qū)ο笳Z言中的一個(gè)本質(zhì)特征。繼承可用于一般與特殊關(guān)系,并目方便編碼。但繼承削弱了封裝性,產(chǎn)生了類似于非面向?qū)ο笳Z言中全局?jǐn)?shù)據(jù)的錯(cuò)誤風(fēng)險(xiǎn)。由于繼承的作用,一個(gè)函數(shù)可能被封裝在具有繼承關(guān)系的多個(gè)類中,子類中還可以對繼承的特征進(jìn)行覆蓋或重定義。
5、多態(tài)對測試的影響
多態(tài)性是指一個(gè)引用可以與多個(gè)對象綁定的能力。多態(tài)能減少代碼的復(fù)雜性和規(guī)模,同時(shí)還可以實(shí)現(xiàn)動態(tài)綁定。但依賴于不規(guī)則的類層次的動態(tài)綁定可能產(chǎn)生編程人員沒有想到的結(jié)果。某些綁定能正確的工作但并不能保證所有的綁定都能正確地運(yùn)行。以后綁定的對象可能很容易將消息發(fā)送給錯(cuò)誤的類,執(zhí)行錯(cuò)誤的功能,還可能導(dǎo)致一些與消息序列和狀態(tài)相關(guān)的錯(cuò)誤。
三、面向?qū)ο筌浖y試的層次劃分及內(nèi)容
面向?qū)ο筌浖y試的測試工作過程與傳統(tǒng)的測試一樣,分為以下幾個(gè)階段:制定測試計(jì)劃、產(chǎn)生測試用例、執(zhí)行測試和評價(jià)。目前,面向?qū)ο筌浖y試劃分方法是:方法測試、類測試、類簇測試、系統(tǒng)測試。
1、方法測試
方法測試主要考察封裝在類中的一個(gè)方法對數(shù)據(jù)進(jìn)行的操作,它與傳統(tǒng)的單元模塊測試相對應(yīng),可以將傳統(tǒng)成熟的單元測試方法。但是,方法與數(shù)據(jù)一起被封裝在類中,并通過向所在對象發(fā)送消息來驅(qū)動,它的執(zhí)行與對象狀態(tài)有關(guān),也有可能會改變對象的狀態(tài)。因此,設(shè)計(jì)測試用例時(shí)要考慮設(shè)置對象的初態(tài),使它收到消息時(shí)執(zhí)行指定的路徑。
2、類測試
主要考察封裝在一個(gè)類中的方法與數(shù)據(jù)之間的相互作用。一個(gè)對象有它自己的狀態(tài)和依賴于狀態(tài)的行為,對象操作既與對象狀態(tài)有關(guān),又反過來可能改變對象的狀態(tài)。普遍認(rèn)為這一級別的測試是必須的。類測試時(shí)要把對象與狀態(tài)結(jié)合起來,進(jìn)行對象狀態(tài)行為的測試。類測試可分以下兩個(gè)部分:
(1)基于狀態(tài)的測試
考察類的實(shí)例在其生命期各個(gè)狀態(tài)下的情況。這類方法的優(yōu)勢是可以充分借鑒成熟的有限狀態(tài)自動機(jī)理論,但執(zhí)行起來還很困難。一是狀態(tài)空間可能太大,二是很難對一些類建立起狀態(tài)模型,沒有一種好的規(guī)則來識別對象狀態(tài)及其狀態(tài)轉(zhuǎn)換,三是可能缺乏對被測對象的控制和觀察機(jī)制的支持。
(2)基于響應(yīng)狀態(tài)的測試
從類和對象的責(zé)任出發(fā),以外界向?qū)ο蟀l(fā)送特定的消息序列來測試對象。較有影響的是基于規(guī)約的測試方法,和基于程序的測試?;谝?guī)約的測試往往可以根據(jù)規(guī)約自動或半自動地生成測試用例,但未必能提供足夠的代碼覆蓋率?;诔绦虻臏y試大都是在傳統(tǒng)的基于程序的測試技術(shù)的推廣,有一定的實(shí)用性但方法過于復(fù)雜且效率不高。
3、系統(tǒng)測試
系統(tǒng)測試是對所有類和主程序構(gòu)成的整個(gè)系統(tǒng)進(jìn)行整體測試,以驗(yàn)證軟件系統(tǒng)的正確性和性能指標(biāo)等滿足需求式樣說明書和任務(wù)書所指定的要求。它與傳統(tǒng)的系統(tǒng)測試一樣,包括功能測試、性能測試、余量測試等,可套用傳統(tǒng)的系統(tǒng)測試方法。
四、面向?qū)ο筌浖y試的覆蓋準(zhǔn)則
測試覆蓋標(biāo)準(zhǔn)是對軟件測試充分性的度量,任何測試策略都應(yīng)該有相對應(yīng)的覆蓋標(biāo)準(zhǔn),在此基礎(chǔ)上選擇測試用例,通過覆蓋率來說明測試結(jié)果的可信性。傳統(tǒng)的軟件測試的覆蓋標(biāo)準(zhǔn)對基于代碼的測試而言,主要是代碼覆蓋,可細(xì)分為語句覆蓋、路徑覆蓋、分支覆蓋、判定分支覆蓋,其中判定分支是最強(qiáng)的覆蓋標(biāo)準(zhǔn)。
對于面向?qū)ο筌浖臏y試而言代碼的覆蓋只對方法級測試適用,為了測試面向?qū)ο蟪绦蛟O(shè)計(jì)機(jī)制帶來的錯(cuò)誤風(fēng)險(xiǎn),必須引入新的覆蓋標(biāo)準(zhǔn)。對于繼承而言,要求達(dá)到繼承的上下文覆蓋;多態(tài)性要求覆蓋所有可能的消息綁定;基于代數(shù)規(guī)約的測試要求能達(dá)到公理的覆蓋;基于狀態(tài)的測試要求能覆蓋所有的狀態(tài)和轉(zhuǎn)換。
【編輯推薦】
- 詳談軟件測試中的動態(tài)測試
- 通過軟件測試防止IT浪費(fèi) 降低成本和風(fēng)險(xiǎn)
- 軟件測試接口測試的測試用例類型
- “腳踩二枝”做軟件測試復(fù)合型人才
- 嵌入式軟件測試淺談