Перейти к основному содержимому

Руководство по JavaFaker

· 5 мин. чтения

1. Обзор

JavaFaker — это библиотека, которую можно использовать для создания широкого массива реальных данных, от адресов до отсылок к популярной культуре.

В этом руководстве мы рассмотрим, как использовать классы JavaFaker для создания поддельных данных. Мы начнем с представления класса Faker и FakeValueService , а затем перейдем к введению локалей, чтобы сделать данные более специфичными для одного места.

Наконец, мы обсудим, насколько уникальны данные. Для тестирования классов JavaFaker мы будем использовать регулярные выражения, подробнее о них можно прочитать здесь .

2. Зависимости

Ниже приведена единственная зависимость , которая нам понадобится для начала работы с JavaFaker.

Во-первых, зависимость, которая нам понадобится для проектов на основе Maven:

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

Для пользователей Gradle вы можете добавить в файл build.gradle следующее :

compile group: 'com.github.javafaker', name: 'javafaker', version: '0.15'

3. Служба поддельных значений

Класс FakeValueService предоставляет методы для создания случайных последовательностей, а также разрешения файлов .yml , связанных с локалью .

В этом разделе мы рассмотрим некоторые полезные методы, которые может предложить FakerValueService .

3.1. Буквенное обозначение , числовое обозначение и оба обозначения

Три полезных метода: Letterify , Numberify и Bothify . Letterify помогает генерировать случайные последовательности буквенных символов .

Затем Numerify просто генерирует числовые последовательности.

Наконец, Bothify представляет собой комбинацию этих двух и может создавать случайные буквенно-цифровые последовательности, что полезно для имитации таких вещей, как строки идентификаторов.

Для FakeValueService требуется действительный Locale, а также RandomService:

@Test
public void whenBothifyCalled_checkPatternMatches() throws Exception {

FakeValuesService fakeValuesService = new FakeValuesService(
new Locale("en-GB"), new RandomService());

String email = fakeValuesService.bothify("????##@gmail.com");
Matcher emailMatcher = Pattern.compile("\\w{4}\\d{2}@gmail.com").matcher(email);

assertTrue(emailMatcher.find());
}

В этом модульном тесте мы создаем новый FakeValueService с языковым стандартом en-GB и используем метод Bothify для создания уникального поддельного адреса Gmail .

Он работает, заменяя ' ?' со случайными буквами и «#» со случайными числами . Затем мы можем проверить правильность вывода с помощью простой проверки Matcher .

3.2. Повторное выражение

Точно так же regexify генерирует случайную последовательность на основе выбранного шаблона регулярного выражения .

В этом фрагменте мы будем использовать FakeValueService для создания случайной последовательности, следующей за указанным регулярным выражением:

@Test
public void givenValidService_whenRegexifyCalled_checkPattern() throws Exception {

FakeValuesService fakeValuesService = new FakeValuesService(
new Locale("en-GB"), new RandomService());

String alphaNumericString = fakeValuesService.regexify("[a-z1-9]{10}");
Matcher alphaNumericMatcher = Pattern.compile("[a-z1-9]{10}").matcher(alphaNumericString);

assertTrue(alphaNumericMatcher.find());
}

Наш код создает строчную буквенно-цифровую строку длиной 10 . Наш шаблон проверяет сгенерированную строку на соответствие регулярному выражению.

4. Класс Faker JavaFaker

Класс Faker позволяет нам использовать поддельные классы данных JavaFaker .

В этом разделе мы увидим, как создать экземпляр объекта Faker и использовать его для вызова некоторых поддельных данных:

Faker faker = new Faker();

String streetName = faker.address().streetName();
String number = faker.address().buildingNumber();
String city = faker.address().city();
String country = faker.address().country();

System.out.println(String.format("%s\n%s\n%s\n%s",
number,
streetName,
city,
country));

Выше мы используем объект Faker Address для генерации случайного адреса .

Когда мы запустим этот код, мы получим пример вывода:

3188
Dayna Mountains
New Granvilleborough
Tonga

Мы видим, что данные не имеют единого географического местоположения , поскольку мы не указали локаль. Чтобы изменить это, мы научимся делать данные более релевантными нашему местоположению в следующем разделе.

Мы также могли бы использовать этот поддельный объект аналогичным образом для создания данных, относящихся ко многим другим объектам, таким как:

  • Бизнес
  • Пиво
  • Еда
  • Номер телефона

Вы можете найти полный список здесь .

5. Представляем локали

Здесь мы покажем, как использовать локали, чтобы сделать сгенерированные данные более специфичными для одного местоположения . Мы представим Faker с локалью США и локалью Великобритании:

@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());
}

Выше мы видим, что два фейкера с локалью соответствуют своим регулярным выражениям для почтовых индексов стран.

Если локаль, переданная Faker , не существует, Faker генерирует исключение LocaleDoesNotExistException .

Мы проверим это с помощью следующего модульного теста:

@Test(expected = LocaleDoesNotExistException.class)
public void givenWrongLocale_whenFakerInitialised_testExceptionThrown() {
Faker wrongLocaleFaker = new Faker(new Locale("en-seaWorld"));
}

6. Уникальность

Хотя JavaFaker , по- видимому, генерирует данные случайным образом, их уникальность не может быть гарантирована .

JavaFaker поддерживает заполнение своего генератора псевдослучайных чисел (PRNG) в форме RandomService для обеспечения детерминированного вывода повторяющихся вызовов метода.

Проще говоря, псевдослучайность — это процесс, который кажется случайным, но таковым не является.

Мы можем увидеть, как это работает, создав два Faker с одним и тем же начальным числом:

@Test
public void givenJavaFakersWithSameSeed_whenNameCalled_CheckSameName() {

Faker faker1 = new Faker(new Random(24));
Faker faker2 = new Faker(new Random(24));

assertEquals(faker1.name().firstName(), faker2.name().firstName());
}

Приведенный выше код возвращает одно и то же имя от двух разных мошенников.

7. Заключение

В этом руководстве мы изучили библиотеку JavaFaker для создания реалистичных поддельных данных . Мы также рассмотрели два полезных класса: класс Faker и класс FakeValueService .

Мы изучили, как мы можем использовать локали для создания данных о местоположении.

Наконец, мы обсудили, как сгенерированные данные кажутся случайными, а их уникальность не гарантируется.

Как обычно, фрагменты кода можно найти на GitHub .