PHP: Использование Faker для генерации тестовых данных

       PHP      github    faker    php      1364    
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название улицы, только в русской локали'Ладыгина', 'Ленина', 'Ломоносова',
postcode5 цифр (вообще-то в России 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);
Комментарии временно оключены

Поиск

Популярное