生活中有這么一種現象:如果你關注某些東西,它就會經常出現在你眼前,例如一個不出名的歌手的名字,一種動物的卡通形象,某個非常專業的術語,等等等等,這種現象也叫做“孕婦效應”,還有類似的一種效應叫做“視網膜效應”,它講的是:你有什么東西或者特質你就特別容易在別處發現你有的這類東西和特質,干了多年測驗的我就會經常發現日常使用的系統中有很多的bug,而我老婆就發現不了,今天要說的事兒是“重現難以重現的bug”,這件事兒在本周共遇見了4次:第一次是微博上有一篇《程式員,你除錯過的最難的 Bug 是?》(后面會附上);第二次是一個同事跟我抱怨,好幾個bug難以重現特心煩,并問我怎么處理比較好;第三次是本周上線的產品出現了一個當時難以重現的bug,我們對它做了初步的分析;第四次是翻看史亮寫的書《軟體測驗實戰》,偶爾翻了翻,竟然看到一小節在寫“處理難以處理的缺陷”,這時候,腦子里很多東西匯集到了一起,我想還是記錄一下吧,下面是正文:
也許測驗人員(尤其是對新手來說)在作業程序中最不愿遇到的一件事情就是:在測驗程序中發現了一個問題,覺得是bug,再試的時候又正常了,碰到這樣的事情,職業素養和測驗人員長期養成的死磕的習性會讓她們覺得不能放過這個bug,但是重現這樣的bug有時候需要花費大量的時間,有的時候還有一些盲目性(因為黑盒測驗的緣故,很多內部狀態是不可見的,因此無法獲取有效的資訊來做跟蹤),效率較為低下,在實際作業中,時間和進度擺在那里,在經歷了多次痛苦的失敗嘗試之后,測驗人員的處理方法一般會有如下幾種:1.向開發人員尋求幫助來重現bug;2.當做一個issue報給開發人員,可是這樣的做法存在如下問題:

1.開發人員責任心不夠強,不愿意花太多精力去求證這件事情,常見的回復就是:在我這兒沒事兒啊,我也重現不了,bug關了吧,結果隨后在生產系統上,bug又開始sui隨機出現了,
2.就跟測驗人員不擅長編碼和除錯一樣,開發人員并不擅長找出bug,經過一番嘗試以后,他們也找不出什么問題來,常見的回復同第一條是一樣的,bug上線后又出現的宿命也是一樣的,
這時候,真正的問題來了:如何捕捉難以重現的bug?這件事兒對于測驗人員來說就這么難么?
答案并不那么樂觀,重現“難以”重現的bug本來就是一件“難以”完成的事情,但“難以”并不是不可能,通過一系列的測驗、分析方法,我們是能夠抽絲剝繭把絕大部分隱藏的很深的bug揪出來的,當然有的時候你要考慮投入產出比,但投入產出比不是本篇要考慮的,本篇只講一些我積累的經驗,
為什么不能重現bug?
最大的原因就是:測驗人員對被測物的了解還不夠深入,
我曾經做過一段很長時間的收集和統計,那些被稱作過“難以重現”的bug最后都可以分為如下幾類:
1.環境的變更造成了bug難以重現,這里的環境包括了:基礎軟硬體環境(作業系統、網路、存盤、中間件、容器等等),被測物自身發生了某些變更,環境的變更一般是由于多人共用環境造成的,也有少量情況下是系統內部或者時間觸發的變更(這類bug非常難重現),
2.沒有找到真正引發bug的操作,這些操作往往是一些不怎么顯而易見的操作,測驗人員在不經意間完成,而又忽略了這一操作,以致難于重現bug,
3.沒有找到真正會引發bug的操作序列,很多bug的重現需要滿足多個條件,在滿足多個條件的狀態下,你做了對應的操作,bug才會被觸發,
4.bug必須使用特殊的資料才會出現,測驗人員沒有意識到她使用的資料的特殊性,一種比較難搞的情況是:同一組輸入,在不同情況下(不是不同的業務情況)輸入會被轉化成不同的資料,我曾經見到過這么個例子,程式員用系統當前時間作為亂數的種子來生成id,但是id設定的比較短,一個存盤的操作使用這個id,在一些情況下,發生了沖突,當時做功能測驗這種小概率事件耗費了測驗人員大量時間也沒有穩定重現,還是在性能測驗的階段測驗了出來,
5.測驗人員由于錯誤操作,出現了誤報(這很常見),比如,記得自己執行了step3,其實沒有,或者沒有正確執行step卻覺得正確執行了,
怎樣對付這樣的bug呢?
我喜歡James Bach 說的那句話:測驗就像CSI,CSI是Criminal Scene Investigation 的縮寫,也是我非常喜歡的美國系列劇,
從我來看CSI的精髓在于:仔細觀察,詳細記錄,科學分析,嚴密推理,有序求證,大膽假設,持續不懈,團隊協作和一點兒運氣,找bug其實和CSI探員做犯罪現場調查沒什么太大區別,得知道,你作業的重要性一點兒不亞于CSI探員,
仔細觀察:第一件事情就是要觀察,觀察你所做的一切操作和一切相關的系統反饋,在一開始,觀察的重要性要遠遠大于思考,通過觀察你獲得蛛絲馬跡,這些蛛絲馬跡是你進行思考和假設的關鍵輸入,例如,我在一次測驗的程序中,發現做某種操作的時候會相當慢,極少數情況下還報錯過一兩次,當詢問了開發人員后得知這個操作的后臺實作步驟是:先查看資料是否在快取中,如果不在,則從遠端服務器請求資料,我抓住少數情況下會報錯的這一現象,仔細觀察它的出錯資訊后猜測報錯并不是因為網路連接不穩定引起的,而是由于遠端服務介面實作有問題引起的,后來重新設計了測驗用例,果然找到了問題所在,如果不仔細觀察出錯資訊,就會聽信開發人員認為這是網路不穩定引發的正常issue而錯過這個bug,
如需了解更多測驗技術資訊請關注:深圳多測師軟體與技術服務有限公司
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/323908.html
標籤:其他
上一篇:如何將不同列的所有核心值放在一起
下一篇:十進制值被to_f截斷
