PHP: Использование Faker для генерации тестовых данных
В процессе разработки приложения нам нужны данные для теста написанного кода, и желательно что бы данные были очень похожи на реальные данные. Библиотека Faker даёт возможность генерировать различные данные, подходящие для широкого спектра сценариев.
Я использую готовый шаблон тестового приложения используя PDO. Шаблон лежит здесь .
Установка Faker
composer require fzaninotto/faker
Для использования Faker, мы сначала должны получить экземпляр с Faker\Factory
. По умолчанию все поставщики данных, автоматически загружают в объект $faker
. Затем мы генерируем случайные данные, просто вызвав форматированное название.
Использование Faker
// Подключение Faker (загружен через composer)
require "vendor/autoload.php";
// Подключение Faker
require __DIR__ . '/vendor/autoload.php';
$faker = Faker\Factory::create('ru_RU'); // Если нужен русская локализация, передать её параметром в метод create
echo $faker->firstName;
echo '<br>';
echo $faker->address;
echo '<br>';
echo $faker->text;
Faker поставляется с некоторыми встроенными поставщиками: Person, Address, PhoneNo, Company, Lorem, Internet, DateTime и тд.
Весь список и документация Faker здесь
Некоторые поставщики Faker
Person
форматтер | описание | пример вывода |
---|---|---|
name | полное имя, рандомный формат (из списка в классе). для английской локали возможно добавление префикса и суффикса. для русской локали есть вероятность вывода фамилии вместо отчества из-за ошибки в одном из встроенных форматов. | 'Алексей Евгеньевич Константинов', 'Mrs. Alysson Feil PhD', 'Ларионов Артём Симонов', 'Miss Justyn Nienow' |
firstName | просто имя в зависимости от локали | 'Витольд', 'Cathrine', 'Добрыня' |
middleName | отчество. только для русской локали. | 'Александрович', 'Алексеевич', 'Андреевич', 'Дмитриевич' |
lastName | фамилия | 'Егоров', 'Матвеев', 'Бобров', 'Maynard', 'Weber' |
Address
форматтер | описание | пример вывода |
---|---|---|
cityPrefix | тип поселения | 'Ville', 'город' |
streetPrefix | тип улицы | 'пер.', 'ул.', 'пр.', 'шоссе', 'пл.', 'бульвар', 'въезд', 'спуск', 'проезд', 'наб.' |
region | область | Московская |
regionPrefix | тип региона. отсутствует в английской версии | область |
buildingNumber | номер дома, две цифры | 26 |
city | название поселения | 'Балашиха', 'Видное', 'Волоколамск','Щёлково', 'East Pearlinehaven', 'Port Danyka', 'Turcotteland' |
street | название улицы, только в русской локали | 'Ладыгина', 'Ленина', 'Ломоносова', |
postcode | 5 цифр (вообще-то в России 6 цифр =)) | 23545 |
address | полный адрес.форматы в локалях различаются | RU: postcode, region regionSuffix, cityPrefix city, streetPrefix street, buildingNumber EN: streetAddress postcode city |
country | страна | 'Австралия', 'Австрия', 'Азербайджан','Afghanistan', 'Albania', 'Algeria', 'American Samoa', 'Andorra' |
latitude | широта | 77.147489 |
longitude | долгота | 86.211205 |
Получение одинаковых значений
Иногда может понадобиться получение одинаковых значений от скрипта при каждом запуске. Фейкер предлагает метод seed()
, принимающий число.
$faker->seed(1000);
echo $faker->name;
Модификаторы
Faker также предлагает специальные модификаторы для помощи в тестировании, такие как unique()
, optional()
или valid()
. Например, вы можете генерировать уникальные номера:
$values = array();
for ($i=0; $i < 10; $i++) {
$values []= $faker->unique()->randomDigit;
}
print_r($values);
Добавляем несколько записей в БД
Добавляем 100 записей
for($i = 0; $i < 100; $i++){
$query = "INSERT INTO `posts` SET `title` = ?, `anons` = ?, `content` = ?, `status` = ?, `created_at` = ?";
$db->insertRow($query, [
$faker->text(35),
$faker->text(rand(100, 150)),
$faker->text(rand(1000, 1500)),
rand(0, 1),
$faker->unixTime()
]);
}
Добавляем 10000 записей
for ($j = 0; $j < 100; $j++){
$posts = [];
for ($i = 0; $i < 100; $i++){
$query = "INSERT INTO `posts` SET `title` = ?, `anons` = ?, `content` = ?, `status` = ?, `created_at` = ?";
$post[] = $db->insertRow($query, [
$faker->text(35),
$faker->text(rand(100, 150)),
$faker->text(rand(1000, 1500)),
rand(0, 1),
$faker->unixTime(),
]);
}
unset($posts);
}
При вставке большого количества записей в БД может возникнут ошибка Fatal error: Maximum execution time of 30 seconds exceeded
. Это означает то, что превышено максимальное время в секундах, в течении которого скрипт должен полностью загрузиться. Если этого не происходит, парсер завершает работу скрипта. Исправляем эту ошибку (увеличиваем время выполнения скрипта):
В файле php.ini
max_execution_time = 300
В файле .htaccess
php_value max_execution_time 300
В php скрипте
ini_set('max_execution_time', 300);
// или
set_time_limit (300);
Следующая запись
Composer: Основные команды (шпаргалка)