日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
數(shù)據(jù)庫(kù)丨從MySQL數(shù)值隱式轉(zhuǎn)換成了double型的測(cè)試點(diǎn),值得學(xué)習(xí)

一、背景

在進(jìn)行某項(xiàng)系統(tǒng)測(cè)試時(shí),遇到選擇部分保單更新為加急狀態(tài)后,未選中的保單也同步更新成了加急狀態(tài)。

讓客戶(hù)滿(mǎn)意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、網(wǎng)站空間、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、海門(mén)網(wǎng)站維護(hù)、網(wǎng)站推廣。

經(jīng)過(guò)比對(duì)分析,發(fā)現(xiàn)是SQL查詢(xún)?cè)跀?shù)據(jù)庫(kù)設(shè)計(jì)為字符型的字段,SQL語(yǔ)句中用了數(shù)值型來(lái)查詢(xún)時(shí),查詢(xún)結(jié)果結(jié)果會(huì)多了末尾兩位不一致的值,如下圖,100320201000195806搜出100320201000195812等值:

百因必有果,通過(guò)度娘,首先了解到原來(lái)在MySQL中,當(dāng)操作符與不同類(lèi)型的操作數(shù)一起使用時(shí),會(huì)發(fā)生類(lèi)型轉(zhuǎn)換以使操作數(shù)兼容,即字符型字段與數(shù)值型值比較時(shí),會(huì)進(jìn)行隱式類(lèi)型轉(zhuǎn)換:都轉(zhuǎn)換為數(shù)值型。

即,數(shù)據(jù)庫(kù)字段值為字符型1234,查詢(xún)條件為數(shù)值1234的時(shí)候,數(shù)據(jù)庫(kù)字符型1234會(huì)轉(zhuǎn)換為數(shù)值型1234,能夠查詢(xún)到對(duì)應(yīng)值。

但為什么數(shù)值型100320201000195806除了搜索出100320201000195806還有100320201000195812這樣的字符型結(jié)果?

二、問(wèn)題根因

數(shù)值隱式轉(zhuǎn)換成了double型,考慮數(shù)值可能出現(xiàn)溢出。根據(jù)DOUBLE 類(lèi)型固定占用8個(gè)字節(jié)(64位),并且需要一位表示符號(hào),11位表示指數(shù),2的52次方-1:2^53 = 9007199254740992,當(dāng)輸入的數(shù)值大于9007199254740992時(shí),存在數(shù)值溢出 。

也就是當(dāng)數(shù)字超過(guò)16位以后,數(shù)據(jù)庫(kù)不會(huì)報(bào)錯(cuò),而是溢出后轉(zhuǎn)為最接近的值入庫(kù),如下圖:設(shè)置字段類(lèi)型為double型,9007199254740993入庫(kù)后顯示為9007199254740992。

并且如下圖測(cè)試,溢出入庫(kù)的數(shù)據(jù)轉(zhuǎn)化后有某種沒(méi)明顯規(guī)律的規(guī)則:

同理,取數(shù)據(jù)時(shí),大于9007199254740992的數(shù)值也會(huì)發(fā)生轉(zhuǎn)換,如下圖,9007199254740993可以檢索出9007199254740992的數(shù)值:

所以Bug產(chǎn)生過(guò)程為:18位數(shù)值類(lèi)型 為double類(lèi)型(1.003202010001958E+18),數(shù)據(jù)庫(kù)查詢(xún)時(shí)將business_no 變成(1.003202010001958E+18),數(shù)據(jù)庫(kù)存的business_no值也根據(jù)隱式類(lèi)型轉(zhuǎn)換原則也轉(zhuǎn)為了double類(lèi)型。最終,過(guò)濾末尾兩位的數(shù)值相等。

至此,對(duì)不同字符產(chǎn)生的隱式類(lèi)型轉(zhuǎn)換 和過(guò)程中轉(zhuǎn) double 型、數(shù)值溢出問(wèn)題都有了更新的認(rèn)知。

三、從表象 bug 展開(kāi)的測(cè)試點(diǎn)思考

1. 反向思考

以上是字符型字段導(dǎo)入數(shù)值型的案例,因?yàn)樽址痛娴囊彩菙?shù)值,因此在未超過(guò) 16位的查詢(xún)上,不會(huì)有其他異常,但如果是數(shù)值型字段導(dǎo)入字符型字段呢?

如下圖測(cè)試所示:

插入 id=0 的數(shù)據(jù)后,查詢(xún) id=a 可以查詢(xún)出 id=0 的數(shù)據(jù)。

原來(lái) mysql 的隱式轉(zhuǎn)換,在 int 類(lèi)型的字段傳入字符串會(huì)截取從第一位 int 型開(kāi)始到第一個(gè)非 int 型的值作為條件。因?yàn)?a 沒(méi)有 int 值,所以等于 0,最終查詢(xún) id=a 可以查詢(xún)出 id=0 的數(shù)據(jù)。

特別注意:如果傳入字符串為 01e2 ,則可以查詢(xún)出 100。

2. 針對(duì)隱式轉(zhuǎn)換的 bug,之后如何優(yōu)化用例測(cè)試點(diǎn),做主動(dòng)防范,提高測(cè)試覆蓋率?

(1) 功能問(wèn)題考慮:

表單校驗(yàn):使用不同于數(shù)據(jù)庫(kù)設(shè)計(jì)類(lèi)型的數(shù)據(jù)來(lái)進(jìn)行測(cè)試,如數(shù)據(jù)庫(kù)數(shù)值型,則用字符型數(shù)據(jù)測(cè)試,字符型數(shù)據(jù)用 0 或&等數(shù)值運(yùn)算符測(cè)試,從源頭盡量過(guò)濾不一致。

對(duì)于非 web 錄入的源頭或者后臺(tái)程序代碼看不到的類(lèi)型轉(zhuǎn)換的問(wèn)題,可以使用多個(gè)超過(guò) 16 位的臨近數(shù)、以及根據(jù)隱式轉(zhuǎn)換規(guī)則轉(zhuǎn)換后值一致的字符串進(jìn)行數(shù)據(jù)鋪底,測(cè)試點(diǎn)包括所有涉及后臺(tái)查詢(xún)的場(chǎng)景。在我們保險(xiǎn)軟件測(cè)試中,因?yàn)閱巫C號(hào)是非常重要的基本數(shù)據(jù),因此特別要注意超過(guò) 16 位的保單號(hào)、投保單等單證的鋪底準(zhǔn)備。

除此外,關(guān)注數(shù)值統(tǒng)計(jì)、時(shí)間比較的業(yè)務(wù)場(chǎng)景,因?yàn)樯婕皶r(shí)間和數(shù)值統(tǒng)計(jì)時(shí)經(jīng)常需要函數(shù)進(jìn)行轉(zhuǎn)換,此時(shí)如果格式不一致也會(huì)發(fā)生隱式轉(zhuǎn)換的問(wèn)題:如date( a.publish_time ) >= date_sub( curdate(), INTERVAL 1 DAY )

Date 顯示格式:YYYY-MM-DD;DateTime 顯示格式:YYYY-MM-DD HH:mm:ss。

所以 2008-12-27 16:25:46.635 經(jīng)過(guò) dat(e )函數(shù)處理后的時(shí)間為:2008-12-27 ,date_sub時(shí)間值精確到秒,因此發(fā)生隱式轉(zhuǎn)換后,date()會(huì)轉(zhuǎn)成 2008-12-27 0:0:0,時(shí)間范圍上變窄。

數(shù)據(jù)庫(kù)存在NULL值時(shí),需要特別關(guān)注。因?yàn)楫?dāng)兩個(gè)參數(shù)至少有一個(gè)是 NULL 時(shí),比較的結(jié)果也是 NULL。


新聞名稱(chēng):數(shù)據(jù)庫(kù)丨從MySQL數(shù)值隱式轉(zhuǎn)換成了double型的測(cè)試點(diǎn),值得學(xué)習(xí)
網(wǎng)站URL:http://m.5511xx.com/article/djseocd.html