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

