第16章 軟件測(cè)試技術(shù)
軟件測(cè)試的重要性及其對(duì)軟件質(zhì)量的好壞的預(yù)意是非常重要的。下面這段話引自Deutsch[DEU79]:性及其對(duì)軟件質(zhì)量的好壞的預(yù)意是非常重要的。下面這段話引自Deutsch[DEU79]:
軟件系統(tǒng)的開(kāi)發(fā)包括一系列生產(chǎn)活動(dòng),其中由人帶來(lái)的錯(cuò)誤因素非常多。錯(cuò)誤可能出現(xiàn)在程序的最初…,其時(shí)目標(biāo)可能是錯(cuò)誤的或描述不完整,也可能在后期的設(shè)計(jì)和開(kāi)發(fā)階段…,因?yàn)槿藗儾荒芡旰脽o(wú)缺地工作和交流,軟件開(kāi)發(fā)過(guò)程中必須伴有質(zhì)量保證活動(dòng)。
軟件測(cè)試是軟件質(zhì)量保證的關(guān)鍵元素,代表了規(guī)約、設(shè)計(jì)和編碼的最終檢查。
軟件作為系統(tǒng)元素的可見(jiàn)性不斷增加軟件故障帶來(lái)的代價(jià)太高使得人們注重于規(guī)劃良好的徹底測(cè)試,軟件開(kāi)發(fā)組織將30%—40%的項(xiàng)目精力花在測(cè)試上并不為怪。另一方面,人命悠關(guān)的軟件(如飛行控制和核反應(yīng)堆)測(cè)試所花的時(shí)間往往是其他軟件工程活動(dòng)時(shí)間之和的三到五倍。
本章討論軟件測(cè)試基礎(chǔ)和設(shè)計(jì)軟件測(cè)試用例的技術(shù)。軟件測(cè)試基礎(chǔ)定義了軟件測(cè)試的目標(biāo),測(cè)試用例的設(shè)計(jì)討論符合整體目標(biāo)的測(cè)試用例創(chuàng)建技術(shù)。第17章討論測(cè)試策略和軟件調(diào)試。
16.1軟件測(cè)試基礎(chǔ)
測(cè)試為軟件工程師帶來(lái)了很有趣的意外。在軟件過(guò)程的早期,軟件工程師試圖由抽象概念到具體實(shí)現(xiàn)來(lái)建立軟件,現(xiàn)在來(lái)了測(cè)試,工程師創(chuàng)建測(cè)試用例試圖“摧毀”已經(jīng)建立的軟件。事實(shí)上,在軟件工程過(guò)程中,測(cè)試可以看成(至少心理上)摧毀性的而不是建設(shè)性的。
軟件開(kāi)發(fā)者就其本性而言是建設(shè)者,測(cè)試要求開(kāi)發(fā)者放棄剛開(kāi)發(fā)的軟件是正確的觀念,并克服發(fā)現(xiàn)錯(cuò)誤時(shí)的心理矛盾。Beizers[BEI90]如下描述了這種情況:
如果我們真正擅長(zhǎng)編程,就應(yīng)當(dāng)不會(huì)有錯(cuò)誤,但這只是一個(gè)神話。如果我們真的很認(rèn)真,如果每個(gè)人都使用結(jié)構(gòu)化方法,自頂向下設(shè)計(jì)而且使用決策表,如果程序是用SQUISH寫(xiě)的,如果我們有合適的銀彈,就不會(huì)有錯(cuò)誤了,這樣,神話就不存在。因?yàn)槲覀儾⒉簧瞄L(zhǎng)所做的事,所以有錯(cuò)誤,如果不擅長(zhǎng),就應(yīng)當(dāng)感到內(nèi)疚。因此,測(cè)試和測(cè)試用例設(shè)計(jì)是對(duì)失誤的承認(rèn),它注入了一針內(nèi)疚劑。測(cè)試的枯燥是對(duì)我們錯(cuò)誤的處罰,為什么處罰?為了人?為什么內(nèi)疚?為了沒(méi)能達(dá)到人類(lèi)的完美境界?為了沒(méi)有區(qū)別另一個(gè)程序員所想的和所說(shuō)的?為了沒(méi)有心靈感應(yīng)?為了沒(méi)有解決人類(lèi)四千年來(lái)尚未解決的相互通信問(wèn)題?
測(cè)試真的應(yīng)當(dāng)注入內(nèi)疚感?測(cè)試真的是摧毀性的?這些問(wèn)題的回答是“不!”,然而,測(cè)試的目標(biāo)可能和我們所期待的不同。
16.1.1測(cè)試目標(biāo)
Glen Myers[MYE79]在他的軟件測(cè)試著作中陳述了一系列關(guān)于測(cè)試目標(biāo)的規(guī)則:歡?,拆}?
1.測(cè)試是一個(gè)為了尋找錯(cuò)誤而運(yùn)行程序的過(guò)程。
2.一個(gè)好的測(cè)試用例是指很可能找到迄今為止尚未發(fā)現(xiàn)的錯(cuò)誤的用例。
3.一個(gè)成功的測(cè)試是指揭示了迄今為止尚未發(fā)現(xiàn)的錯(cuò)誤的測(cè)試。
上述目標(biāo)蘊(yùn)含了一個(gè)觀點(diǎn)上的戲劇性變化,他們轉(zhuǎn)向通常的觀點(diǎn),即一個(gè)成功的測(cè)試是指沒(méi)有找到錯(cuò)誤的測(cè)試。我們的目標(biāo)是設(shè)計(jì)這樣的測(cè)試,它們能夠系統(tǒng)地揭示不同類(lèi)型的錯(cuò)誤,并且耗費(fèi)最少時(shí)間與最小工作量。
如果成功構(gòu)造了測(cè)試(根據(jù)上述目標(biāo)),則能夠在軟件中揭示錯(cuò)誤。測(cè)試的第二個(gè)好處在于它證實(shí)了軟件依據(jù)規(guī)約所具有的功能及其性能需求,此外,構(gòu)造測(cè)試時(shí)的數(shù)據(jù)收集提供了軟件可靠性以及軟件整體質(zhì)量的一些信息。但是,有一件事測(cè)試無(wú)法完成:
測(cè)試無(wú)法說(shuō)明錯(cuò)誤不存在,它只能表示軟件錯(cuò)誤已經(jīng)出現(xiàn)。
在構(gòu)造測(cè)試時(shí)必須牢記這一點(diǎn)。
16.1.2測(cè)試原則
在設(shè)計(jì)有效的測(cè)試用例之前,軟件工程師必須理解軟件測(cè)試的基本原則。Davie[DAV95]提出了一組①測(cè)試原則:
·所有的測(cè)試都應(yīng)追溯到用戶(hù)需求。正如我們所知,軟件測(cè)試的目標(biāo)在于揭示錯(cuò)誤。而最嚴(yán)重的錯(cuò)誤(從用戶(hù)角度來(lái)看)是那些導(dǎo)致程序無(wú)法滿足需求的錯(cuò)誤。
·應(yīng)該在測(cè)試工作真正開(kāi)始的前較長(zhǎng)時(shí)間內(nèi)就進(jìn)行測(cè)試計(jì)劃。測(cè)試計(jì)劃(第17章)可以在需求模型一完成就開(kāi)始,詳細(xì)的測(cè)試用例定義可以在設(shè)計(jì)模型被確定后立即開(kāi)始,因此,所有測(cè)試可以在任何代碼被產(chǎn)生前進(jìn)行計(jì)劃和設(shè)計(jì)。
· Pareto原則應(yīng)用于軟件測(cè)試。簡(jiǎn)單而言, Pareto原則暗示著測(cè)試發(fā)現(xiàn)的錯(cuò)誤中的80%很可能起源于程序模塊中的20%。當(dāng)然,問(wèn)題在于如何孤立這些有疑點(diǎn)的模塊并進(jìn)行徹底的測(cè)試。
·測(cè)試應(yīng)從“小規(guī)?!遍_(kāi)始,逐步轉(zhuǎn)向“大規(guī)?!?。最初的測(cè)試通常把焦點(diǎn)放在單個(gè)程序模塊上,進(jìn)一步測(cè)試的焦點(diǎn)則轉(zhuǎn)向在集成的模塊簇中尋找錯(cuò)誤,最后在整個(gè)系統(tǒng)中尋找錯(cuò)誤(第17章)。
·窮舉測(cè)試是不可能的。甚至一個(gè)大小適度的程序,其路徑排列的數(shù)量也非常大(進(jìn)一步討論參見(jiàn)第16.2節(jié)),因此,在測(cè)試中不可能運(yùn)行路徑的每一種組合,然而,充分覆蓋程序邏輯,并確保程序設(shè)計(jì)中使用的所有條件是有可能的。
·為了達(dá)到效果,應(yīng)該由獨(dú)立的第三方來(lái)構(gòu)造測(cè)試?!靶Ч敝缸羁赡馨l(fā)現(xiàn)錯(cuò)誤的測(cè)試(測(cè)試的主要目標(biāo))。由于本章中已經(jīng)介紹過(guò)、并將在第17章進(jìn)一步討論的那些原因,創(chuàng)建系統(tǒng)的軟件工程師并不是構(gòu)造軟件測(cè)試的人選。
軟件測(cè)試的重要性及其對(duì)軟件質(zhì)量的好壞的預(yù)意是非常重要的。下面這段話引自Deutsch[DEU79]:性及其對(duì)軟件質(zhì)量的好壞的預(yù)意是非常重要的。下面這段話引自Deutsch[DEU79]:
軟件系統(tǒng)的開(kāi)發(fā)包括一系列生產(chǎn)活動(dòng),其中由人帶來(lái)的錯(cuò)誤因素非常多。錯(cuò)誤可能出現(xiàn)在程序的最初…,其時(shí)目標(biāo)可能是錯(cuò)誤的或描述不完整,也可能在后期的設(shè)計(jì)和開(kāi)發(fā)階段…,因?yàn)槿藗儾荒芡旰脽o(wú)缺地工作和交流,軟件開(kāi)發(fā)過(guò)程中必須伴有質(zhì)量保證活動(dòng)。
軟件測(cè)試是軟件質(zhì)量保證的關(guān)鍵元素,代表了規(guī)約、設(shè)計(jì)和編碼的最終檢查。
軟件作為系統(tǒng)元素的可見(jiàn)性不斷增加軟件故障帶來(lái)的代價(jià)太高使得人們注重于規(guī)劃良好的徹底測(cè)試,軟件開(kāi)發(fā)組織將30%—40%的項(xiàng)目精力花在測(cè)試上并不為怪。另一方面,人命悠關(guān)的軟件(如飛行控制和核反應(yīng)堆)測(cè)試所花的時(shí)間往往是其他軟件工程活動(dòng)時(shí)間之和的三到五倍。
本章討論軟件測(cè)試基礎(chǔ)和設(shè)計(jì)軟件測(cè)試用例的技術(shù)。軟件測(cè)試基礎(chǔ)定義了軟件測(cè)試的目標(biāo),測(cè)試用例的設(shè)計(jì)討論符合整體目標(biāo)的測(cè)試用例創(chuàng)建技術(shù)。第17章討論測(cè)試策略和軟件調(diào)試。
16.1軟件測(cè)試基礎(chǔ)
測(cè)試為軟件工程師帶來(lái)了很有趣的意外。在軟件過(guò)程的早期,軟件工程師試圖由抽象概念到具體實(shí)現(xiàn)來(lái)建立軟件,現(xiàn)在來(lái)了測(cè)試,工程師創(chuàng)建測(cè)試用例試圖“摧毀”已經(jīng)建立的軟件。事實(shí)上,在軟件工程過(guò)程中,測(cè)試可以看成(至少心理上)摧毀性的而不是建設(shè)性的。
軟件開(kāi)發(fā)者就其本性而言是建設(shè)者,測(cè)試要求開(kāi)發(fā)者放棄剛開(kāi)發(fā)的軟件是正確的觀念,并克服發(fā)現(xiàn)錯(cuò)誤時(shí)的心理矛盾。Beizers[BEI90]如下描述了這種情況:
如果我們真正擅長(zhǎng)編程,就應(yīng)當(dāng)不會(huì)有錯(cuò)誤,但這只是一個(gè)神話。如果我們真的很認(rèn)真,如果每個(gè)人都使用結(jié)構(gòu)化方法,自頂向下設(shè)計(jì)而且使用決策表,如果程序是用SQUISH寫(xiě)的,如果我們有合適的銀彈,就不會(huì)有錯(cuò)誤了,這樣,神話就不存在。因?yàn)槲覀儾⒉簧瞄L(zhǎng)所做的事,所以有錯(cuò)誤,如果不擅長(zhǎng),就應(yīng)當(dāng)感到內(nèi)疚。因此,測(cè)試和測(cè)試用例設(shè)計(jì)是對(duì)失誤的承認(rèn),它注入了一針內(nèi)疚劑。測(cè)試的枯燥是對(duì)我們錯(cuò)誤的處罰,為什么處罰?為了人?為什么內(nèi)疚?為了沒(méi)能達(dá)到人類(lèi)的完美境界?為了沒(méi)有區(qū)別另一個(gè)程序員所想的和所說(shuō)的?為了沒(méi)有心靈感應(yīng)?為了沒(méi)有解決人類(lèi)四千年來(lái)尚未解決的相互通信問(wèn)題?
測(cè)試真的應(yīng)當(dāng)注入內(nèi)疚感?測(cè)試真的是摧毀性的?這些問(wèn)題的回答是“不!”,然而,測(cè)試的目標(biāo)可能和我們所期待的不同。
16.1.1測(cè)試目標(biāo)
Glen Myers[MYE79]在他的軟件測(cè)試著作中陳述了一系列關(guān)于測(cè)試目標(biāo)的規(guī)則:歡?,拆}?
1.測(cè)試是一個(gè)為了尋找錯(cuò)誤而運(yùn)行程序的過(guò)程。
2.一個(gè)好的測(cè)試用例是指很可能找到迄今為止尚未發(fā)現(xiàn)的錯(cuò)誤的用例。
3.一個(gè)成功的測(cè)試是指揭示了迄今為止尚未發(fā)現(xiàn)的錯(cuò)誤的測(cè)試。
上述目標(biāo)蘊(yùn)含了一個(gè)觀點(diǎn)上的戲劇性變化,他們轉(zhuǎn)向通常的觀點(diǎn),即一個(gè)成功的測(cè)試是指沒(méi)有找到錯(cuò)誤的測(cè)試。我們的目標(biāo)是設(shè)計(jì)這樣的測(cè)試,它們能夠系統(tǒng)地揭示不同類(lèi)型的錯(cuò)誤,并且耗費(fèi)最少時(shí)間與最小工作量。
如果成功構(gòu)造了測(cè)試(根據(jù)上述目標(biāo)),則能夠在軟件中揭示錯(cuò)誤。測(cè)試的第二個(gè)好處在于它證實(shí)了軟件依據(jù)規(guī)約所具有的功能及其性能需求,此外,構(gòu)造測(cè)試時(shí)的數(shù)據(jù)收集提供了軟件可靠性以及軟件整體質(zhì)量的一些信息。但是,有一件事測(cè)試無(wú)法完成:
測(cè)試無(wú)法說(shuō)明錯(cuò)誤不存在,它只能表示軟件錯(cuò)誤已經(jīng)出現(xiàn)。
在構(gòu)造測(cè)試時(shí)必須牢記這一點(diǎn)。
16.1.2測(cè)試原則
在設(shè)計(jì)有效的測(cè)試用例之前,軟件工程師必須理解軟件測(cè)試的基本原則。Davie[DAV95]提出了一組①測(cè)試原則:
·所有的測(cè)試都應(yīng)追溯到用戶(hù)需求。正如我們所知,軟件測(cè)試的目標(biāo)在于揭示錯(cuò)誤。而最嚴(yán)重的錯(cuò)誤(從用戶(hù)角度來(lái)看)是那些導(dǎo)致程序無(wú)法滿足需求的錯(cuò)誤。
·應(yīng)該在測(cè)試工作真正開(kāi)始的前較長(zhǎng)時(shí)間內(nèi)就進(jìn)行測(cè)試計(jì)劃。測(cè)試計(jì)劃(第17章)可以在需求模型一完成就開(kāi)始,詳細(xì)的測(cè)試用例定義可以在設(shè)計(jì)模型被確定后立即開(kāi)始,因此,所有測(cè)試可以在任何代碼被產(chǎn)生前進(jìn)行計(jì)劃和設(shè)計(jì)。
· Pareto原則應(yīng)用于軟件測(cè)試。簡(jiǎn)單而言, Pareto原則暗示著測(cè)試發(fā)現(xiàn)的錯(cuò)誤中的80%很可能起源于程序模塊中的20%。當(dāng)然,問(wèn)題在于如何孤立這些有疑點(diǎn)的模塊并進(jìn)行徹底的測(cè)試。
·測(cè)試應(yīng)從“小規(guī)?!遍_(kāi)始,逐步轉(zhuǎn)向“大規(guī)?!?。最初的測(cè)試通常把焦點(diǎn)放在單個(gè)程序模塊上,進(jìn)一步測(cè)試的焦點(diǎn)則轉(zhuǎn)向在集成的模塊簇中尋找錯(cuò)誤,最后在整個(gè)系統(tǒng)中尋找錯(cuò)誤(第17章)。
·窮舉測(cè)試是不可能的。甚至一個(gè)大小適度的程序,其路徑排列的數(shù)量也非常大(進(jìn)一步討論參見(jiàn)第16.2節(jié)),因此,在測(cè)試中不可能運(yùn)行路徑的每一種組合,然而,充分覆蓋程序邏輯,并確保程序設(shè)計(jì)中使用的所有條件是有可能的。
·為了達(dá)到效果,應(yīng)該由獨(dú)立的第三方來(lái)構(gòu)造測(cè)試?!靶Ч敝缸羁赡馨l(fā)現(xiàn)錯(cuò)誤的測(cè)試(測(cè)試的主要目標(biāo))。由于本章中已經(jīng)介紹過(guò)、并將在第17章進(jìn)一步討論的那些原因,創(chuàng)建系統(tǒng)的軟件工程師并不是構(gòu)造軟件測(cè)試的人選。