«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 ~~ ~ Класс FakeValueService предоставляет методы для генерации случайных последовательностей, а также разрешения файлов .yml, связанных с локалью.
В этом разделе мы рассмотрим некоторые полезные методы, которые может предложить FakerValueService.
3.1. Letterify, Numerify и Bothify
Три полезных метода: Letterify, Numberify и Bothify. Letterify помогает генерировать случайные последовательности буквенных символов.
Далее Numerify просто генерирует числовые последовательности.
Наконец, Bothify представляет собой комбинацию этих двух и может создавать случайные буквенно-цифровые последовательности — полезно для имитации таких вещей, как строки идентификаторов.
Для FakeValueService требуется допустимая локаль, а также RandomService:
В этом модульном тесте мы создаем новую FakeValueService с локалью en-GB и используем метод Bothify для создания уникального поддельного адреса Gmail. .
@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());
}
Это работает, заменяя ‘?’ со случайными буквами и «#» со случайными числами. Затем мы можем проверить правильность вывода с помощью простой проверки Matcher.
3.2. Regexify
Точно так же regexify генерирует случайную последовательность на основе выбранного шаблона регулярного выражения.
В этом фрагменте кода мы будем использовать FakeValueService для создания случайной последовательности, следующей за указанным регулярным выражением:
Наш код создает строчную буквенно-цифровую строку длиной 10. Наш шаблон проверяет сгенерированную строку на соответствие заданному регулярному выражению. регулярное выражение
@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());
}
4. Класс Faker JavaFaker
Класс Faker позволяет нам использовать поддельные классы данных JavaFaker.
В этом разделе мы увидим, как создать экземпляр объекта Faker и использовать его для вызова некоторых поддельных данных:
Выше мы использовали объект Faker Address для генерации случайного адреса.
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));
Когда мы запустим этот код, мы получим пример вывода:
Мы видим, что данные не имеют единого географического местоположения, поскольку мы не указали локаль. Чтобы изменить это, мы научимся делать данные более релевантными нашему местоположению в следующем разделе.
3188
Dayna Mountains
New Granvilleborough
Tonga
Мы также могли бы использовать этот фейкер-объект аналогичным образом для создания данных, относящихся ко многим другим объектам, таким как:
Business Beer Food PhoneNumber
-
Полный список можно найти здесь.
5. Знакомство с локалями
Здесь мы расскажем, как использовать локали, чтобы сделать генерируемые данные более специфичными для одного местоположения. Мы представим Faker с локалью для США и локалью для Великобритании:
Выше мы видим, что два 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.
Мы проверим это с помощью следующего модульного теста:
6. Уникальность
@Test(expected = LocaleDoesNotExistException.class)
public void givenWrongLocale_whenFakerInitialised_testExceptionThrown() {
Faker wrongLocaleFaker = new Faker(new Locale("en-seaWorld"));
}
Хотя JavaFaker, по-видимому, генерирует данные случайным образом, уникальность не может быть гарантирована.
JavaFaker поддерживает заполнение своего генератора псевдослучайных чисел (PRNG) в форме RandomService для обеспечения детерминированного вывода повторяющихся вызовов метода.
Проще говоря, псевдослучайность — это процесс, который кажется случайным, но таковым не является.
Мы можем увидеть, как это работает, создав двух мошенников с одним и тем же начальным числом:
Приведенный выше код возвращает одно и то же имя от двух разных мошенников.
@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.
«