當你需要為你的單元測試想出有用的測試數據時,你是否也經常沒有靈感?不要擔心,Java Faker來救你了!在這篇博客中,你將學習如何生成你的測試數據。在這篇博客中,你將學習如何生成你的測試數據。 1. 簡介 編寫測試數據是編寫測試時最難的任務之一。通常你會在使用數字的時候看到123,或者在需要名字的 ...
當你需要為你的單元測試想出有用的測試數據時,你是否也經常沒有靈感?不要擔心,Java Faker來救你了!在這篇博客中,你將學習如何生成你的測試數據。在這篇博客中,你將學習如何生成你的測試數據。
1. 簡介
編寫測試數據是編寫測試時最難的任務之一。通常你會在使用數字的時候看到123,或者在需要名字的時候看到John Doe。但這也意味著,測試將總是以相同的數據運行。這一方面是一件好事,因為你的測試需要穩定,但另一方面也是一個遺憾,因為你也想找到錯誤。而當使用隨機測試數據時,這種情況更有可能發生。 Java Faker是一個基於Ruby的faker gem和Perl的Data::Faker庫的庫。它將為你生成假數據。還有其他的Java庫,它還基於其他語言的現有偽造者。
2. 添加依賴性
作為一個實驗項目,你將創建一個基本的Spring Boot應用程式。只要導航到start.spring.io,用Java 17創建一個Spring Boot應用程式。當然,Java Faker也可以用於普通的Java應用程式。剩下要做的唯一一件事,就是將javafaker的依賴性添加到pom中。
<
dependency
>
<
groupId
>com.github.javafaker</
groupId
>
<
artifactId
>javafaker</
artifactId
>
<
version
>1.0.2</
version
>
<
scope
>test</
scope
>
</
dependency
>
3. 第一次測試
Java Faker提供了許多可以使用的數據偽造器。完整的列表可以在這裡找到,帶有一些例子的演示應用程式可以在這裡找到。在你創建的第一個例子中,你創建了一個Faker實例,從那一刻起,你可以選擇一個faker並生成數據。使用地址製作器來生成一個名字、一個姓氏和一個街道名稱。
@Test
void
addressFaker() {
Faker faker =
new
Faker();
String firstName = faker.address().firstName();
String lastName = faker.address().lastName();
String streetName = faker.address().streetName();
System.out.println(
"First name: "
+ firstName);
System.out.println(
"Last name: "
+ lastName);
System.out.println(
"Street name: "
+ streetName);
}
例如,輸出結果如下,但每次運行時都會發生變化。
First name: Mika
Last name: Terry
Street name: Wisoky Walk
4. 本地化的偽造者
在前面的例子中,你註意到生成的是英文名字。但是如果你想要更多的特定地區的名字呢?這也是可能的,但要註意的是,並不是每一個偽造者都能在每種語言中使用。你所在地區的列表可以在這裡找到。唯一的區別是,你需要在實例化Faker的時候提供locale。我們試一下中文
@Test
void addressCNFaker() {
Faker faker = new Faker(new Locale("zh-cn"));
String firstName = faker.address().firstName();
String lastName = faker.address().lastName();
String streetName = faker.address().streetName();
System.out.println("First name: " + firstName);
System.out.println("Last name: " + lastName);
System.out.println("Street name: " + streetName);
}
輸出
First name: 琪
Last name: 任
Street name: 丁旁
試一下阿拉伯語,特別是我們國際化產品測試中
First name: عبير
Last name: المالكيّ
Street name: شارع جرير
郵政編碼:
@Test
public void givenJavaFakersWithDifferentLocals_thenHeckZipCodesMatchRegex() {Faker ukFaker = new Faker(new Locale("en-GB"));
Faker usFaker = new Faker(new Locale("en-US"));System.out.println(String.format("American zipcode: %s", usFaker.address().zipCode()));
System.out.println(String.format("British postcode: %s", ukFaker.address().zipCode()));Pattern ukPattern = Pattern.compile(
"([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|"
+ "(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y]"
+ "[0-9]?[A-Za-z]))))\\s?[0-9][A-Za-z]{2})");
Matcher ukMatcher = ukPattern.matcher(ukFaker.address().zipCode());assertTrue(ukMatcher.find());
Matcher usMatcher = Pattern.compile("^\\d{5}(?:[-\\s]\\d{4})?$")
.matcher(usFaker.address().zipCode());assertTrue(usMatcher.find());
}
5. 使用FakeValuesService的隨機字元串
使用FakeValuesService,你可以生成幾個包含隨機數據的字元串。在接下來的章節中,將展示其中的一些功能。
5.1 使用Numerify的隨機字元串
通過numerify,你可以生成一個包含隨機數的字元串。首先,你需要創建一個FakeValuesService實例,包含一個locale和一個RandomService。numerify方法將返回一個字元串,其中的哈希值(#)被替換成數字。對於每一個哈希值,都有一個數字被替換。
@Test
void
fakeValuesServiceNumerify() {
FakeValuesService fakeValuesService =
new
FakeValuesService(
new
Locale(
"nl-NL"
),
new
RandomService());
String randomNumber = fakeValuesService.numerify(
"number##"
);
System.out.println(
"Random number is: "
+ randomNumber);
}
5.2 使用字母化的隨機字元串
與numerify類似,letterify將允許你通過問號的方式來替換字元串中的字元。
@Test
void
fakeValuesServiceLetterify() {
FakeValuesService fakeValuesService =
new
FakeValuesService(
new
Locale(
"nl-NL"
),
new
RandomService());
String randomLetters = fakeValuesService.letterify(
"somestring??"
);
System.out.println(
"Random letters are: "
+ randomLetters);
}
5.3 使用Bothify的隨機字元串
使用Bothify可以實現數字和字母的結合。使用bothify,你可以將隨機數字和字元結合起來。
@Test
void
fakeValuesServiceBothify() {
FakeValuesService fakeValuesService =
new
FakeValuesService(
new
Locale(
"nl-NL"
),
new
RandomService());
String randomNumbersLetters = fakeValuesService.bothify(
"some string with numbers ## and letters ??"
);
System.out.println(
"Random numbers and letters are: "
+ randomNumbersLetters);
}
5.4 用Regexify生成隨機字元串
當上述所有這些還不夠時,你也可以用regexify根據正則表達式生成字元串。下一個正則表達式將選擇列表a、b或c中的一個或多個字元,後面是任何空白字元和一個數字。
@Test
void
fakeValuesServiceRegexify() {
FakeValuesService fakeValuesService =
new
FakeValuesService(
new
Locale(
"nl-NL"
),
new
RandomService());
String randomBasedRegex = fakeValuesService.regexify(
"[abc]+\\s\\d"
);
System.out.println(
"Random string based on a pattern: "
+ randomBasedRegex);
}
6.擴展
如我們想擴充下物資名稱,在源代碼中找到zh-CN.yml,增加對應字元串
@Test
public void testMaterial() {
assertThat(faker.commerce().material(), matchesRegularExpression("\\w+"));
int sum=0;
for (int i=1; i<=10;i++){
Faker faker = new Faker(new Locale("zh-cn"));
String materialName = faker.commerce().material();
System.out.println(materialName);
}
}
輸出:雨衣(分體式)
漂白粉
單兵凈水器
夏襯衫(男)
泛光燈
軀體固定氣囊
7. 總結
Java Faker是一個易於使用的數據生成器庫。它將你從為你的測試編製測試數據的負擔中解脫出來。此外,它將在每次運行時生成其他數據,這可能會揭示你的應用程式中的錯誤。該庫的文檔可以做得更好,但另一方面,該庫也很容易使用,所以這畢竟不應該是一個大問題。
今天先到這兒,希望對雲原生,技術領導力, 企業管理,系統架構設計與評估,團隊管理, 項目管理, 產品管管,團隊建設 有參考作用 , 您可能感興趣的文章:
領導人怎樣帶領好團隊
構建創業公司突擊小團隊
國際化環境下系統架構演化
微服務架構設計
視頻直播平臺的系統架構演化
微服務與Docker介紹
Docker與CI持續集成/CD
互聯網電商購物車架構演變案例
互聯網業務場景下消息隊列架構
互聯網高效研發團隊管理演進之一
消息系統架構設計演進
互聯網電商搜索架構演化之一
企業信息化與軟體工程的迷思
企業項目化管理介紹
軟體項目成功之要素
人際溝通風格介紹一
精益IT組織與分享式領導
學習型組織與企業
企業創新文化與等級觀念
組織目標與個人目標
初創公司人才招聘與管理
人才公司環境與企業文化
企業文化、團隊文化與知識共用
高效能的團隊建設
項目管理溝通計劃
構建高效的研發與自動化運維
某大型電商雲平臺實踐
互聯網資料庫架構設計思路
IT基礎架構規劃方案一(網路系統規劃)
餐飲行業解決方案之客戶分析流程
餐飲行業解決方案之採購戰略制定與實施流程
餐飲行業解決方案之業務設計流程
供應鏈需求調研CheckList
企業應用之性能實時度量系統演變
如有想瞭解更多軟體設計與架構, 系統IT,企業信息化, 團隊管理 資訊,請關註我的微信訂閱號:
作者:Petter Liu
出處:http://www.cnblogs.com/wintersun/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
該文章也同時發佈在我的獨立博客中-Petter Liu Blog。