別讓數據類型問題害了你的系統

一、數據類型,熟悉嗎?

數據是代碼中重要組成部分,而數據類型的選擇和使用也影響着代碼邏輯的正確性和服務的性能。

在接口測試過程中,你仔細端詳過數據類型嗎?

我們會發現:數據類型,很容易被忽略,很容易出問題。

 

二、數據類型概述

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環境的作用;線上設置合理的灰度邏輯,及時跟蹤線上驗證;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章