You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by sg...@apache.org on 2020/11/09 18:34:00 UTC
[freemarker-generator] 02/02: FREEMARKER-163 Integrate Java Faker
library for test data generation
This is an automated email from the ASF dual-hosted git repository.
sgoeschl pushed a commit to branch FREEMARKER-163
in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git
commit e69b84126a274b280e24b04b0a3cfeacbb785f66
Author: Siegfried Goeschl <si...@gmail.com>
AuthorDate: Mon Nov 9 19:33:23 2020 +0100
FREEMARKER-163 Integrate Java Faker library for test data generation
---
.../examples/templates/javafaker/csv/testdata.ftl | 15 +++---
.../site/markdown/cli/usage/generating-testdata.md | 58 ++++++++++++----------
.../freemarker/generator/cli/ExamplesTest.java | 2 +-
.../freemarker/generator/cli/ManualTest.java | 3 +-
.../generator/tools/javafaker/JavaFakerTool.java | 29 ++++++-----
.../tools/javafaker/JavaFakerToolTest.java | 19 ++++++-
6 files changed, 74 insertions(+), 52 deletions(-)
diff --git a/freemarker-generator-cli/src/app/examples/templates/javafaker/csv/testdata.ftl b/freemarker-generator-cli/src/app/examples/templates/javafaker/csv/testdata.ftl
index 5905087..0c6fad4 100644
--- a/freemarker-generator-cli/src/app/examples/templates/javafaker/csv/testdata.ftl
+++ b/freemarker-generator-cli/src/app/examples/templates/javafaker/csv/testdata.ftl
@@ -1,4 +1,3 @@
-<#ftl output_format="plainText" strip_whitespace=true>
<#--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
@@ -15,25 +14,25 @@
specific language governing permissions and limitations
under the License.
-->
-<#import "/freemarker-generator/lib/commons-csv.ftl" as CSV />
-<#assign NR_OF_RECORDS = tools.system.getString("NR_OF_RECORDS","10")>
-<#assign DAYS = tools.javafaker.timeUnits["DAYS"]>
<#assign faker = tools.javafaker.faker>
-<#assign csvTargetFormat = CSV.targetFormat()>
+<#assign nrOfRecords = tools.system.getString("NR_OF_RECORDS","10")>
+<#assign days = tools.javafaker.timeUnits["DAYS"]>
+<#assign csvTargetFormat = tools.csv.formats["DEFAULT"].withFirstRecordAsHeader()>
<#assign csvPrinter = tools.csv.printer(csvTargetFormat)>
<#assign csvHeaders = ['ID','CUSTOMER_ID','FIRST_NAME','LAST_NAME','EMAIL','IBAN','CREATED_AT']>
<#compress>
<#if csvTargetFormat.getSkipHeaderRecord()>
${csvPrinter.printRecord(csvHeaders)}<#t>
</#if>
- <#list 1..NR_OF_RECORDS?number as i>
+ <#list 1..nrOfRecords?number as i>
<#assign id = tools.uuid.randomUUID()>
<#assign customerId = faker.bothify("?#######")>
<#assign firstName = faker.name().firstName()>
<#assign lastName = faker.name().lastName()>
<#assign email = firstName + "." + lastName + "@gmail.com">
- <#assign iban = faker.finance().iban("AT")>
- <#assign createAt = faker.date().past(3650, DAYS)>
+ <#assign iban = faker.finance().iban("DE")>
+
+ <#assign createAt = faker.date().past(3650, days)>
${csvPrinter.printRecord(
id,
customerId,
diff --git a/freemarker-generator-cli/src/site/markdown/cli/usage/generating-testdata.md b/freemarker-generator-cli/src/site/markdown/cli/usage/generating-testdata.md
index eedd1b9..33e2fc7 100644
--- a/freemarker-generator-cli/src/site/markdown/cli/usage/generating-testdata.md
+++ b/freemarker-generator-cli/src/site/markdown/cli/usage/generating-testdata.md
@@ -2,59 +2,65 @@
The generation of test data is supported by [Java Faker](https://github.com/DiUS/java-faker).
-Let's assume that you need to populate a user table based on a CSV file
+Let's assume that you need to populate a user table based on a CSV file with random data
```
-freemarker-generator -t examples/templates/javafaker/csv/testdata.ftl
+freemarker-generator -DNR_OF_RECORDS=10 -t src/app/examples/templates/javafaker/csv/testdata.ftl
```
will generate
```
ID,CUSTOMER_ID,FIRST_NAME,LAST_NAME,EMAIL,IBAN,CREATED_AT
-7e522b5c-1c7f-4195-8585-2268cc7f152a,l1671977,Eddy,Schuster,eddy.schuster@gmail.com,AT101071425404684529,2019-05-18T17:28:30+02:00
-701db208-923b-4100-a02b-4d574b0b703d,e5229102,Mark,Rogahn,mark.rogahn@gmail.com,AT491398501778297253,2014-06-16T21:48:24+02:00
-d5e99c0f-0117-42f9-83a2-33052656e9d6,g0941131,Randall,Cronin,randall.cronin@gmail.com,AT788431029877229377,2016-01-08T05:12:26+01:00
-e2b44ea6-4033-45c9-b9c3-bc9c8f6bc3fe,o4440179,Arthur,Reichel,arthur.reichel@gmail.com,AT767530622367679157,2013-04-07T12:56:13+02:00
-d0dd2806-fe11-487c-9d9b-22dd3ec1abc4,i5706274,Elroy,Sawayn,elroy.sawayn@gmail.com,AT459308883343277427,2017-02-06T01:53:34+01:00
-d36d6851-e961-4f07-9fcc-f7a0702fa6b6,s5645599,Jerald,Nitzsche,jerald.nitzsche@gmail.com,AT366350952237029663,2015-06-14T21:43:32+02:00
-6b9999cf-5aed-4e12-bc6e-e88a7973154d,n4220945,Grant,Bayer,grant.bayer@gmail.com,AT275651850312588466,2020-07-18T15:07:07+02:00
-5fd8286e-cc2f-4fe9-bf56-2245d1bf0c34,t0311536,Edison,Hoppe,edison.hoppe@gmail.com,AT847505633045057210,2017-04-23T23:26:42+02:00
-e0638c76-f130-4daa-9c62-40304101c8ab,b7209087,Nicky,Cole,nicky.cole@gmail.com,AT127017906823575933,2014-08-30T20:38:11+02:00
-c35e2b24-9b9b-4fb0-b25b-72af93301da5,a0087873,Raleigh,Leffler,raleigh.leffler@gmail.com,AT140117255798582963,2016-04-04T12:12:29+02:00
+5c3dbf2b-2957-41fe-8566-e16c91d6bba7,e6044780,Audrey,Ryan,audrey.ryan@gmail.com,DE69137185182464804325,2016-07-25T03:06:54+02:00
+34671167-92f8-46e3-874b-d488960eb320,z8394366,Herb,Lehner,herb.lehner@gmail.com,DE32993443443552974345,2019-10-11T23:27:32+02:00
+479855f6-cc98-4c46-99e4-b1d38d35a7b2,x8937857,Kirby,Wilkinson,kirby.wilkinson@gmail.com,DE12566901129220359287,2020-04-12T04:49:00+02:00
+1a3c51b9-d168-4c0a-84ae-05e79cd181b1,t3486957,Charmaine,Bergstrom,charmaine.bergstrom@gmail.com,DE98964063811726229158,2015-07-24T23:19:19+02:00
+43b9f7ad-1aec-44ff-b3c1-de7688b5a729,z9190225,Sterling,Glover,sterling.glover@gmail.com,DE47207633748672977993,2019-11-04T04:45:06+01:00
+34ce2c9f-e5bb-44f4-a71f-40b0dfa8d0bf,a4406167,George,Marquardt,george.marquardt@gmail.com,DE79342449317255392445,2016-05-15T16:33:05+02:00
+1f9bbc16-8b17-4947-ab50-4abf6aa4cc46,s6438445,Arnoldo,Herzog,arnoldo.herzog@gmail.com,DE20421444995381411375,2013-10-12T07:01:01+02:00
+30e3f7a2-7fe8-4ebf-b46b-4f59ab62ba45,o9507275,Nickie,Predovic,nickie.predovic@gmail.com,DE06666930299990216198,2019-08-01T10:51:51+02:00
+f703e93e-7bc3-42c9-a7f5-f1db84d32fd1,z8385157,Clinton,Murphy,clinton.murphy@gmail.com,DE27305002168865903990,2018-04-01T19:03:55+02:00
+7f6a8d29-2dfc-4467-b366-25b46aa5bc32,x5244747,Johnson,Blanda,johnson.blanda@gmail.com,DE83757301199253406795,2012-06-23T18:04:38+02:00
```
using the following FreeMarker template
```
-<#import "/freemarker-generator/lib/commons-csv.ftl" as csv />
-<#assign timeUnits = tools.javafaker.timeUnits>
<#assign faker = tools.javafaker.faker>
-<#assign csvTargetFormat = csv.targetFormat()>
+<#assign nrOfRecords = tools.system.getString("NR_OF_RECORDS","10")>
+<#assign days = tools.javafaker.timeUnits["DAYS"]>
+<#assign csvTargetFormat = tools.csv.formats["DEFAULT"].withFirstRecordAsHeader()>
<#assign csvPrinter = tools.csv.printer(csvTargetFormat)>
<#assign csvHeaders = ['ID','CUSTOMER_ID','FIRST_NAME','LAST_NAME','EMAIL','IBAN','CREATED_AT']>
<#compress>
<#if csvTargetFormat.getSkipHeaderRecord()>
${csvPrinter.printRecord(csvHeaders)}<#t>
</#if>
- <#list 1..10 as i>
+ <#list 1..nrOfRecords?number as i>
<#assign id = tools.uuid.randomUUID()>
<#assign customerId = faker.bothify("?#######")>
<#assign firstName = faker.name().firstName()>
<#assign lastName = faker.name().lastName()>
<#assign email = firstName + "." + lastName + "@gmail.com">
- <#assign iban = faker.finance().iban("AT")>
- <#assign createAt = faker.date().past(3650, timeUnits["DAYS"])>
+ <#assign iban = faker.finance().iban("DE")>
+ <#assign createAt = faker.date().past(3650, days)>
${csvPrinter.printRecord(
- id,
- customerId,
- firstName,
- lastName,
- email?lower_case
- iban,
- createAt?datetime?iso_local
- )}<#t>
+ id,
+ customerId,
+ firstName,
+ lastName,
+ email?lower_case
+ iban,
+ createAt?datetime?iso_local)}
</#list>
</#compress>
```
+
+Some thoughts along the line
+
+* [Java Faker](https://github.com/DiUS/java-faker) does not create coherent test data, e.g. each invocation of "name" creates a new random name - hence we create the email address ourselves
+* The created IBAN does not use a valid bank code but structure and checksum is correct
+* The "createdAt" generates a creation date from the last 10 years to have some proper distribution
+* See [A Guide to JavaFaker](https://www.baeldung.com/java-faker) for a quick overview
\ No newline at end of file
diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java
index b44d94e..045bb42 100644
--- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java
@@ -114,7 +114,7 @@ public class ExamplesTest extends AbstractMainTest {
@Test
public void shouldRunJavaFakerExamples() throws IOException {
- assertValid(execute("-PCSV_TARGET_DELIMITER=SEMICOLON -t src/app/examples/templates/javafaker/csv/testdata.ftl"));
+ assertValid(execute("-t src/app/examples/templates/javafaker/csv/testdata.ftl"));
}
@Test
diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java
index 7d12754..948ffde 100644
--- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java
@@ -24,7 +24,8 @@ import java.io.IOException;
public class ManualTest extends AbstractMainTest {
// private static final String CMD = "-V";
- private static final String CMD = "-t src/app/examples/templates/demo.ftl src/test/data";
+ // private static final String CMD = "-t src/app/examples/templates/demo.ftl src/test/data";
+ private static final String CMD = "-DNR_OF_RECORDS=10 -l de -t src/app/examples/templates/javafaker/csv/testdata.ftl";
@Override
public String execute(String commandLine) throws IOException {
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerTool.java
index 0dd2b46..b1f9765 100644
--- a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerTool.java
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerTool.java
@@ -17,6 +17,7 @@
package org.apache.freemarker.generator.tools.javafaker;
import com.github.javafaker.Faker;
+import org.apache.freemarker.generator.base.util.LocaleUtils;
import java.util.HashMap;
import java.util.Locale;
@@ -25,24 +26,23 @@ import java.util.concurrent.TimeUnit;
public class JavaFakerTool {
- private Faker faker;
- private Map<String, TimeUnit> timeUnitMap;
-
- public synchronized Faker getFaker() {
- if (faker == null) {
- faker = new Faker(Locale.getDefault());
- timeUnitMap = createTimeUnitMap();
- }
+ /**
+ * Create a Java Faker instance using the default locale.
+ */
+ public Faker getFaker() {
+ return getFaker(Locale.getDefault());
+ }
- return faker;
+ public Faker getFaker(String localeString) {
+ return getFaker(LocaleUtils.parseLocale(localeString));
}
- public synchronized Map<String, TimeUnit> getTimeUnits() {
- if (timeUnitMap == null) {
- timeUnitMap = createTimeUnitMap();
- }
+ public Faker getFaker(Locale locale) {
+ return new Faker(locale);
+ }
- return timeUnitMap;
+ public Map<String, TimeUnit> getTimeUnits() {
+ return createTimeUnitMap();
}
@Override
@@ -60,5 +60,4 @@ public class JavaFakerTool {
result.put("DAYS", TimeUnit.DAYS);
return result;
}
-
}
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerToolTest.java
index e378cd6..d54395c 100644
--- a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerToolTest.java
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/javafaker/JavaFakerToolTest.java
@@ -19,9 +19,11 @@ package org.apache.freemarker.generator.tools.javafaker;
import com.github.javafaker.Faker;
import org.junit.Test;
+import java.util.Locale;
import java.util.concurrent.TimeUnit;
import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
@@ -30,6 +32,16 @@ public class JavaFakerToolTest {
private final Faker faker = javaFakerTool().getFaker();
@Test
+ public void shouldCreateFakerFromLocale() {
+ assertNotNull(new JavaFakerTool().getFaker(Locale.ENGLISH));
+ }
+
+ @Test
+ public void shouldCreateFakerFromLocaleString() {
+ assertNotNull(new JavaFakerTool().getFaker("de-DE"));
+ }
+
+ @Test
public void shouldCreateFakeData() {
assertFalse(faker.name().fullName().isEmpty());
assertFalse(faker.internet().emailAddress().isEmpty());
@@ -37,7 +49,12 @@ public class JavaFakerToolTest {
assertTrue(faker.finance().iban("AT").startsWith("AT"));
}
- private static final JavaFakerTool javaFakerTool() {
+ @Test
+ public void shouldGetTimeUnits() {
+ assertEquals(6, javaFakerTool().getTimeUnits().size());
+ }
+
+ private static JavaFakerTool javaFakerTool() {
return new JavaFakerTool();
}
}