一、數據類型,熟悉嗎?
數據是代碼中重要組成部分,而數據類型的選擇和使用也影響着代碼邏輯的正確性和服務的性能。
在接口測試過程中,你仔細端詳過數據類型嗎?
我們會發現:數據類型,很容易被忽略,很容易出問題。
二、數據類型概述
Java決定了每種簡單類型的大小,這些大小並不隨着機器結構的變化而變化。數據類型其大小的不可更改的特點正是Java程序具有很強移植能力的原因之一。
下表列出了Java中定義的簡單類型、佔用二進制位數及對應的封裝器類:
簡單類型 |
boolean |
byte |
char |
short |
Int |
long |
float |
double |
二進制位數 |
1 |
8 |
16 |
16 |
32 |
64 |
32 |
64 |
封裝器類 |
Boolean |
Byte |
Character |
Short |
Integer |
Long |
Float |
Double |
數據類型的使用過程中,數據類型轉換的場景出現頻率較高,也是容易出問題的地方。
這裏列出簡單類型數據間的轉換,有兩種方式:自動轉換和強制轉換,通常發生在表達式中或方法的參數傳遞時。
-
自動轉換:數據類型由“小”到“大”分別爲 (byte,short,char)--int--long--float—double,這裏我們所說的“大”與“小”,並不是指佔用字節的多少,而是指表示值的範圍的大小。具體地講,當一個較“小”數據
和一個較“大”的數據一起運算時,系統會自動將“小”數據轉換成“大”數據,再進行運算。
-
強制轉換:將“大”數據轉換爲“小”數據時,可以使用強制類型轉換,用圓括號括起來目標類型,置於變量前。
三、典型的案例
在代碼中,不同的業務場景往往需要設置不同的數據類型,隨着業務場景的複雜化,可能最初設計的數據類型已經滿足不了業務需求,那麼在發展過程中,要及時反思和評估數據類型是否合適恰當以及使用方法是否合理。
下面,我們來看一下各類問題的典型案例:
1、數據類型範圍問題
1)問題:發送mq消息,業務方根據需要可以訂閱mq消息消費,prod環境驗證時發現B端會員發送mq時,獲得結果A是負數;
原因:由於代碼中,較長的數據先轉換成int類型後進行處理,超出int範圍,出現了負數情況
2)問題:數據超出範圍,轉換錯誤;
原因:字段B使用Integer類型 金額字段是以分爲單位 超過Integer最大值 需要修改爲Long 否則會出現負數
2、精度問題
1)問題: 字段C由0.0037變更爲0.004,導致變爲0.004;
原因:修改精度由(10,4)變成(17,3), 因此0.0037 的入庫保存時爲0.004
3、數據類型錯誤&選取不當問題
1)問題:操作緩存,數據類型選取錯誤;
原因:直接操作了緩存,緩存值時未選擇值類型,值類型按默認選項被設置成了String(應該是Long ),類型轉換失敗導致拋出異常。
2)問題:沒有兼容全部枚舉字段,系統報錯;
原因:字段爲string類型,可能值爲“xx.xx”、“0.00”、“null”、“一段話“,但調用接口使用爲int型,導致“一段話“時不兼容;
4、數據類型封裝器類使用問題
問題:方法使用錯誤
原因:long是基本數據類型,Long是long的的包裝類,long的大小比較可以用:“>”、“==”、“<”;對於Long類型的數據,實際是一個對象,所以對象不可以直接通過“>”,“==”,“<”的比較,這樣比較的話,比較兩個對象的地址相等才相等;如果要比較兩個對象的是否相等的話,可以用Long對象的.equals()方法;
四、開發如何預防
1)方案設計:針對涉及到數據類型的技術方案設計時,建議考慮如下問題:
-
數據類型範圍是否滿足需求,對業務發展進行評估,進而綜合業務發展和系統性能,從長遠的眼光來選取合適的數據類型;
-
數據類型精度會不會造成數據有偏差,是否會因爲極限情況有問題隱患;
-
不能忽略每個小細節的異常處理機制;
-
上下游接口調用時,務必考慮數據類型兼容問題,業務對接時候,數據存在的情況未做完備分析,保證對所有結果做處理做了完備性處理;
2)邏輯改造:遇到老邏輯改造時候,務必考慮數據類型,仔細校對參數的類型,及時評估數據類型是否滿足當前業務發展;
-
新老邏輯的參數對比,不僅關注輸入輸出參數,還要關注內部實現邏輯;
-
設計合理的灰度邏輯,灰度中及時監控,及時發現問題;
-
數據類型的使用方法、選擇方式形成規範,避免技術性錯誤;
3)代碼review:嚴格review對象的數據類型、接口文檔參數類型、數據庫字段的類型;
4)單測建設:增加單測發現問題能力,涉及到數據類型轉化的單測數據選擇覆蓋全面;
5)線上操作:遵守線上配置操作規範,禁止未通知其他同事PR就直接操作線上配置,操作注意代碼數據類型,很容易被忽略的小細節,很容易出問題;
五、測試如何發現
1)技術方案評審時,積極思考數據類型選擇是否合適,是否符合業務場景需求;
2)測試過程中,注意對測試數據的選擇,測試數據要構造典型數據、極限場景、異常場景、同時避免數據巧合,涉及到數據轉化功能測試不易覆蓋的,建議自己編寫測試代碼來驗證數據類型轉化是否正確;
3)test環境和數據庫數據和線上規則儘量保持一致,對數據庫操作和線上環境也保持一致,例如分表、數據範圍、數據表改動等,便於提早發現問題;
4)st環境操作和線上操作保持一致,包括上線順序,對數據庫的操作,發揮st環境的作用;線上設置合理的灰度邏輯,及時跟蹤線上驗證;