我來設計(二):測試數據生成工具

我來設計(二):測試數據生成工具

生成測試數據的方法有很多種,在這裏除了介紹測試數據的生成方法,
還會介紹不要機械理解測試數據僅僅就是隨機就可以了,所謂的隨機策略也可能會影響到你的業務程序。

地點字典:
街道名字,比如:歷山
街道後綴,比如:路,大街

城市字典:比如:濟南,青島,西寧
省份字典(包含直轄市):比如:山東省,北京市,上海市
郵編字典:比如:270000

城市字典與省份字典有一對多的對應關係。
郵編字典與城市字典一一對應

名字字典:
姓字典:比如:李,王,廖,甄,慕容,公孫
女性名字字典: 比如:文秀,小倩,敏,娟
男性名字字典: 比如:,華,科,偉,國,斌,明澤,小兵,遠華

對於FirstNameLastName這裏不舉例,思路類似;

公司名字字典:比如:綠荷經貿,茂田實業,中福文化傳播
公司名字後綴:比如:有限公司,有限責任公司,連鎖店,律師事務所,機械工廠,第一分公司


郵箱相關字典:
域名後綴:org,net,com,biz,us,co.uk,co.in,in,info,cn,com.cn
郵箱運營商字典:163,qq,gmail,hotmail,yahoo,rediffmail

職位字典:
董事長,總經理,主管,經理
通用字典稅務編碼實現思路:
把每一個分類的數據保存到文件中,獲取這些數據後放到一個數組中,
隨機生成一個小於數組長度的數字,然後以這個數字爲下標獲取數組中的值;

有關聯關係的字典,要在初始的時候建立好引用關係;

郵箱生成規則:
姓名的漢語拼音+出生日期或一個兩位數的隨機數+@+郵箱運營商字典+.+域名後綴

出生日期字典:
年份:1950-2000
月份:1-12
天數1-31(是否有29,30,31看年和月份而定)
日期生成編碼實現思路
初始化Calendar對象,調整到1950-01-01然後隨機加上一個代表天數的數值,
就可以得到新的Calendar對象,從而獲取其日期
關於業務上的日期還要提供顯示日期的格式。


業務固定的有限幾個值:
比如:客戶根據自己的要求某個字段就3種類型:業務一,業務二,業務三
3個值是跟業務有關,不可能包含在工具字典裏面的。
有限固定值編碼實現思路
根據輸入的值進行隨機選擇一個值返回

 

數字:
可以指定數字類型(含不含小數,小數幾位),最小值,最大值,平均值,默認值

字符串
根據指定的字符串長度來循環調用獲取單個字符的方法,
長度可以指定最小長度和最大長度,最小長度和最大長度相等時,返回的字符串長度固定。


外鍵生成數據
需要指定執行的sql來從某個主表中獲取數據。

隨機機率:
上面的幾個基本都是用隨機數就能搞定,但是隨機也要考慮一定的機率性,
比如北京一年四季的天氣溫度大部分還是在零上,這樣在隨機生成這個數據的時候,
就得考慮10-20溫度的生成的機率就大一些,其他的機率就小一些。


對隨機機率有要求的需求的編碼思路:
先判斷是否能拿到隨機值的機率,
能拿到就調用系統提供的隨機方法,獲取隨機值
如果拿不到就使用系統提供的默認值。


獲取是否能拿到隨機值的機率的相關代碼:
public boolean chance(int chance) { //chance
的值代表百分比,比如其值等於70就是70%
  return random.nextInt(100) < chance;
}

這裏舉例僅僅是對一個值出現的機率進行運算,對多個值分別執行使用機率也可以運算,思路一樣。
比如:A 出現機率50%  B出現機率30%  C出現機率15%  D出現機率5%


數據偏差:

比如甲告訴你投資100一個月後最少能拿到110 最多能拿到130 平均是120
乙也告訴你投資100一個月後最少能拿到80 最多能拿到160 平均是120

平均收益都是120的兩件事,實際背後可以分析出來乙的方案是高風險,這種結論是通過分析工具分析出來的結果,而對於測試數據工具來講,是不關心這個的。

所以在提供平均值的場景下,可以根據業務要求來提供數據偏差,這樣生成數據的時候可以根據這個偏差生成相應的數據。

數據的分佈密集程度

可以理解成數據傾斜,在我們數據庫中的某個表中,數據量很大,
某個字段的值是否取值均勻可以決定建立在這個字段上的索引的集羣分子,
如果集羣分子很大,在我們的sql中就可能不執行建立在這個字段上的索引。

數據庫的提供的索引有多種類型,在生成數據的同時也可以校驗我們建立的索引類型是否高效。


在後臺運行的程序對這個字段進行分派出去運算的時候,會根據這個值通過某個公式算出某個值出來,然後再分派到後臺的某個計算服務器進行運算,如果某個階段的值過於集中,就會導致分派到某個計算服務器的壓力過大,
從而會導致異常出現。對於這種場景可以看出測試數據也可以影響到你的程序。所以在我們生成測試數據的時候,還是要對這些測試數據多用心,不要主觀認爲全部隨機生成就可以模擬所有的真實數據環境。全部隨機就會導致所有的數據都會均勻分佈,這在某些場景下是不現實的,比如現實富人區和窮人區的比例是均勻的嗎。

實際中用到的幾段代碼:
實例化隨機數對象Random random = newRandom();
生成字符(大寫):
 public char getRandomChar() {
  return (char) (random.nextInt(26) + 'A');
 }

生成字符串(minLength==maxLength會返回固定長度的字符串):
 public String getRandomChars(int minLength, int maxLength) {
   //
先校驗最小值和最大值是否合法的代碼,省掉
  StringBuilder sb = new StringBuilder(maxLength);

  int length =minLength;
  if (maxLength != minLength) {
   length = length + random.nextInt(maxLength - minLength);
  }
  while (length > 0) {
   sb.append(getRandomChar());
   length--;
  }
  return sb.toString();
 }


Random
的常用方法:setSeed,nextInt,nextBoolean,nextDouble,nextGaussian

Math的常用方法調用:  Math.exp,Math.log,Math.max,Math.min


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