Slide 1

Slide 1 text

DataFaker The most powerful fake data generation library @eliasnogueira

Slide 2

Slide 2 text

ELIAS NOGUEIRA Senior Principal Software Engineer Brazil Java Champion Oracle ACE Pro Java Magazine NL Editor

Slide 3

Slide 3 text

The problem we will solve

Slide 4

Slide 4 text

address=XmcWoqivEzSoUwEksGNjlzrjUmWKKCIDOTsDnPAlHPQMJaWYzt age=0 Meaningful data Generate random fixed data name=John Doe [email protected] No data requirement focus https://speakerdeck.com/eliasnogueira/managing-test-data https://speakerdeck.com/eliasnogueira/managing-test-data

Slide 5

Slide 5 text

{ "name": "gAqXOiRGeYiYFHcUOBODzfIQyMmJhUIBJQKqbgamCAlrNlPgxb", "age": 99, "addresses": [ { "line_1": "XGWCgCJcufQlNeqBeXzjcWEVDeIVkJ", "line_2": "sHMZCiNipBcZyfMGZTYYVfRZCTrQySLOwpJSQdHZhrsWznnsSn", "building_number": "64126021", "postcode": "vUdzNyBenk", "town_or_city": "jbeZQMWfKgxEVUYNlJSr", "district": "LOoKXHKNppaFUBy", "country": "AcqwFQFIEB", "latitude": 1.1111111, "longitude": -2.222222 } ] } All the problems together

Slide 6

Slide 6 text

How we will solve it?

Slide 7

Slide 7 text

Address (any pieces), latitude, longitude IBAN, BIC, credit card, stock, routing number DataFaker Any composition, suffix, prefix Credit card, security code, card type Domain, e-mail, image, IP address, password Different providers to help you! Names Address Finance Business Internet +200 Generating fake data for the JVM (Java, Kotlin, Groovy) has never been easier!

Slide 8

Slide 8 text

Generation in a nutshell The connections between the YML file and the code. Sometimes it has some logic. This file contains the data generated by DataFaker. It supports different locales. YML file Provider class

Slide 9

Slide 9 text

DataFaker Concepts Base Providers Transformation Schemas Real life usage How to create yours Repeatable Results

Slide 10

Slide 10 text

Base Providers

Slide 11

Slide 11 text

Base Providers Generator Code Output Names faker.name().fullName() Clemente Lemke Address faker.address().fullAddress() Apt. 984 62551 Brooke Expressway, Chinmouth, WA 55746 Finance faker.finance().iban() NL31RJCK5939950627 Business faker.business().creditCardNumber() 5202-4875-5936-5334 Internet faker.internet().image() https://picsum.photos/640/480 More than 200 providers available

Slide 12

Slide 12 text

Repeatable Results

Slide 13

Slide 13 text

Transformation Schemas @Test public void predictableData() { Faker fakerPredictable = new Faker(new Random(0)); String name = fakerPredictable.name().fullName(); String address = fakerPredictable.address().fullAddress(); LOGGER.info(name); LOGGER.info(address); } [INFO ] Miss Lavina Waelchi [INFO ] 194 Allison Drive, Strackeview, MT 10384 Output

Slide 14

Slide 14 text

Transformation Schemas

Slide 15

Slide 15 text

Transformation Schemas CSV JSON SQL YAML XML Java Schema is a set of rules describing what should be done to transform data from Datafaker representation to one of the supported formats

Slide 16

Slide 16 text

Transformation Schemas Faker faker = new Faker(); Schema personSchema = Schema.of( field("name", () -> faker.name().nameWithMiddle()), field("username", () -> faker.internet().username()), field("email", () -> faker.internet().emailAddress()), field("password", () -> faker.internet().password(8, 12)) );

Slide 17

Slide 17 text

Transformation Schemas /* * SQL Data Transformation */ SqlTransformer sqlTransformer = new SqlTransformer.SqlTransformerBuilder() .batch(5) .tableName("MY_TABLE") .dialect(SqlDialect.POSTGRES) .build(); String output = sqlTransformer.generate(personSchema, 10); /* * CSV Data Transformation */ CsvTransformer csvTransformer = CsvTransformer.builder().header(true).separator(COMMA).build(); String csvOutput = csvTransformer.generate(retrieveSchema(), 5);

Slide 18

Slide 18 text

Transformation Schemas CSV Output "name","username","email","password" "Myra Lemke Zulauf","giovanni.hartmann","[email protected]","49uv48051" "Elijah Kautzer Hudson","carlota.haag","[email protected]","292ka97i5" "Loraine Simonis Dach","renee.ondricka","[email protected]","9vt5tr7i0" "George Stiedemann Roob","idella.crist","[email protected]","4134aqt8q" "Derek Runolfsdottir Spinka","marcel.simonis","[email protected]","r3073b71j7" SQL Output INSERT INTO MY_TABLE ("name", "username", "email", "password") VALUES ('Yuki Osinski Hagenes', 'billie.collins', '[email protected]', 'def314ac7w9'), ('Kenny Kessler Rice V', 'minh.schneider', '[email protected]', '1ij8xjive6'), ('Cory Tromp Konopelski', 'yuko.russel', '[email protected]', 'h94nbfv99'), ('Lonna Borer Casper', 'joyce.mclaughlin', '[email protected]', '33sopr94vg'), ('Mr. Sammy Braun Langworth', 'darren.osinski', '[email protected]', '39j16kik8');

Slide 19

Slide 19 text

Real Life Usage

Slide 20

Slide 20 text

Real Life Usage Tool To randomize meaningful data in the Factory Test Data Factory Factory Factory Pattern to generate different data scenarios Model Model object using the Build pattern to hold data

Slide 21

Slide 21 text

Real Life Usage public final class UserDataFactory { private static final Faker FAKER = new Faker(); public static User validUser() { return User.builder() .name(FAKER.name().nameWithMiddle()) .username(FAKER.internet().username()) .email(FAKER.internet().emailAddress()) .password(FAKER.internet().password()) .build(); } }

Slide 22

Slide 22 text

Real Life Usage public final class UserDataFactory { private static final Faker FAKER = new Faker(); public static User passwordNotMatchMinRequirement() { return User.builder() .name(FAKER.name().nameWithMiddle()) .username(FAKER.internet().username()) .email(FAKER.internet().emailAddress()) .password(FAKER.internet().password(1,11)) .build(); } }

Slide 23

Slide 23 text

How to Create Yours

Slide 24

Slide 24 text

How To Create Yours [private] Step 1 Create the YAML file with data Step 2 Create the Provider class Step 3 Create the Custom Faker

Slide 25

Slide 25 text

How To Create Yours [private] Step 1 Create an yml file in the src/main/resources en: faker: java-conferences: names: - "Devoxx UK" - "DevNexus" - "Devoxx Belgium" - "JavaZone" - "Jfall" - "Jfokus" - "JavaLand" - "JNation" - "JPrime" - "JCON" en is the locale faker is the reference for the generation java-conferences is the provider key names is the list of values

Slide 26

Slide 26 text

How To Create Yours [private] Step 2 Create the provider class public class JavaConferences extends AbstractProvider { protected JavaConferences(BaseProviders faker) { super(faker); faker.addPath(Locale.ENGLISH, Paths.get( getClass().getClassLoader().getResource("java-conferences.yml").getPath())); } public String name() { return resolve("java-conferences.names"); } } The constructor make the connection between the class and the YML file

Slide 27

Slide 27 text

public class JavaConferences extends AbstractProvider { protected JavaConferences(BaseProviders faker) { super(faker); faker.addPath(Locale.ENGLISH, Paths.get( getClass().getClassLoader().getResource("java-conferences.yml").getPath())); } public String name() { return resolve("java-conferences.names"); } } How To Create Yours [private] Step 2 Create the provider class Then we use the provider key followed by the generators which will return one of the data present in the YML file

Slide 28

Slide 28 text

How To Create Yours [private] Step 3 Create the custom Faker public class MyCustomFaker extends Faker { public JavaConferences javaConferences() { return getProvider(JavaConferences.class, JavaConferences::new, this); } }

Slide 29

Slide 29 text

How To Create Yours [private] Usage Use the custom faker to generate your private data @Test @DisplayName("Should generate a Java event") void generateJavaEvent() { var javaEvent = myCustomFaker.javaConferences().name(); var country = myCustomFaker.country().name(); LOGGER.info(javaEvent); LOGGER.info(country); assertThat(javaEvent).isNotEmpty(); assertThat(country).isNotEmpty(); }

Slide 30

Slide 30 text

How To Move Yours to DataFaker Step 1 Create the YAML file with data Step 2 Create the Provider class Step 3 Add the yaml file to the service file Step 4 Add it to the BaseProviders

Slide 31

Slide 31 text

How To Move Yours to DataFaker Step 1 Create an yml file in the src/main/resources en: faker: java-conferences: names: - "Devoxx UK" - "DevNexus" - "Devoxx Belgium" - "JavaZone" - "Jfall" - "Jfokus" - "JavaLand" - "JNation" - "JPrime" - "JCON" en is the locale faker is the reference for the generation java-conferences is the provider key names is the list of values

Slide 32

Slide 32 text

How To Move Yours to DataFaker Step 2 Create the provider class in the src/main/java/net.datafaker.providers.base public class JavaConferences extends AbstractProvider { protected JavaConferences(BaseProviders faker) { super(faker); } public String name() { return resolve("java-conferences.names"); } } The constructor make the connection between the class and the YML file

Slide 33

Slide 33 text

How To Move Yours to DataFaker Step 2 public class JavaConferences extends AbstractProvider { protected JavaConferences(BaseProviders faker) { super(faker); } public String name() { return resolve("java-conferences.names"); } } Then we use the provider key followed by the generators which will return one of the data present in the YML file Create the provider class in the src/main/java/net.datafaker.providers.base

Slide 34

Slide 34 text

How To Move Yours to DataFaker Step 3 Add the YML file name in the src/main/java/net.datafaker.service.files public class EnFile { // previous code ignored private static final List FILES = Stream.of( "address.yml", "Ancient.yml", "YOUR_FILE.yml", ).map(EnFile::new).toList();

Slide 35

Slide 35 text

How To Move Yours to DataFaker Step 4 Add the YML file name in the src/main/java/net.datafaker.providers.base public interface BaseProviders extends ProviderRegistration { default Address address() { return getProvider(Address.class, Address::new); } default JavaConferences javaConferences() { return getProvider(JavaConferences.class, JavaConferences::new); } }

Slide 36

Slide 36 text

Thanks! Elias Nogueira