【導(dǎo)讀】軟件開(kāi)發(fā)由于是人為的設(shè)計(jì)和開(kāi)發(fā)過(guò)程,發(fā)乍缺陷很難避免,傳統(tǒng)軟件工程做法足通過(guò)軟件測(cè)試,控制軟件存在的缺陷。在本文中我們討論通過(guò)實(shí)施有效的評(píng)審和檢查以及軟件測(cè)試活動(dòng),控制軟件交付后,存在較少缺陷。1 引言  每個(gè)產(chǎn)品都會(huì)有缺陷,在軟件開(kāi)發(fā)過(guò)程中應(yīng)爭(zhēng)取盡早發(fā)現(xiàn)缺陷,開(kāi)發(fā)的時(shí)候提高軟件質(zhì)量要遠(yuǎn)比開(kāi)發(fā)完成 后再進(jìn)行測(cè)試更為有效。一般對(duì)軟件開(kāi)發(fā)主要控制缺陷手段是進(jìn)行測(cè)試和檢查,在一定程度上可以確保不讓不 合格產(chǎn)品交付到用戶手里,然而能夠保證最初制造的產(chǎn)品就是一個(gè)合格產(chǎn)品嗎能將質(zhì)量測(cè)試融入產(chǎn)品中去 嗎實(shí)現(xiàn)起來(lái)比較困難,而且只能在開(kāi)發(fā)的結(jié)束才能進(jìn)行測(cè)試。其實(shí)這不僅是改進(jìn)軟件流程所獨(dú)有的現(xiàn)象,也 是目前軟件開(kāi)發(fā)共同面臨的問(wèn)題。要想得到高質(zhì)量軟件, 重要的是將質(zhì)量設(shè)計(jì)到軟件中。這比如何設(shè)置質(zhì)量保證 部門、向誰(shuí)報(bào)告、獨(dú)立測(cè)試、需要進(jìn)行什么樣的評(píng)審等事情重要得多。要想在軟件開(kāi)發(fā)的每個(gè)階段都注重質(zhì)量需要有一個(gè)流程進(jìn)行管理,大多數(shù)軟件流程改進(jìn)模型(像CMM和ISO9000)都認(rèn)為有效和正確的流程必然會(huì)導(dǎo)致生產(chǎn)出高質(zhì)量軟件。我們有理由相信有效的流程肯定能制作出一開(kāi)始就能正常工作的高質(zhì)量軟件。下面先介紹缺陷管理的基本原理,然后討論軟件在產(chǎn)品開(kāi)發(fā)周期中的驗(yàn)證和確認(rèn),特別是所采用的評(píng)審、檢查和測(cè)試技術(shù)。2 缺陷管理  軟件中一般會(huì)有問(wèn)題和缺陷,其實(shí)這都是一些由開(kāi)發(fā)人員造成的軟件錯(cuò)誤,這些缺陷實(shí)際上在開(kāi)發(fā)過(guò)程從 提出要求到進(jìn)行維護(hù)的任一階段都可能造成。假如適當(dāng)條件永遠(yuǎn)不發(fā)生而沒(méi)有觸發(fā)執(zhí)行有問(wèn)題代碼的話,缺陷 就將隱藏下去,否則它們會(huì)暴露出來(lái)而造成失效。失效的嚴(yán)重程度不盡相同,最壞情況下失效可使系統(tǒng)崩潰或 者系統(tǒng)功能不正常,而輕微時(shí)失效僅僅使用戶感到不方便或不滿意而已(如響應(yīng)時(shí)間太慢或者接口使用困難等)?! ‘?dāng)然還是應(yīng)該盡量避免缺陷,關(guān)于缺陷管理有兩個(gè)指導(dǎo)性原則。首先,在最初階段就要避免造成缺陷,可 以通過(guò)在產(chǎn)品開(kāi)發(fā)周期每個(gè)步驟都使用正確技術(shù)做到這一點(diǎn)。第二個(gè)原則就是在流程中盡可能早地檢測(cè)出缺陷,一旦檢測(cè)到就要從源頭處把它消除掉。這就是說(shuō)如果缺陷是在低層設(shè)計(jì)中造成的,就應(yīng)在此時(shí)把它消 除,最好在編碼開(kāi)始前。  時(shí)間拖得越久,消除和修復(fù)缺陷的費(fèi)用就越高。研究指出,缺陷在產(chǎn)品開(kāi)發(fā)周期晚期發(fā)現(xiàn)其消除的費(fèi)用將 會(huì)急劇上升。為避免缺陷,需要針對(duì)軟件開(kāi)發(fā)每一階段的特殊技術(shù)進(jìn)行培訓(xùn)?! ⊥ㄟ^(guò)評(píng)審檢查的驗(yàn)證和確認(rèn)活動(dòng),是缺陷形成后盡早檢測(cè)出來(lái)并從源頭處把它消滅掉,這樣做不僅去除缺 陷的費(fèi)用更少,而且使我們相信質(zhì)量已被制造在產(chǎn)品中,而不是直到裝運(yùn)前才將高質(zhì)量產(chǎn)品篩選出來(lái)。通過(guò)評(píng)審就是在每一階段對(duì)軟件進(jìn)行評(píng)估,以保證它符合前一階 段所提出的要求,同時(shí),通過(guò)在開(kāi)發(fā)工作完成時(shí)對(duì)軟件及其技術(shù)指標(biāo)規(guī)范進(jìn)行測(cè)試,以保證軟件符合總體要求。3 評(píng)審和檢查  有人說(shuō)技術(shù)工作需要進(jìn)行評(píng)審就如同鉛筆需要橡皮擦一樣,因?yàn)槿丝偸且稿e(cuò)誤的。在開(kāi)發(fā)過(guò)程的各個(gè)階段進(jìn)行評(píng)審,如果軟件開(kāi)發(fā)時(shí)沒(méi)有定出精確要求,則根本不可能通過(guò)評(píng)審或其它方法驗(yàn)證設(shè)計(jì)是否準(zhǔn)確,因?yàn)榇藭r(shí)設(shè)計(jì)不是根據(jù)要求做出而是孤立的,任何對(duì)缺陷的判定最終都是個(gè)人觀點(diǎn)。因此評(píng)審和檢查首先假設(shè)軟件開(kāi)發(fā)過(guò)程已有嚴(yán)格的要求。評(píng)審每個(gè)開(kāi)發(fā)階段的中間產(chǎn)品有兩個(gè)基本作用。首先,我們能在早期檢查出缺陷并在修改費(fèi)用較低時(shí)將其消除掉;其次,這一點(diǎn)可能更重要,我們能夠在公司內(nèi)部改變流程,在軟件開(kāi)發(fā)最初階段就提出大量的嚴(yán)格要求。如果管理層在評(píng)審上投機(jī)取巧,則到時(shí)候可以清楚地看到?jīng)]有好的要求(或者好的設(shè)計(jì))評(píng)審就不會(huì)帶來(lái)什么價(jià)值?! ≡u(píng)審可作為質(zhì)量過(guò)濾的一種形式用于軟件開(kāi)發(fā)各階段,其目的是盡早發(fā)現(xiàn)錯(cuò)誤以使產(chǎn)品更加完善。評(píng)審 結(jié)果是:指出產(chǎn)品中需要改進(jìn)之處;確認(rèn)好的部分,使產(chǎn)品在編碼方式、文件樣式、設(shè)計(jì)方法等方面更加一致,以便技術(shù)工作能更好地進(jìn)行管理;改進(jìn)軟件開(kāi)發(fā)過(guò)程?! ∵M(jìn)行評(píng)審,確保四方面的特性。完整性,下一階段 產(chǎn)品與其前期設(shè)計(jì)的產(chǎn)品是完備的整體,沒(méi)有待定項(xiàng)、 遺漏功能。一致性,符合產(chǎn)品的要求??尚行?,產(chǎn)品能 完成。易測(cè)性,產(chǎn)品做指定測(cè)試的能力,該測(cè)試必須是 具體的、明確的和可以量化的?! ≡u(píng)審會(huì)議的組織,人員應(yīng)限于3~7人,會(huì)議中,明確分工,經(jīng)過(guò)培訓(xùn)。為使會(huì)議有效,事前做準(zhǔn)備,時(shí)間一般不超過(guò)兩個(gè)小時(shí);評(píng)審的是產(chǎn)品而不是它的設(shè)計(jì)者,要客觀地討論產(chǎn)品而不涉及與之相關(guān)的人要限制爭(zhēng)論和辯解。搞清問(wèn)題所在但不要試圖去解決任何事情會(huì)議的焦點(diǎn) 是發(fā)現(xiàn)而不是解決,正式評(píng)審中小組的目的不是進(jìn)行共同設(shè)計(jì)。會(huì)議應(yīng)沿著發(fā)現(xiàn)問(wèn)題的思路進(jìn)行,指定記錄員?! ≡u(píng)審檢查是很經(jīng)濟(jì)的,通過(guò)檢查能在修復(fù)費(fèi)用相對(duì)較低的早期階段發(fā)現(xiàn)缺陷。此外當(dāng)要求作必要的修改 時(shí),對(duì)多層次設(shè)計(jì)文件、產(chǎn)品代碼及產(chǎn)品文件進(jìn)行改動(dòng)會(huì)出現(xiàn)脈動(dòng)效應(yīng),而檢查能防止這類效應(yīng),評(píng)審的另一 個(gè)關(guān)鍵是它設(shè)計(jì)為檢測(cè)缺陷而不是檢測(cè)失效。最后,因 為每一個(gè)中間產(chǎn)品必須要能追溯至前一級(jí)中間產(chǎn)品,所以評(píng)審必然會(huì)改善整個(gè)流程,而要求的準(zhǔn)備和設(shè)計(jì)工作都做得很差的小組幾乎就拿不出合適的東西進(jìn)行評(píng)審。4 軟件測(cè)試  雖然正式評(píng)審和檢查占用了我們大量的精力,測(cè)試 仍然是缺陷控制和檢查中很有用且很重要的一個(gè)部分。 測(cè)試時(shí)我們?cè)谑芸貭顟B(tài)下運(yùn)行軟件以檢測(cè)缺陷,如同我們?cè)谔嵋?、設(shè)計(jì)和編碼等各階段進(jìn)行評(píng)審和檢查一樣,我們?cè)谲浖谱鞯娜魏芜m當(dāng)?shù)牡胤竭M(jìn)行測(cè)試。下面將簡(jiǎn)單介紹單元測(cè)試、集成測(cè)試,系統(tǒng)測(cè)試和回歸測(cè)試?! ?b>4.1單元測(cè)試  單元測(cè)試的任務(wù)是在一個(gè)受控環(huán)境中執(zhí)行—個(gè)特定模塊。它—般包括某種形式的構(gòu)架,通常為短線程和驅(qū)動(dòng)器。 —般用來(lái)驗(yàn)證模塊的功能屬性,但也可以測(cè)試其它項(xiàng)目,如性能、可用性等等,可使用“黑盒”或“白盒”方法進(jìn)行。  4.2集成測(cè)試  當(dāng)各模塊已經(jīng)過(guò)單獨(dú)的單元測(cè)試后,我們就將它們組合到一起,看與其它模塊集成在一起時(shí)的整體功能。模塊可按多種途徑集成,包括從上向下和從下向上。實(shí)際上任何方法都可以使用,只要測(cè)試人員能了解特定模塊組合所 表示的行為,組合從最前面兩個(gè)模塊開(kāi)始,到加入最后一個(gè) 模塊結(jié)束,形成一個(gè)完整的系統(tǒng)。理想狀況下,集成測(cè)試應(yīng) 每加入一個(gè)模塊進(jìn)行一次。集成測(cè)試—般也看作驗(yàn)證的一 種形式,因?yàn)榻M合模塊的行為是一個(gè)功能規(guī)范的產(chǎn)品。4.3系統(tǒng)測(cè)試  系統(tǒng)測(cè)試是指對(duì)整個(gè)系統(tǒng)或產(chǎn)品進(jìn)行測(cè)試,看它是否符合總體系統(tǒng)要求。系統(tǒng)測(cè)試人員相當(dāng)于用戶代言 人,因?yàn)闇y(cè)試指導(dǎo)文件應(yīng)該或者是用戶提出的需求,或者是直接基于這一要求的技術(shù)規(guī)范。系統(tǒng)測(cè)試能發(fā)現(xiàn) 任何質(zhì)量問(wèn)題,包括功能、性能、可靠性和可用性,還有特定項(xiàng)目的其他方面要求?! ?b>4.4回歸測(cè)試  回歸測(cè)試就是漏洞修復(fù)完成后再對(duì)軟件進(jìn)行測(cè)試, 以確保軟件沒(méi)有產(chǎn)生“回歸”或因修復(fù)而變得更糟,這 種測(cè)試一般要重新運(yùn)行最初發(fā)現(xiàn)問(wèn)題的原始測(cè)試程序?! y(cè)試是一個(gè)專業(yè),要用專門的一套技術(shù)來(lái)進(jìn)行關(guān)鍵的工作。好的測(cè)試是從一開(kāi)始就參加軟件開(kāi)發(fā),可為產(chǎn)品開(kāi) 發(fā)階段帶來(lái)一種質(zhì)量的觀念。盡量使產(chǎn)品暴露出問(wèn)題才是公司和用戶的最大利益所在,應(yīng)當(dāng)注意的是測(cè)試的技能 與開(kāi)發(fā)并不相同。常常和測(cè)試聯(lián)系在一起的用戶和開(kāi)發(fā) 人員,但用這兩類人作測(cè)試都存在一些問(wèn)題。開(kāi)發(fā)人員的工作是構(gòu)建,他制造產(chǎn)品;而測(cè)試人員的任務(wù)則是找出缺 陷,每個(gè)工作都要求特定的個(gè)陛,在兩者之間隨意變動(dòng)不是小事。更重要的是,讓開(kāi)發(fā)人員去測(cè)試自已的代碼,當(dāng)處理代碼的薄弱部位時(shí),會(huì)不自覺(jué)地退縮,不是很好地了解問(wèn)題而是繞開(kāi)軟件中有問(wèn)題的部分,他們沒(méi)有足夠的勇氣對(duì)自己動(dòng)手術(shù)。由用戶來(lái)進(jìn)行測(cè)試,雖然在可用性方面能提供大量反饋。用戶在測(cè)試時(shí)通常重復(fù),不夠系統(tǒng),另外缺乏想象力。對(duì)新軟件缺乏信心,速度也比較慢。5 結(jié)束語(yǔ)  許多公司對(duì)獨(dú)立測(cè)試或功能驗(yàn)證相當(dāng)滿意。但這 些公司的測(cè)試一般是在流程結(jié)束時(shí)才會(huì)進(jìn)行,以確定產(chǎn) 品達(dá)到必要的質(zhì)量水平。本文重點(diǎn)是評(píng)審和檢查,盡管這兩種技術(shù)提供了一個(gè)更可靠的機(jī)制,可以隨著開(kāi)發(fā)階段的進(jìn)行將質(zhì)量制造在產(chǎn)品中,但它們?cè)谲浖局惺褂玫貌⒉黄毡?。用很少人?duì)產(chǎn)品進(jìn)行直觀檢查在很多 方面會(huì)相當(dāng)費(fèi)力,但其潛在的好處是巨大的。每個(gè)產(chǎn)品 都有缺陷,這是無(wú)法改變的,但產(chǎn)品中的缺陷遲早都是 會(huì)發(fā)現(xiàn)的。最壞的情況是在應(yīng)用現(xiàn)場(chǎng)發(fā)現(xiàn),最好則是盡 可能早地在軟件開(kāi)發(fā)過(guò)程中發(fā)現(xiàn)缺陷。一個(gè)很充分的 理由就是應(yīng)該制造缺陷更少的產(chǎn)品,并且這些剩下的缺 陷其嚴(yán)重程度應(yīng)能被用戶所接受。