使用Java Faker模擬測試數據

来源:https://www.cnblogs.com/wintersun/archive/2022/05/28/16319968.html
-Advertisement-
Play Games

當你需要為你的單元測試想出有用的測試數據時,你是否也經常沒有靈感?不要擔心,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,增加對應字元串

image

@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,企業信息化, 團隊管理 資訊,請關註我的微信訂閱號:

MegadotnetMicroMsg_thumb1_thumb1_thu[2]

作者:Petter Liu
出處:http://www.cnblogs.com/wintersun/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。 該文章也同時發佈在我的獨立博客中-Petter Liu Blog。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 整體框架 綠色代表介面/抽象類;藍色代表類。 主要由兩大介面組成,一個是「Collection」介面,另一個是「Map」介面。 前言 以前剛開始學習「集合」的時候,由於沒有好好預習,也沒有學好基礎知識,介面,類,這些基礎知識都沒學好,所以學到這裡還是懵懵懂懂的。第一次接觸到「集合」,這兩個字,在我的 ...
  • C++ string 字元串類詳解:深入淺出地介紹了各種【string的使用方法】,其中包含了所有【string常用函數】。 ...
  • 樹 建議閱讀順序(有些沒有嚴格的順序關係): 線段樹 \(\rightarrow\) 輕重鏈剖分(長短鏈剖分) \(\rightarrow\) \(LCA\&LA\) \(\rightarrow\) 全局平衡二叉樹 \(\rightarrow\) 動態樹 數據結構 線段樹 https://www.c ...
  • 一個去京東面試的工作了5年的粉絲來找我說: Mic老師,你說併發編程很重要,果然我今天又掛在一道併發編程的面試題上了。 我問他問題是什麼,他說:”如何中斷一個正在運行中的線程?“。 我說這個問題很多工作2年的人都知道~ 好吧,對於這個問題,來看看普通人和高手的回答。 普通人: 嗯。。。。。。。。。。 ...
  • 這篇文章我想和你聊一聊 spring的@Enable模塊驅動的實現原理。 在我們平時使用spring的過程中,如果想要加個定時任務的功能,那麼就需要加註解@EnableScheduling,如果想使用非同步的功能,那就要加@EnableScheduling註解,其實這類註解就是屬於@Enable模塊。 ...
  • 前段時間看到群里有吐槽swagger整合問題,當時沒仔細看,總以為是姿勢不對。 這兩天正好自己升級Spring Boot版本,然後突然出現了這樣的一個錯誤: Caused by: java.lang.NullPointerException: Cannot invoke "org.springfra ...
  • 電腦、平板,只要有瀏覽器就能寫代碼,頁面效果接近桌面版vscode,編譯運行代碼都在免費的微軟伺服器上,心動嗎?隨本文一起行動吧 ...
  • 項目簡介 novel 是一套基於時下最新 Java 技術棧 Spring Boot 3 + Vue 3 開發的前後端分離的學習型小說項目,配備詳細的項目教程手把手教你從零開始開發上線一個生產級別的 Java 系統,由小說門戶系統、作家後臺管理系統、平臺後臺管理系統等多個子系統構成。包括小說推薦、作品 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...