軟件測(cè)試是一項(xiàng)技術(shù)性工作,但同時(shí)也涉及經(jīng)濟(jì)學(xué)和人類心理學(xué)的一些重要因素。

  在理想情況下,我們會(huì)測(cè)試程序的所有可能執(zhí)行情況,而在大多數(shù)情況下,這幾乎是不可能的。即使一個(gè)看起來(lái)非常簡(jiǎn)單的程序,其可能的輸入與輸出組合可達(dá)到數(shù)百種甚至數(shù)千種,對(duì)所有的可能情況都設(shè)計(jì)測(cè)試用例是不切合實(shí)際的。對(duì)一個(gè)復(fù)雜的應(yīng)用程序進(jìn)行完全的測(cè)試,將耗費(fèi)大量的時(shí)間和人力資源,這樣在經(jīng)濟(jì)上是不可行的。

  另外,要成功地測(cè)試一個(gè)軟件應(yīng)用程序,測(cè)試人員也需要有正確的態(tài)度(也許用“愿景”(vision)這個(gè)詞會(huì)更好一些)。在某些情況下,測(cè)試人員的態(tài)度可能比實(shí)際的測(cè)試過(guò)程本身還要重要。因此,在深入探討軟件測(cè)試的本質(zhì)之前(指技術(shù)層面),我們先探討一下軟件測(cè)試的心理學(xué)問(wèn)題。

  測(cè)試執(zhí)行得差,其中一個(gè)主要原因在于大多數(shù)的程序員一開(kāi)始把“測(cè)試”這個(gè)術(shù)語(yǔ)的定義搞錯(cuò)了。

  他們可能會(huì)認(rèn)為:

  “軟件測(cè)試是證明軟件不存在錯(cuò)誤的過(guò)程。”

  “軟件測(cè)試的目的在于證明軟件能夠正確完成其預(yù)定的功能。”

  “軟件測(cè)試是建立一個(gè)‘軟件做了其應(yīng)該做的’信心的過(guò)程。”

  這些定義都是本末倒置的。

  每當(dāng)測(cè)試一個(gè)程序時(shí),應(yīng)當(dāng)想到要為程序增加一些價(jià)值。通過(guò)測(cè)試來(lái)增加程序的價(jià)值,是指測(cè)試提高了程序的可靠性或質(zhì)量。提高了程序的可靠性,是指找出并終修改了程序的錯(cuò)誤。

  因此,不要只是為了證明程序能夠正確運(yùn)行而去測(cè)試程序;相反,應(yīng)該一開(kāi)始假設(shè)程序中隱藏著錯(cuò)誤(這種假設(shè)對(duì)于幾乎所有的程序都成立),然后測(cè)試程序,發(fā)現(xiàn)盡可能多的錯(cuò)誤。

  那么,對(duì)于測(cè)試,更為合適的定義應(yīng)該是:“測(cè)試是為發(fā)現(xiàn)錯(cuò)誤而執(zhí)行程序的過(guò)程”。

  雖然這看起來(lái)像是個(gè)微妙的文字游戲,但確實(shí)有重要的區(qū)別。理解軟件測(cè)試的真正定義,會(huì)對(duì)成功地進(jìn)行軟件測(cè)試有很大的影響。

  人類行為總是傾向于具有高度目標(biāo)性,確立一個(gè)正確的目標(biāo)有著重要的心理學(xué)影響。如果我們的目的是證明程序中不存在錯(cuò)誤,那會(huì)在潛意識(shí)中傾向于實(shí)現(xiàn)這個(gè)目標(biāo);也是說(shuō),我們會(huì)傾向于選擇可能較少導(dǎo)致程序失效的測(cè)試數(shù)據(jù)。另一方面,如果我們的目標(biāo)在于證明程序中存在錯(cuò)誤,我們?cè)O(shè)計(jì)的測(cè)試數(shù)據(jù)有可能更多地發(fā)現(xiàn)問(wèn)題。與前一種方法相比,后一種方法會(huì)更多地增加程序的價(jià)值。

  這種對(duì)軟件測(cè)試的定義,包含著無(wú)窮的內(nèi)蘊(yùn),其中的很多都蘊(yùn)涵在本書(shū)各處。舉例來(lái)說(shuō),它暗示了軟件測(cè)試是一個(gè)破壞性的過(guò)程,甚至是一個(gè)“施虐”的過(guò)程,這說(shuō)明為什么大多數(shù)人都覺(jué)得它困難。這種定義可能是違反我們?cè)竿模凰业氖牵覀兇蠖鄶?shù)人總是對(duì)生活充滿建設(shè)性而不是破壞性的愿景。大多數(shù)人都本能地傾向于創(chuàng)造事物,而不是將事物破壞。這個(gè)定義還暗示了對(duì)于一個(gè)特定的程序,應(yīng)該如何設(shè)計(jì)測(cè)試用例(測(cè)試數(shù)據(jù))、哪些人應(yīng)該而哪些人又不應(yīng)該執(zhí)行測(cè)試。

  為增進(jìn)對(duì)軟件測(cè)試正確定義的理解,另一條途徑是分析一下對(duì)“成功的”和“不成功的”這兩個(gè)詞的使用。當(dāng)項(xiàng)目經(jīng)理在歸納測(cè)試用例的結(jié)果時(shí),尤其會(huì)用到這兩個(gè)詞。大多數(shù)的項(xiàng)目經(jīng)理將沒(méi)發(fā)現(xiàn)錯(cuò)誤的測(cè)試用例稱為一次“成功的測(cè)試”,而將發(fā)現(xiàn)了某個(gè)新錯(cuò)誤的測(cè)試稱為“不成功的測(cè)試”。

  這又是一次本末倒置。“不成功的”表示事情不遂人意或令人失望。我們認(rèn)為,如果在測(cè)試某段程序時(shí)發(fā)現(xiàn)了錯(cuò)誤,而且這些錯(cuò)誤是可以修復(fù)的,將這次合理設(shè)計(jì)并得到有效執(zhí)行的測(cè)試稱做是“成功的”。如果本次測(cè)試可以終確定再無(wú)其他可查出的錯(cuò)誤,同樣也被稱做是“成功的”。所謂“不成功的”測(cè)試,僅指未能適當(dāng)?shù)貙?duì)程序進(jìn)行檢查,在大多數(shù)情況下,未能找出錯(cuò)誤的測(cè)試被認(rèn)為是“不成功的”,這是因?yàn)檎J(rèn)為軟件中不包含錯(cuò)誤的觀點(diǎn)基本上是不切實(shí)際的。

  能發(fā)現(xiàn)新錯(cuò)誤的測(cè)試用例不太可能被認(rèn)為是“不成功的”,也是說(shuō),能發(fā)現(xiàn)錯(cuò)誤證明它是值得設(shè)計(jì)的。“不成功的”測(cè)試用例,會(huì)看到程序輸出正確的結(jié)果而沒(méi)發(fā)現(xiàn)任何錯(cuò)誤。

  我們可以類比一下病人看醫(yī)生的情況,病人因?yàn)樯眢w不舒服而去看醫(yī)生。如果醫(yī)生對(duì)病人進(jìn)行了一些檢查和化驗(yàn),卻沒(méi)有診斷出任何病因,我們不會(huì)認(rèn)為這些檢查和化驗(yàn)是“成功的”,因?yàn)椴∪酥Ц读税嘿F的檢查和化驗(yàn)費(fèi)用,而病狀卻依然如故。病人會(huì)因此而質(zhì)疑醫(yī)生的診斷能力。但是,如果醫(yī)生診斷出病人是胃潰瘍,那么這次檢測(cè)是“成功的”,醫(yī)生可以開(kāi)始進(jìn)行相應(yīng)的治療。因此,醫(yī)療行業(yè)會(huì)使用“成功的”或“不成功的”來(lái)表達(dá)診斷結(jié)果。我們當(dāng)然可以類推到軟件測(cè)試中來(lái),當(dāng)我們開(kāi)始測(cè)試某個(gè)程序時(shí),它好似我們的病人。

  “軟件測(cè)試是證明軟件不存在錯(cuò)誤的過(guò)程”,這個(gè)定義會(huì)帶來(lái)第二個(gè)問(wèn)題。對(duì)于幾乎所有的程序而言,甚至是非常小的程序,這個(gè)目標(biāo)實(shí)際上也是無(wú)法達(dá)到的。

  另外,心理學(xué)研究表明,當(dāng)人們開(kāi)始一項(xiàng)工作時(shí),如果已經(jīng)知道它是不可行的或無(wú)法實(shí)現(xiàn)時(shí),人的表現(xiàn)會(huì)相當(dāng)糟糕。舉例來(lái)說(shuō),如果要求人們?cè)?5分鐘之內(nèi)完成星期日《紐約時(shí)報(bào)》里的縱橫填字游戲,那么我們會(huì)觀察到10分鐘之后的進(jìn)展非常小,因?yàn)榇蠖鄶?shù)人都會(huì)卻步于這個(gè)現(xiàn)實(shí),即這個(gè)任務(wù)似乎是不可能完成的。但是如果要求在四個(gè)小時(shí)之內(nèi)完成填字游戲,我們很可能有理由期望在初10分鐘之內(nèi)的進(jìn)展會(huì)比前一種情況下的大。將軟件測(cè)試定義為發(fā)現(xiàn)程序錯(cuò)誤的過(guò)程,使得測(cè)試是個(gè)可以完成的任務(wù),從而克服了這個(gè)心理障礙。

  諸如“軟件測(cè)試是證明‘軟件做了其應(yīng)該做的’的過(guò)程”此類的定義所帶來(lái)的第三個(gè)問(wèn)題是,程序即使能夠完成預(yù)定的功能,也仍然可能隱藏錯(cuò)誤。也是說(shuō),當(dāng)程序沒(méi)有實(shí)現(xiàn)預(yù)期功能時(shí),錯(cuò)誤是清晰地顯現(xiàn)出來(lái)的;如果程序做了其不應(yīng)該做的,這同樣是一個(gè)錯(cuò)誤。如果我們將軟件測(cè)試視作發(fā)現(xiàn)錯(cuò)誤的過(guò)程,而不是將其視為證明“軟件做了其應(yīng)該做的”的過(guò)程,我們發(fā)現(xiàn)后一類錯(cuò)誤的可能性會(huì)大很多。

  總結(jié)一下,軟件測(cè)試更適宜被視為試圖發(fā)現(xiàn)程序中錯(cuò)誤(假設(shè)其存在)的破壞性的過(guò)程。一個(gè)成功的測(cè)試用例,通過(guò)誘發(fā)程序發(fā)生錯(cuò)誤,可以在這個(gè)方向上促進(jìn)軟件質(zhì)量的改進(jìn)。當(dāng)然,終我們還是要通過(guò)軟件測(cè)試來(lái)建立某種程度的信心:軟件做了其應(yīng)該做的,未做其不應(yīng)該做的。但是通過(guò)對(duì)錯(cuò)誤的不斷研究是實(shí)現(xiàn)這個(gè)目的的佳途徑。

  有人可能會(huì)聲稱“本人的程序完美無(wú)缺”(不存在錯(cuò)誤),針對(duì)這種情況建立起信心的好辦法是盡量反駁他,即努力發(fā)現(xiàn)不完美之處,而不只是確認(rèn)程序在某些輸入情況下能夠正確地工作。