如何優雅地生成測試資料

Brewin發表於2020-09-11

當完成了一些功能模組後勢必要進行測試,這時候測試資料就是一個問題了,完全按照一樣的資料肯定不可以的,大批次的話又得去做一些準備。

這個時候藉助一些簡單易用的隨機資料生成框架就可以輕鬆生成資料了。

github地址:github.com/DiUS/java-faker

依賴

maven中新增:

<dependency>
    <groupId>com.github.javafaker</groupId>
    <artifactId>javafaker</artifactId>
    <version>1.0.2</version>
</dependency>

gradle中新增:

dependencies {
    implementation 'com.github.javafaker:javafaker:1.0.2'
}

基礎用法

使用前,建立一個 Faker 物件:

Faker faker = new Faker();

該框架支援多種語言,預設英文。若想改為其他語言,如下:

Faker faker = new Faker(new Locale("zh-CN"));

支援的國家語言如下:

bg、ca、ca-CAT、da-DK、de、de-AT、de-CH、en、en-AU、en-au-ocker、en-BORK、en-CA、en-GB、en-IND、en-MS、en-NEP、en-NG、en-NZ、en-PAK、en-SG、en-UG、en-US、en-ZA、es、es-MX、fa、fi-FI、fr、he、hu、in-ID、it、ja、ko、nb-NO、nl、pt、pt-BR、ru、sk、sv、sv-SE、tr、uk、vi、zh-CN、zh-TW

生成資料:

Faker faker = new Faker();
String name = faker.name().fullName();
String firstName = faker.name().firstName();
String lastName = faker.name().lastName();
Faker faker = new Faker();
Name name = faker.name();
String name = name.fullName(); 
String firstName = name.firstName(); 
String lastName = name.lastName(); 

支援的領域如下:

AddressAncientAnimalAppAqua Teen Hunger ForceArtistAvatarBack To The FutureAviationBasketballBeerBojack HorsemanBookBoolBusinessChuckNorrisCatCodeCoinColorCommerceCompanyCryptoDateAndTimeDemographicDiseaseDogDragonBallDuneEducatorEsportsFileFinanceFoodFriendsFunnyNameGameOfThronesGenderHackerHarryPotterHipsterHitchhikersGuideToTheGalaxyHobbitHowIMetYourMotherIdNumberInternetJobKaamelottLeagueOfLegendsLebowskiLordOfTheRingsLoremMatzMusicNameNationNumberOptionsOverwatchPhoneNumberPokemonPrincess BrideRelationship TermsRickAndMortyRobinRockBandShakespeareSipSlackEmojiSpaceStarCraftStarTrekStockSuperheroTeamTwinPeaksUniversityWeatherWitcherYodaZelda
地址,古代,動物,App,飲料杯歷險記,藝術家,頭像,回到未來,航空,籃球,啤酒,博克·霍克曼,書籍,布林,業務,查克·諾里斯,貓,程式碼,硬幣,顏色,商業, 公司,加密貨幣,日期和時間,人口統計,疾病,狗,龍珠,沙丘,教育者,電子競技,檔案,財務,食物,朋友,有趣的名字,權力的遊戲,性別,駭客,哈利·波特,時髦,銀河系旅行者指南,霍位元人 ,老爸老媽的浪漫史,身份證號碼,網際網路,工作,卡梅洛特,傳奇聯盟,列波夫斯基,指環王,洛雷姆,馬茨,音樂,姓名,國家,數,選項,守望先鋒,電話號碼,寵物小精靈,公主新娘,關係條款,瑞克和莫蒂 ,羅賓,搖滾樂隊,莎士比亞,sip,休閒表情符號,太空,星際爭霸,星際迷航,股票,超級英雄,團隊,雙峰,大學,天氣,巫師,尤達,塞爾達傳說

示例地址: java-faker.herokuapp.com

API地址: dius.github.io/java-faker/apidocs/i...

github地址:github.com/yindz/common-random

依賴

<dependency>
    <groupId>com.apifan.common</groupId>
    <artifactId>common-random</artifactId>
    <version>1.0.4</version>
</dependency>

基礎用法

隨機數字

//生成1個1~101(不含)之間的隨機整數
int a = NumberSource.getInstance().randomInt(1, 101);

//生成8個1~101(不含)之間的隨機整數
int[] b = NumberSource.getInstance().randomInt(1, 101, 8);

//生成1個10000000000~20000000001(不含)之間的隨機長整數
long c = NumberSource.getInstance().randomLong(10000000000L, 20000000001L);

//生成9個10000000000~20000000001(不含)之間的隨機長整數
long[] d = NumberSource.getInstance().randomLong(10000000000L, 20000000001L, 9);

//生成1個0.01~0.51(不含)之間的隨機整數
double e = NumberSource.getInstance().randomDouble(0.01D, 0.51D);

//生成8個0.01~0.51(不含)之間的隨機整數
double[] f = NumberSource.getInstance().randomDouble(0.01D, 0.51D, 8);

隨機漢字

//生成1個隨機漢字
String i = OtherSource.getInstance().randomChinese();

//生成4個隨機漢字
String j = OtherSource.getInstance().randomChinese(4);

隨機人名

中文名
//生成1個隨機中文人名(性別隨機)
String k = PersonInfoSource.getInstance().randomChineseName();

//生成1個隨機男性中文人名
String k2 = PersonInfoSource.getInstance().randomMaleChineseName();

//生成1個隨機女性中文人名
String k3 = PersonInfoSource.getInstance().randomFemaleChineseName();
英文名
//生成1個隨機英文人名
String l = PersonInfoSource.getInstance().randomEnglishName();
生成姓名頭像
  • 該功能可以根據使用者姓名快速生成各類網站、app的使用者頭像
  • 背景顏色隨機,資料來源取自最近十幾年來廣受歡迎的顏色,詳情參見: Colors of the Year
  • 支援使用自定義字型,但是需要使用者自行保證字型版權合法以避免糾紛
//姓名
String name = PersonInfoSource.getInstance().randomChineseName();
//頭像檔案儲存路徑
String targetPath = "/home/user/picture/" + name + ".png;

//使用預設的Dialog字型
PersonInfoSource.getInstance().generateNamePicture(name, targetPath);

//使用自定義的字型
String font = "/home/user/font/SourceHanSansCN-Normal.ttf";
PersonInfoSource.getInstance().generateNamePicture(name, targetPath, font);

隨機生成符合規則的虛擬身份證號碼

//生成1個隨機的虛擬身份證號碼,地區為廣西壯族自治區,男性,出生日期在1990年11月11日至1999年12月12日之間
LocalDate beginDate = LocalDate.of(1990,11,11);
LocalDate endDate = LocalDate.of(1999,12,12); 
String id1 = PersonInfoSource.getInstance().randomMaleIdCard("廣西壯族自治區", beginDate, endDate);

//生成1個隨機的虛擬身份證號碼,地區為河北省,女性,出生日期在2001年1月11日至2008年2月22日之間
LocalDate beginDate2 = LocalDate.of(2001,1,11);
LocalDate endDate2 = LocalDate.of(2008,2,22);
String id2 = PersonInfoSource.getInstance().randomFemaleIdCard("河北省", beginDate2, endDate2);

//生成1個隨機的虛擬身份證號碼,地區為廣西壯族自治區,男性,年齡為18歲
String id3 = PersonInfoSource.getInstance().randomMaleIdCard("廣西壯族自治區", 18);

//生成1個隨機的虛擬身份證號碼,地區為河北省,女性,年齡為19歲
String id4 = PersonInfoSource.getInstance().randomFemaleIdCard("河北省", 19);

注意:

隨機虛擬信用卡號碼

//生成1個隨機VISA信用卡號碼
String cc1 = PersonInfoSource.getInstance().randomCreditCardNo(CreditCardType.Visa);

//生成1個隨機MasterCard信用卡號碼
String cc2 = PersonInfoSource.getInstance().randomCreditCardNo(CreditCardType.MasterCard);

//生成1個隨機American Express信用卡號碼
String cc3 = PersonInfoSource.getInstance().randomCreditCardNo(CreditCardType.Amex);

//生成1個隨機銀聯信用卡號碼
String cc4 = PersonInfoSource.getInstance().randomCreditCardNo(CreditCardType.UnionPay);

//生成1個隨機JCB信用卡號碼
String cc5 = PersonInfoSource.getInstance().randomCreditCardNo(CreditCardType.JCB);

注意:

  • 隨機生成的虛擬信用卡號碼只是字首和位數符合規則,並不能透過校驗,也無法用於支付,僅供模擬測試/模擬/專案演示等用途

隨機中國大陸手機號

//生成1個隨機中國大陸手機號
String m = PersonInfoSource.getInstance().randomChineseMobile();

隨機郵箱地址

//生成1個隨機郵箱地址,字尾隨機,郵箱使用者名稱最大長度為10
String n1 = InternetSource.getInstance().randomEmail(10);

//生成1個隨機郵箱地址,字尾為163.com,郵箱使用者名稱最大長度為10
String n2 = InternetSource.getInstance().randomEmail(10, "163.com");

隨機域名

//生成1個隨機域名,域名最大長度為16
String dm = InternetSource.getInstance().randomDomain(16);

隨機IPv4地址

//生成1個隨機公網IPv4地址
String pub = InternetSource.getInstance().randomPublicIpv4();

//生成1個隨機私有(內網)IPv4地址
String prv = InternetSource.getInstance().randomPrivateIpv4();

隨機埠號

//生成1個隨機埠號
int port = InternetSource.getInstance().randomPort();

隨機靜態URL

//生成1個隨機靜態URL,字尾為jpg
String url = InternetSource.getInstance().randomStaticUrl("jpg");

隨機日期

//生成1個2020年的隨機日期,日期格式為yyyy-MM-dd
String d1 = DateTimeSource.getInstance().randomDate(2020, "yyyy-MM-dd");

//生成1個2020年1月2日之後的隨機日期,日期格式為yyyy-MM-dd
String d2 = DateTimeSource.getInstance().randomFutureDate(LocalDate.of(2020,1,2), "yyyy-MM-dd");

//生成1個今天(基於系統時間判斷)之後的隨機日期,日期格式為yyyy-MM-dd
String d3 = DateTimeSource.getInstance().randomFutureDate("yyyy-MM-dd");

//生成1個2020年1月2日之前1年內的隨機日期,日期格式為yyyy-MM-dd
String d4 = DateTimeSource.getInstance().randomPastDate(LocalDate.of(2020,1,2), "yyyy-MM-dd");

//生成1個今天(基於系統時間判斷)之前1年內的隨機日期,日期格式為yyyy-MM-dd
String d5 = DateTimeSource.getInstance().randomPastDate("yyyy-MM-dd");

//生成1個2020年1月2日之前10年內的隨機日期,日期格式為yyyy-MM-dd
String dd = DateTimeSource.getInstance().randomPastDate(LocalDate.of(2020,1,2), 3650, "yyyy-MM-dd");

//生成1個2000年1月11日至2010年2月22日範圍之間的隨機日期,日期格式為yyyy-MM-dd
LocalDate beginDate = LocalDate.of(2000,1,11);
LocalDate endDate = LocalDate.of(2010,2,22);
String d6 = DateTimeSource.getInstance().randomDate(beginDate, endDate, "yyyy-MM-dd");

隨機時間

//生成過去7天範圍內的隨機時間
LocalDateTime time1 = DateTimeSource.getInstance().randomPastTime(7);

//生成未來7天範圍內的隨機時間
LocalDateTime time2 = DateTimeSource.getInstance().randomFutureTime(7);

//生成2020年2月14日當天範圍內的隨機時間
LocalDateTime time3 = DateTimeSource.getInstance().randomTime(2020, 2, 14);

//生成過去100秒範圍內的隨機時間
LocalDateTime time4 = DateTimeSource.getInstance().randomPastTime(LocalDateTime.now(), 100);

//生成未來100秒範圍內的隨機時間
LocalDateTime time5 = DateTimeSource.getInstance().randomFutureTime(LocalDateTime.now(), 100);

隨機時間戳

//生成1個當天範圍內的隨機時間戳
long ts1 = DateTimeSource.getInstance().randomTimestamp(LocalDate.now());

//生成1個2020年3月6日範圍內的隨機時間戳
long ts2 = DateTimeSource.getInstance().randomTimestamp(LocalDate.of(2020, 3, 6));

//生成1個介於2020年3月6日12:00:00至2020年3月6日12:30:00之間的隨機時間戳
LocalDateTime begin = LocalDateTime.of(2020, 3, 6, 12, 0, 0);
LocalDateTime end = LocalDateTime.of(2020, 3, 6, 12, 30, 0);
long ts3 = DateTimeSource.getInstance().randomTimestamp(begin, end);

//生成1個2020年3月6日12:00:00之後180秒內的隨機時間戳
LocalDateTime base1 = LocalDateTime.of(2020, 3, 6, 12, 0, 0);
long ts4 = DateTimeSource.getInstance().randomFutureTimestamp(base1, 180);

//生成1個2020年3月7日13:00:00之前120秒內的隨機時間戳
LocalDateTime base2 = LocalDateTime.of(2020, 3, 7, 13, 0, 0);
long ts5 = DateTimeSource.getInstance().randomPastTimestamp(base2, 120);

隨機強密碼

//生成1個隨機強密碼,長度為16,無特殊字元
String pwd1 = PersonInfoSource.getInstance().randomStrongPassword(16, false);

//生成1個隨機強密碼,長度為16,有特殊字元
String pwd2 = PersonInfoSource.getInstance().randomStrongPassword(16, true);

隨機地址

//隨機獲取省份
String prv = AreaSource.getInstance().randomProvince();

//隨機獲取城市(省份+城市,以逗號為分隔符)
String city = AreaSource.getInstance().randomCity(",");

//隨機獲取郵編
String zipCode = AreaSource.getInstance().randomZipCode();

//生成1個隨機中國大陸詳細地址
String addr = AreaSource.getInstance().randomAddress();

隨機中國大陸車牌號

//生成1個隨機中國大陸車牌號(新能源車型)
String n1 = OtherSource.getInstance().randomPlateNumber(true);

//生成1個隨機中國大陸車牌號(非新能源車型)
String n2 = OtherSource.getInstance().randomPlateNumber();

隨機網路暱稱

//生成1個隨機英文網路暱稱,最大長度為8個字元
String nickName = PersonInfoSource.getInstance().randomNickName(8);

//生成1個隨機漢字網路暱稱,最大長度為8個漢字
String nickName2 = PersonInfoSource.getInstance().randomChineseNickName(8);

//基於隨機漢字網路暱稱生成1個拼音網路暱稱,最大長度為4個漢字
String nickName3 = PersonInfoSource.getInstance().randomPinyinNickName(4);

隨機QQ資訊

//生成1個隨機QQ號
String qq = PersonInfoSource.getInstance().randomQQAccount();

//生成1個隨機非主流QQ網名
String nickName = PersonInfoSource.getInstance().randomQQNickName();

隨機教育背景資訊

//隨機獲取學歷
String degree = EducationSource.getInstance().randomDegree();

//隨機獲取本科高校名稱
String college = EducationSource.getInstance().randomCollege();

//隨機獲取小學名稱
String primarySchoolName = EducationSource.getInstance().randomPrimarySchoolName();

//隨機獲取小學年級
String primarySchoolGrade = EducationSource.getInstance().randomPrimarySchoolGrade();

//隨機獲取中學名稱
String highSchoolName = EducationSource.getInstance().randomHighSchoolName();

//隨機獲取中學年級
String highSchoolGrade = EducationSource.getInstance().randomHighSchoolGrade();

//隨機班級名稱
String className = EducationSource.getInstance().randomClassName();

隨機公司名稱

//隨機生成1個公司名稱,地區字首為北京
String companyName = OtherSource.getInstance().randomCompanyName("北京");

隨機經緯度

注意:僅供測試/模擬/模擬/演示,不一定精確。

//隨機生成1個緯度
double lat = AreaSource.getInstance().randomLatitude();

//隨機生成1個經度
double lng = AreaSource.getInstance().randomLongitude();

隨機中文短句

//隨機生成1條中文短句
String sentence = OtherSource.getInstance().randomChineseSentence();

隨機User-Agent

//隨機生成1個PC User-Agent
String ua1 = InternetSource.getInstance().randomPCUserAgent();

//隨機生成1個Android User-Agent
String ua2 = InternetSource.getInstance().randomAndroidUserAgent();

//隨機生成1個iOS User-Agent
String ua3 = InternetSource.getInstance().randomIOSUserAgent();

隨機網路卡MAC地址

//隨機生成1個網路卡MAC地址,使用:作為分隔符
String mac = InternetSource.getInstance().randomMacAddress(":");

隨機顏色值

//隨機生成1個RGB顏色值
int[] rgb = OtherSource.getInstance().randomRgbColor();

//隨機生成1個16進位制(HEX)顏色值
String hex = OtherSource.getInstance().randomHexColor();

股票名稱+股票程式碼

String[] stock = OtherSource.getInstance().randomStock();
String stockName = stock[0];
String stockCode = stock[1];

開放式基金名稱+基金程式碼

String[] fund = OtherSource.getInstance().randomFund();
String fundName = fund[0];
String fundCode = fund[1];
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章