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 .