軟件測(cè)試:如何捕捉無(wú)規(guī)律的異常

字號(hào):

階段:項(xiàng)目進(jìn)入到第8個(gè)月了,還有1周用來(lái)清理后續(xù),就宣告結(jié)束這場(chǎng)勝仗了。
    投靠陣營(yíng):軟件測(cè)試組;
    內(nèi)部對(duì)立陣營(yíng):軟件開(kāi)發(fā)組;
    外部對(duì)立陣營(yíng):客戶(hù)。
    場(chǎng)景:就在完成了大量重復(fù)操作和回歸測(cè)試之后,以為勝利在望的時(shí)候,突然發(fā)現(xiàn)程序有不穩(wěn)定現(xiàn)象。征兆為“退出程序時(shí)的內(nèi)存異?!薄S行┦褂脮r(shí)間長(zhǎng)久的WINDOWS操作系統(tǒng),莫名奇妙就會(huì)出現(xiàn)這個(gè)懊惱提示。這猶如吃米飯吃到最后一口時(shí),發(fā)現(xiàn)里面有石子兒那般破壞快感。由于項(xiàng)目對(duì)于程序穩(wěn)定性沒(méi)有特殊要求,2個(gè)舊版本中的不穩(wěn)定概率很低,導(dǎo)致這次的意外沒(méi)有被提早發(fā)現(xiàn)。無(wú)論如何,作為測(cè)試人員,既然“吃石子兒”的好運(yùn)降臨在我的頭上,就不能辜負(fù)這次機(jī)會(huì)。
    作戰(zhàn)方案:的確,采取純粹的黑盒測(cè)試方法,很難捕捉問(wèn)題的源頭。因此這樣的硬骨頭是很有挑戰(zhàn)意義的。還是這樣,按照換位思考的方法來(lái)綜合出一個(gè)最合適的解決方案,而非秀的解決方法。從客戶(hù)角度來(lái)思考,在不影響功能的狀態(tài)下,不要出現(xiàn)這個(gè)嚇唬人的框框就行了;從開(kāi)發(fā)人員的角度思考,在項(xiàng)目末期出現(xiàn)這個(gè)故障,是比較頭大的,如果不影響主要功能的穩(wěn)定,想辦法讓框框消失就可以了,盡量不要大興土木重新來(lái)過(guò);因此,作為測(cè)試人員,找到問(wèn)題的大致方向,給開(kāi)發(fā)人員提供思路,即可。不必刨根問(wèn)底顯示你的“艱苦奮斗”而影響全隊(duì)的作戰(zhàn)士氣。
    第一階段:沒(méi)有規(guī)律,沒(méi)有重現(xiàn)方法。
    首先我們知道,這個(gè)內(nèi)存錯(cuò)誤提示框,是WINDOWS為了保護(hù)硬件而組織程序駐留在非法內(nèi)存中拋出的。因此,在這個(gè)階段,想要開(kāi)發(fā)人員簡(jiǎn)單的屏蔽這個(gè)框框是不現(xiàn)實(shí)的,也是不負(fù)責(zé)任的。你肚子痛,醫(yī)生叫你隨便吃藥,也不告訴你吃的什么藥,反正你付錢(qián)拿藥就行。那還有沒(méi)有天理呢,呵呵。——不過(guò)這個(gè)階段情緒挺差,組合了很多測(cè)試用例和方法,依然沒(méi)有找到任何規(guī)律,也不能確定如何才能重現(xiàn)。有至少2天,處于這種狀態(tài)。
    第二階段:沒(méi)有規(guī)律的重現(xiàn)。
    被動(dòng)防御了2天,戰(zhàn)局沒(méi)有進(jìn)展,開(kāi)發(fā)人員卻給了一個(gè)新的版本。在這個(gè)版本中關(guān)于這個(gè)程序異常,可以說(shuō)沒(méi)有任何實(shí)質(zhì)性的進(jìn)展。不過(guò)似乎在夾縫中有了轉(zhuǎn)機(jī),這個(gè)版本中加強(qiáng)了對(duì)最新功能模塊的修改,使得使用并關(guān)閉程序之后,WINDOWS報(bào)錯(cuò)的概率大幅度提高。這樣一來(lái),有了2條模糊的思路:1,是否和新功能修改有關(guān);2,是否有內(nèi)存泄漏。即使如此,出錯(cuò)的規(guī)律依舊沒(méi)有找到。就這樣,每天打開(kāi)內(nèi)存監(jiān)視工具,嘗試尋找規(guī)律??赡茚t(yī)學(xué)上的臨床觀測(cè),也是類(lèi)似如此吧,哈哈。
    第三階段:尋找資料,逐步溝通。
    在網(wǎng)絡(luò)上搜索內(nèi)存泄漏的技術(shù)資料,并再次熟悉程序架構(gòu):C++編程,新功能中外掛了一個(gè)DELPHI開(kāi)發(fā)的DLL。在這兩種語(yǔ)言編寫(xiě)出來(lái)的程序中,前者對(duì)于指針的把握問(wèn)題很普遍,而后者對(duì)于程序關(guān)閉時(shí)的內(nèi)存回收機(jī)制也同樣具有很多先例性問(wèn)題。有了這些資料作為后盾,我對(duì)于內(nèi)存泄漏的猜測(cè)有了更足夠的信心。跑去和開(kāi)發(fā)人員溝通,次日便得到回復(fù):代碼中存在部分導(dǎo)致內(nèi)存泄漏的錯(cuò)誤。逐一修改,得到了新版本的程序再測(cè)試。臨床檢驗(yàn)有了初步診斷,但是仍舊沒(méi)有擺脫危險(xiǎn)。
    第四階段:水落石出。
    某一天早晨,開(kāi)發(fā)人員主動(dòng)過(guò)來(lái)告之,該新模塊中調(diào)用的DLL存在關(guān)閉程序時(shí)回收機(jī)制的問(wèn)題。(不搜不知道,網(wǎng)絡(luò)上一搜索,資料一大堆)在察看了程序代碼之后,可以輕而易舉地找到出錯(cuò)規(guī)律,并能每次重現(xiàn)。開(kāi)發(fā)人員友好地提供了重現(xiàn)方法,為了新版本的測(cè)試而提供方案。這樣,我們從第一階段的毫無(wú)頭緒到現(xiàn)在的水落石出,終于把癥結(jié)給捕捉。石頭從嘴里吐出,漱漱口再吃一顆口香糖吧。