一枚小Bug的獨(dú)白(挺有意思的~)
我是一枚潛藏在數(shù)據(jù)庫(kù)引擎深處的Bug,躲在一個(gè)黑暗的角落很久了,歷經(jīng)多個(gè)版本、N輪回歸測(cè)試的風(fēng)雨洗禮,我存在,我驕傲。還記得那天,我懷著激動(dòng)而忐忑的心情等待一位QA新人把我發(fā)布出去……
產(chǎn)品發(fā)布在即,一位頗有經(jīng)驗(yàn)的QA在無(wú)意間寫(xiě)了一條短小精悍的用例讓QA新人來(lái)執(zhí)行一遍,就是這條不起眼的用例,使我原形畢露。這個(gè)用例看起來(lái)很簡(jiǎn)單:就是向數(shù)據(jù)庫(kù)里插入一條null記錄(還記得我們的Mr Null嗎?),一條字符串記錄;再一條null記錄,一條同樣的字符串記錄……如此反復(fù),來(lái)個(gè)5000次,然后啟用創(chuàng)建數(shù)據(jù)字典的功能,將這若干條看似規(guī)律的記錄進(jìn)行壓縮。好歹咱也算經(jīng)歷過(guò)風(fēng)風(fēng)雨雨的,每天的持續(xù)回歸測(cè)試也沒(méi)有拿我怎么樣,可就在執(zhí)行這條小用例時(shí),神奇的事情發(fā)生了------數(shù)據(jù)庫(kù)發(fā)生了崩潰。
原因分析:
這個(gè)難題先后困擾過(guò)好幾個(gè)人,直到一位研究“炸彈”的開(kāi)發(fā)GG,他對(duì)我進(jìn)行了好好的剖析,終于發(fā)現(xiàn)了問(wèn)題的緣由。具體要從數(shù)據(jù)庫(kù)引擎的壓縮機(jī)制開(kāi)始講起:
● 記錄壓縮:是基于數(shù)據(jù)字典的壓縮。所謂數(shù)據(jù)字典,就是數(shù)據(jù)庫(kù)表所有記錄中出現(xiàn)頻率最大的字符串集合。壓縮時(shí),將記錄中與數(shù)據(jù)字典相同的字符串進(jìn)行替換,替換為數(shù)據(jù)字典的下標(biāo)。由于數(shù)據(jù)字典的下標(biāo)一定會(huì)遠(yuǎn)遠(yuǎn)小于字典所代表的字符串,因此就達(dá)到了記錄壓縮的效果。
● 實(shí)現(xiàn)流程:該引擎的數(shù)據(jù)字典在采集時(shí),是將所有的記錄拼成一條長(zhǎng)長(zhǎng)的字符串流,然后從字符串流中采集出現(xiàn)頻率最高的子串,作為數(shù)據(jù)字典,而拼接記錄時(shí)并未在記錄間添加分隔符。這種一行null記錄、一行字符串記錄的方式,會(huì)使數(shù)據(jù)庫(kù)引擎采集的數(shù)據(jù)字典的長(zhǎng)度超過(guò)記錄的最大長(zhǎng)度,導(dǎo)致系統(tǒng)內(nèi)部驗(yàn)證報(bào)錯(cuò)。
解決辦法:
知道了問(wèn)題的本質(zhì),解決起來(lái)就很方便了,在將記錄拼接為長(zhǎng)字符串流時(shí),在每個(gè)記錄的拼接處添加分隔符。不能跨越分隔符采集數(shù)據(jù)字典,從而保證了數(shù)據(jù)字典的長(zhǎng)度一定小于等于記錄的長(zhǎng)度限制,問(wèn)題解決!
經(jīng)驗(yàn)總結(jié):
● 注意邊界問(wèn)題。問(wèn)題往往出現(xiàn)在邊界情況下,比如最大值/最小值/0值。如果在代碼中加入一些邊界斷言,可以幫助提早發(fā)現(xiàn)問(wèn)題。
● 注意“null”的使用。不論開(kāi)發(fā)還是測(cè)試,注意“null”的使用都可以幫助我們少犯一些錯(cuò)誤,或者多發(fā)現(xiàn)一些問(wèn)題。
● “殺蟲(chóng)劑困境”的思考。再?lài)?yán)密的單一性測(cè)試也不可能發(fā)現(xiàn)100%的Bug。將不同的測(cè)試思路和方法相結(jié)合,采用探索式的測(cè)試思維或許能幫助發(fā)現(xiàn)更多潛在問(wèn)題。
說(shuō)了這么多,我得閉嘴了,不低調(diào)的Bug是不厚道的,最后把一句很喜歡的佛語(yǔ)送給大家:“你見(jiàn),或者不見(jiàn)我,我就在那里”,但是我們始終敵不過(guò)開(kāi)發(fā)和測(cè)試的協(xié)同努力。
posted on 2013-04-03 09:57 順其自然EVO 閱讀(179) 評(píng)論(0) 編輯 收藏 所屬分類(lèi): 測(cè)試學(xué)習(xí)專(zhuān)欄