“什么情況侥猩?我沒(méi)看錯(cuò)吧榔至?查詢也能失敗欺劳?”例行檢查夜間自動(dòng)化批跑結(jié)果時(shí)唧取,突然看到一個(gè)意想不到的失敗記錄,我放下了端到嘴邊的水杯划提,一臉懵逼枫弟。
“怎么了?出什么問(wèn)題了嗎鹏往?”坐我旁邊工位的小伙子轉(zhuǎn)了下椅子淡诗,伸了下頭瞄了下我的電腦屏幕。
“沒(méi)事伊履,看到了個(gè)比較奇怪的記錄韩容。”說(shuō)它奇怪唐瀑,是因?yàn)槭〉倪@條用例在我看來(lái)不應(yīng)該失敗群凶,至少不應(yīng)該是在現(xiàn)在版本已經(jīng)穩(wěn)定沒(méi)什么代碼改動(dòng)的情況下突然失敗。
小伙子也看到了我打開(kāi)的這條失敗記錄哄辣,“哦请梢,我之前也看到過(guò)這個(gè),單獨(dú)執(zhí)行這條用例的時(shí)候沒(méi)有失敗過(guò)力穗,我反復(fù)執(zhí)行很多次都成功了毅弧,所以沒(méi)怎么在意〉贝埃”
但直覺(jué)告訴我形真,這里肯定有問(wèn)題!
首先超全,夜間批跑的測(cè)試套中有幾千條用例咆霜,失敗的用例只有十幾條,成功率已達(dá)到99%嘶朱,基本可以斷定非環(huán)境問(wèn)題蛾坯,不然成功率不可能這么高。
其次疏遏,這是一條查詢接口的用例脉课,根據(jù)接口傳的訂單號(hào)查詢交易訂單和這筆交易關(guān)聯(lián)的支付訂單信息救军。構(gòu)造數(shù)據(jù)和調(diào)用接口的腳本不復(fù)雜,腳本的穩(wěn)定性不存在問(wèn)題倘零。
再次唱遭,小伙子也說(shuō)之前也看到過(guò)這條用例失敗,那說(shuō)明失敗的概率不低呈驶;
偶現(xiàn)問(wèn)題拷泽?
哈哈,這可少見(jiàn)袖瞻!我的興趣瞬間上來(lái)了司致。
我開(kāi)始看這條失敗記錄的詳細(xì)情況,發(fā)現(xiàn)了更有意思的事聋迎!
在這條用例的失敗記錄中脂矫,日志顯示接口調(diào)用是成功的,但是接口響應(yīng)的檢查點(diǎn)檢查失敗霉晕。當(dāng)前這筆交易訂單是關(guān)聯(lián)有兩筆支付訂單的庭再,但是接口只返回了一筆支付訂單。
接下來(lái)我根據(jù)接口傳的訂單號(hào)直接查了下數(shù)據(jù)庫(kù)牺堰,發(fā)現(xiàn)數(shù)據(jù)庫(kù)中的數(shù)據(jù)沒(méi)有問(wèn)題拄轻,直接寫sql確實(shí)能關(guān)聯(lián)查詢出兩條支付訂單;
測(cè)試腳本沒(méi)問(wèn)題萌焰,數(shù)據(jù)也沒(méi)問(wèn)題哺眯,有意思谷浅!我離揪出這個(gè)BUG越來(lái)越近了扒俯!
快速進(jìn)入服務(wù)器后臺(tái),找到夜間這條失敗記錄的接口日志以及DEBUG級(jí)別的運(yùn)行日志一疯。終于讓我發(fā)現(xiàn)了一點(diǎn)端倪撼玄!接口日志無(wú)報(bào)錯(cuò),唯一的異常就是本該返回兩筆支付訂單接口只返回了一筆支付訂單墩邀;DEBUG日志也沒(méi)有報(bào)錯(cuò)掌猛,但是在執(zhí)行的sql中查詢支付訂單表的時(shí)候只傳了一個(gè)支付訂單號(hào)!
我同時(shí)查了下這條用例執(zhí)行成功時(shí)候的debug日志眉睹,發(fā)現(xiàn)每次sql上都是傳兩個(gè)支付訂單號(hào)荔茬。
問(wèn)題應(yīng)該就出現(xiàn)在這里了!
但奇怪的是為什么會(huì)出現(xiàn)有時(shí)候傳兩個(gè)訂單號(hào)有時(shí)候傳一個(gè)訂單號(hào)的情況呢竹海?
看日志是得不到更多的信息了慕蔚,我試著再去看看這條用例的所有執(zhí)行記錄,發(fā)現(xiàn)這個(gè)用例執(zhí)行了上千次斋配,失敗的情況只有幾次孔飒。
等等灌闺!貌似發(fā)現(xiàn)規(guī)律了!
失敗的幾次執(zhí)行時(shí)間有夜間0點(diǎn)多坏瞄、早上9點(diǎn)多桂对,而成功的全部都在上午10點(diǎn)至夜間12點(diǎn)之間!
跟時(shí)間有關(guān)系嗎鸠匀?
邊思索邊點(diǎn)了幾次執(zhí)行按鈕蕉斜,無(wú)一例外,這條用例每次都執(zhí)行成功了狮崩。時(shí)間蛛勉!時(shí)間!時(shí)間……知道了睦柴!訂單號(hào)里的時(shí)間诽凌!
測(cè)試腳本是按照規(guī)范生成訂單號(hào)的,而訂單號(hào)中有一部分是取得訂單創(chuàng)建時(shí)間√沟校現(xiàn)在是上午十點(diǎn)多侣诵,時(shí)分秒的小時(shí)位是10,現(xiàn)在只需要驗(yàn)證下這個(gè)小時(shí)位改成09之類的就知道了狱窘。
在生成訂單號(hào)的腳本里找到時(shí)間位置對(duì)應(yīng)的片段杜顺,將獲取當(dāng)前時(shí)間改成固定值09開(kāi)頭的時(shí)間,重跑蘸炸,果然失敗了躬络!改成00,還是失敶钊濉穷当!01,失斞秃獭馁菜!
終于讓我揪住了!
我再看了下另外一條用例铃岔,一筆交易訂單至關(guān)聯(lián)一筆支付訂單的汪疮,發(fā)現(xiàn)沒(méi)有失敗記錄,改了訂單號(hào)中的時(shí)間也不影響結(jié)果毁习≈侨拢看來(lái)只有組合支付訂單有這個(gè)問(wèn)題!
“喂纺且,盏道,這個(gè)查詢接口有個(gè)小BUG要跟你溝通下。在0-10點(diǎn)創(chuàng)建的組合支付單隆檀,查詢的時(shí)候會(huì)少返回一筆支付單摇天〈馀龋”快速找到對(duì)應(yīng)模塊的開(kāi)發(fā),我迫不及待的要跟他溝通這個(gè)問(wèn)題了泉坐。
“這不可能为鳄!這軟件都運(yùn)行這么久了,也沒(méi)人說(shuō)有啥問(wèn)題巴笕谩孤钦?我今天還用過(guò),也沒(méi)問(wèn)題纯丸∑危”還沒(méi)說(shuō)完,開(kāi)發(fā)堅(jiān)決不信觉鼻。
哼哼俊扭,由不得你不信!
“來(lái)來(lái)來(lái)坠陈,我共享我的桌面給你看下萨惑。”我要開(kāi)始表演了仇矾。
“首先庸蔼,我們來(lái)看下數(shù)據(jù),”我執(zhí)行了sql贮匕,并展示了執(zhí)行結(jié)果姐仅,“你看,數(shù)據(jù)庫(kù)里現(xiàn)在是不是有一筆交易訂單刻盐,并且關(guān)聯(lián)了兩筆支付訂單掏膏?”
“嗯,數(shù)據(jù)沒(méi)問(wèn)題隙疚∪雷罚”開(kāi)發(fā)沒(méi)意見(jiàn)磕道。
“那我們來(lái)看接口響應(yīng)供屉,”我調(diào)了查詢接口,“你看溺蕉,接口響應(yīng)中少了一筆支付訂單伶丐。”
“嗯疯特?”開(kāi)發(fā)詫異了哗魂。
“另外我發(fā)現(xiàn)規(guī)律,訂單號(hào)第位如果是0漓雅,并且一筆交易訂單關(guān)聯(lián)多筆支付訂單的時(shí)候就會(huì)出現(xiàn)這個(gè)問(wèn)題录别。簡(jiǎn)而言之朽色,用戶在0-10點(diǎn)創(chuàng)建的交易訂單,如果還參加了營(yíng)銷活動(dòng)進(jìn)行組合支付的話就會(huì)出現(xiàn)這個(gè)問(wèn)題组题『校”
“這么奇怪?”開(kāi)發(fā)也疑惑了崔列。
“看看代碼梢褐?”我提議道。
“好赵讯,共享我桌面吧盈咳!”開(kāi)發(fā)同意了”咭恚“查詢接口鱼响,找到了!看组底,這里進(jìn)行訂單號(hào)校驗(yàn)热押,然后根據(jù)訂單號(hào)里的這幾位計(jì)算分庫(kù),再根據(jù)訂單號(hào)這幾位判斷查哪張表斤寇,接口傳的是交易訂單號(hào)桶癣,先拿這個(gè)訂單查交易表,再查支付表……”
“等等娘锁,這一段是干啥的牙寞?”我們同時(shí)注意到了幾行代碼。
“哦莫秆,根據(jù)訂單后第位判斷訂單是否是組合支付间雀。這誰(shuí)寫的代碼?這里不是時(shí)間的小時(shí)位嗎镊屎?怎么能拿來(lái)判斷是否組合支付惹挟?”開(kāi)發(fā)抓狂了。
他開(kāi)始翻找修改記錄缝驳,發(fā)現(xiàn)這是一個(gè)離職的員工很久之前寫的连锯,而這段時(shí)間訂單號(hào)規(guī)則發(fā)生了很大變化,在早期版本時(shí)用狱,訂單號(hào)第*位是用來(lái)標(biāo)識(shí)支付單的筆數(shù)的运怖,而新版訂單號(hào)已經(jīng)沒(méi)有這個(gè)標(biāo)志位了。
“我已經(jīng)給你提單了哈夏伊,單號(hào)發(fā)你了摇展,我一會(huì)兒讓測(cè)試經(jīng)理走單∧缬牵”
“啥咏连?好吧盯孙,我改!是提的提示單吧祟滴?”
“你猜镀梭!”
親愛(ài)的測(cè)試同行,如果是你踱启,這個(gè)問(wèn)題單的嚴(yán)重程度你會(huì)設(shè)置什么級(jí)別呢报账?
這次BUG發(fā)現(xiàn)的時(shí)間其實(shí)比較晚了,離版本上限不到一周埠偿,不過(guò)在這個(gè)BUG分析定位的過(guò)程中也發(fā)現(xiàn)了測(cè)試活動(dòng)中不少改進(jìn)點(diǎn)透罢。
一、自動(dòng)化測(cè)試要盡可能參數(shù)化冠蒋。數(shù)據(jù)不能寫死羽圃,在這個(gè)案例當(dāng)中如果訂單號(hào)寫死,那么這個(gè)問(wèn)題被發(fā)現(xiàn)的概率為0抖剿;
二朽寞、參數(shù)值要盡可能分散。這條用例盡管已經(jīng)參數(shù)化了斩郎,但是因?yàn)闇y(cè)試套夜間執(zhí)行的時(shí)間設(shè)置在了晚上10點(diǎn)脑融,這條用例大多數(shù)時(shí)候在0點(diǎn)之前已經(jīng)執(zhí)行完了,白天測(cè)試人員手工執(zhí)行的時(shí)候也都是在10點(diǎn)左右開(kāi)始缩宜,導(dǎo)致這個(gè)問(wèn)題長(zhǎng)時(shí)間沒(méi)被發(fā)現(xiàn)肘迎;
三意系、偶現(xiàn)的問(wèn)題大多數(shù)時(shí)候只是因?yàn)闆](méi)有找到規(guī)律认然,耐心分析,實(shí)在不行找開(kāi)發(fā)一起分析呻纹,你會(huì)發(fā)現(xiàn)大多數(shù)偶現(xiàn)的問(wèn)題在滿足條件后都是必現(xiàn)的宋梧。
每天一個(gè)BUG
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)超凳,“玉大人愈污,你說(shuō)我怎么就攤上這事耀态。” “怎么了暂雹?”我有些...
- 文/不壞的土叔 我叫張陵首装,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我杭跪,道長(zhǎng)仙逻,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任涧尿,我火速辦了婚禮系奉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姑廉。我一直安慰自己缺亮,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開(kāi)白布桥言。 她就那樣靜靜地躺著萌踱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪号阿。 梳的紋絲不亂的頭發(fā)上并鸵,一...
- 那天,我揣著相機(jī)與錄音扔涧,去河邊找鬼能真。 笑死,一個(gè)胖子當(dāng)著我的面吹牛扰柠,可吹牛的內(nèi)容都是我干的粉铐。 我是一名探鬼主播,決...
- 文/蒼蘭香墨 我猛地睜開(kāi)眼卤档,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蝙泼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起劝枣,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤汤踏,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后舔腾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體溪胶,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年稳诚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哗脖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
- 正文 年R本政府宣布棘劣,位于F島的核電站,受9級(jí)特大地震影響楞遏,放射性物質(zhì)發(fā)生泄漏茬暇。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一寡喝、第九天 我趴在偏房一處隱蔽的房頂上張望而钞。 院中可真熱鬧,春花似錦拘荡、人聲如沸臼节。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)网缝。三九已至,卻和暖如春蟋定,著一層夾襖步出監(jiān)牢的瞬間粉臊,已是汗流浹背。 一陣腳步聲響...
- 正文 我出身青樓抄淑,卻偏偏與公主長(zhǎng)得像屠凶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肆资,可洞房花燭夜當(dāng)晚...