測(cè)試:快來看看,我發(fā)現(xiàn)bug了,這怎么回事?
  開發(fā):來了來了……哪里?
  測(cè)試:嗯?怎么沒了?
  開發(fā):下次看清楚點(diǎn)再說。
  ……片刻……
  測(cè)試:現(xiàn)在出現(xiàn)了,快來看看!
  開發(fā):好,馬上過去……哪?
  測(cè)試:怎么又沒了!
  開發(fā):……

  這種情況我以前遇到太多次了,寫過程序的人都有這個(gè)體會(huì),有些bug的出現(xiàn)機(jī)會(huì)是非常非常寶貴的,因?yàn)槌绦蜻\(yùn)行總是帶有很大的隨機(jī)性,也許這個(gè)bug在某個(gè)時(shí)間才會(huì)被觸發(fā),或者根本是低概率隨機(jī),特別是用C++寫的程序,這種問題尤其多,當(dāng)然隨著我經(jīng)驗(yàn)的不斷上升,我以前曾經(jīng)寫出過的bug,現(xiàn)在是越來越少了,我知道如何從代碼這個(gè)層面上避免出現(xiàn)這種問題,(這個(gè)不在本文討論之列)但即便如此,我也難保證到了測(cè)試人員手里一定不出現(xiàn)。反應(yīng)測(cè)試人員水平的還有一個(gè)重要指標(biāo):是重現(xiàn)bug的能力。水平高的測(cè)試人員能很好地記錄bug出現(xiàn)地條件,好像每次空難的時(shí)候,黑匣子總是能很好地幫助事后處理人員找出空難當(dāng)時(shí)的飛機(jī)運(yùn)行情況以及環(huán)境參數(shù),以此推測(cè),為什么會(huì)出事。如果真的是一個(gè)很難重現(xiàn)的bug,像前面說的,根本是低概率隨機(jī)的,那怎么辦?那想辦法把bug描述清楚,以截圖的形式記錄出錯(cuò)現(xiàn)象,用清晰簡(jiǎn)要的文字,描述清楚當(dāng)時(shí)的運(yùn)行情況,這是測(cè)試人員該做的事情,而不是bug“跑過去沒了”。有些問題確實(shí)很難發(fā)現(xiàn),甚至解決了都不知道其所以,我近寫了一個(gè)程序,這個(gè)程序會(huì)加載若干個(gè)模塊,從模塊中調(diào)出資源,將資源存入內(nèi)存中,按道理,這個(gè)時(shí)候我可以卸載模塊了,因?yàn)槲乙馁Y源已經(jīng)到位了,接下去我要使用這些資源,是把它們轉(zhuǎn)變?yōu)榱,再去調(diào)用別的接口,但出現(xiàn)問題了,在加載/卸載若干次之后,Allways出現(xiàn)一個(gè)錯(cuò)誤,通過調(diào)試,這個(gè)錯(cuò)誤發(fā)生在CreateWindow這個(gè)Windows API的內(nèi)部,如果從表面上看,這已經(jīng)是超出了我的能力范疇,但我知道,這僅僅是表面,其實(shí)質(zhì)一定是在調(diào)用到CreateWindow之前,出現(xiàn)了內(nèi)存越界之類的錯(cuò)誤,但我細(xì)心測(cè)試了我的程序,所有可能出錯(cuò)的地方都排除了,我的代碼既沒有越界,也沒有泄漏,但問題后還是解決了,很簡(jiǎn)單,是把卸載模塊這行代碼,挪到使用完內(nèi)存中的資源之后,沒再出現(xiàn)過這個(gè)問題,按照邏輯,我一直想不通為什么會(huì)這樣,我使用的資源是已經(jīng)調(diào)入我的程序動(dòng)態(tài)分配的內(nèi)存空間中了,應(yīng)該跟模塊沒有什么聯(lián)系了,可經(jīng)過大量的測(cè)試,發(fā)現(xiàn)這么改之后沒再出現(xiàn)過問題,我知道我還是沒法完全理解這個(gè)復(fù)雜的系統(tǒng),盡管我盡了大努力。測(cè)試人員也是這樣的,不能重現(xiàn)所有bug,但他們可以盡量去記錄bug發(fā)生的各種情況,對(duì)于修正bug的開發(fā)人員來說,當(dāng)然是越詳細(xì)的信息越好。

  “你相不相信我的測(cè)試結(jié)果?你的程序在所有使用華碩主板的機(jī)器上會(huì)死掉,其它的沒事!

  相信不?不相信?親眼看看后,我還真的相信了,但一直不知道原因,這個(gè)問題確實(shí)是我曾經(jīng)遇到過的問題,也是我遇到過的所有問題中怪的問題之一,這還真的被一個(gè)測(cè)試者“總結(jié)”了出來,對(duì)他來說,能總結(jié)出這個(gè)問題,非常不容易,為了驗(yàn)證是否的確如此,我還找了一臺(tái)華碩的筆記本電腦來測(cè)試,還真的如此!我也很想知道原因,可我現(xiàn)在還是不知道,而我離開那家公司很久了,我也許之后也永遠(yuǎn)不知道了,我說這個(gè)例子,目的是想告訴大家,有時(shí)候真的沒有什么“不可能”,所以請(qǐng)不要隨便懷疑測(cè)試人員總結(jié)出來的那些稀奇古怪的bug,表面上的一個(gè)bug,也許可以牽扯到非常深層次的問題。

  我也不知道再談點(diǎn)什么好,測(cè)試工具,測(cè)試流程,這些我想別的地方講得太多了,但,軟件業(yè)有一條黃金法則,那是“沒有銀彈”,再好的測(cè)試工具,再精密嚴(yán)謹(jǐn)?shù)牧鞒蹋K都是人在使用,人在執(zhí)行,沒有一種足夠強(qiáng)大的工具來完全替代開發(fā)人員的工作,對(duì)于測(cè)試人員來說,也是這樣的!除了對(duì)工具的引進(jìn),流程的改進(jìn),更應(yīng)該重視人員自身能力的提高,我想這也不光是軟件行業(yè)了。