1. Code
  2. Coding Fundamentals
  3. Testing

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

Faker - это библиотека с открытым исходным кодом, созданная Франсуа Занинотто, которая генерирует данные искусственного наполнителя для вашего приложения и его потребностей в тестировании.
Scroll to top
This post is part of a series called Building Your Startup With PHP.
Building Your Startup: Approaching Major Feature Enhancements
How to Build a User Tour With Shepherd in JavaScript

Russian (Pусский) translation by Sergey Zhuk (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

Faker - это библиотека с открытым исходным кодом, созданная Франсуа Занинотто, которая генерирует данные искусственного наполнителя для вашего приложения и его потребностей в тестировании.

Faker можно использовать как в простом PHP-приложении, так и в фреймворке, таком как Yii или Laravel, или в тестовом фреймворке, как например Codeception, который мы ранее уже расстраивали в уроке Envato Tuts +

В сегодняшнем уроке я рассмотрю базовую установку и использование Faker и его возможностей. Как говорит Занинотто:

«Нужно ли вам загружать вашу базу данных, создавать красивые XML-документы, заполнять ваши персистентные данные для стресс-теста или анонимизировать данные, взятые из производственной службы, Faker для вас».

И, в целом, он предоставляет широкий спектр простых возможностей, полезных для любого режима тестирования.

Немного напоминаем, прежде чем мы приступим к работе, я участвую в обсуждениях, приведенных ниже. Мне особенно интересно, если у вас есть дополнительные мысли или вы хотите предложить темы для будущих уроков. Если у вас есть вопрос или предложение, отправьте сообщение ниже. Вы также можете связаться со мной прямо на Twitter @reifman.

Приступая к работе

Установка Faker

Я начал с создания нового дерева кода и добавил fzaninotto/faker к composer.json:

1
{
2
    "name": "Faker Demonstration",
3
    "description": "for Envato Tuts+",
4
    "keywords": ["faker","php","jeff reifman"],
5
    "homepage": "https://www.lookahead.io/",
6
    "type": "project",
7
    "license": "BSD-3-Clause",
8
    "minimum-stability": "stable",
9
    "require": {
10
        "php": ">=5.6.0",
11
        "fzaninotto/faker" : "*"
12
            }    
13
}

Затем я обновил composer:

1
$ composer update
2
Loading composer repositories with package information
3
Updating dependencies (including require-dev)
4
  - Installing fzaninotto/faker (v1.6.0)
5
    Loading from cache
6
7
Writing lock file
8
Generating autoload files

Faker устанавливается в каталог vendor. Итак, я загрузил в начало файла index.php:

1
<?php
2
    // require the Faker autoloader

3
    require __DIR__ . '/vendor/autoload.php';

Далее я хотел бы попробовать несколько простых примеров сценариев генерации данных.

Простые примеры

Я привел примеры Faker и выполнил их из http://localhost:8888/faker:

1
<?php
2
// require the Faker autoloader

3
require __DIR__ . '/vendor/autoload.php';
4
5
// use the factory to create a Faker\Generator instance

6
$faker = Faker\Factory::create();
7
8
// generate data by accessing properties

9
echo $faker->name;
10
  // 'Lucy Cechtelar';

11
  spacer();
12
echo $faker->address;
13
  // "426 Jordy Lodge

14
  // Cartwrightshire, SC 88120-6700"

15
  spacer();
16
echo $faker->text;
17
  // Dolores sit sint laboriosam dolorem culpa et autem. Beatae nam sunt fugit

18
  // et sit et mollitia sed.

19
  // Fuga deserunt tempora facere magni omnis. Omnis quia temporibus laudantium

20
  // sit minima sint.

21
  spacer();
22
23
  function spacer() {
24
    echo '<br />';
25
  }
26
?>

С быстрыми обновлениями мне были представлены различные результаты, такие как:

1
Ruthie Beier
2
37851 Gusikowski Flat Suite 594 Port Keithmouth, NM 06110
3
Reprehenderit eos suscipit sit modi architecto necessitatibus. Error maiores qui vero non omnis. Quaerat mollitia dolore deserunt quia quidem beatae.

И:

1
Darron Hessel
2
657 Elijah Lock Suite 202 Nitzschemouth, AZ 11166
3
Culpa dolorum quidem distinctio eius necessitatibus. Mollitia ut nostrum et ut quas veniam et. Unde iure molestiae aperiam fuga voluptatibus quo.

И:

1
Fredy Fadel MD
2
53328 Eldora Isle Apt. 634 West Eleanore, CA 95798-3025
3
Eligendi eos laudantium eveniet ad. Qui a voluptatibus est quia voluptatem. Dolorum pariatur quaerat nulla.

Faker выполняет свои обещания.

Поставщики Faker по умолчанию

Все методы генерации данных в Faker созданы на основе реализации провайдеров. Вот код, который регистрирует поставщиков Faker по умолчанию - это делается для вас:

1
<?php
2
$faker = new Faker\Generator();
3
$faker->addProvider(new Faker\Provider\en_US\Person($faker));
4
$faker->addProvider(new Faker\Provider\en_US\Address($faker));
5
$faker->addProvider(new Faker\Provider\en_US\PhoneNumber($faker));
6
$faker->addProvider(new Faker\Provider\en_US\Company($faker));
7
$faker->addProvider(new Faker\Provider\Lorem($faker));
8
$faker->addProvider(new Faker\Provider\Internet($faker));

Итак, выше, когда я запросил address у Faker, он искал все провайдеры для методов, которые соответствовали, в конечном счете, используя провайдер Address().

Вы также можете написать собственных поставщиков или просмотреть ряд расширений для Faker, доступных в Интернете.

Модификаторы

Faker также предлагает специальные модификаторы для помощи в тестировании, такие как unique(), optional() или valid(). Например, вы можете генерировать уникальные номера:

1
// unique() forces providers to return unique values

2
$values = array();
3
for ($i=0; $i < 10; $i++) {
4
  // get a random digit, but always a new one, to avoid duplicates

5
  $values []= $faker->unique()->randomDigit;
6
}
7
print_r($values);

Вот вывод уникальных значений:

1
Array ( [0] => 7 [1] => 6 [2] => 0 [3] => 2 [4] => 5 [5] => 1 [6] => 8 [7] => 4 [8] => 9 [9] => 3 )

Если вы используете метод optional(), некоторые числа будут возвращаться как NULL, как если бы пользователь не ввел поле в вашу форму. Примечание. Я не смог заставить этот метод работать правильно.

С valid() вы можете зарегистрировать функции, которые определяют, соответствуют ли данные наполнителя конкретным требованиям или возвращают ошибку или генерируют сообщение об ошибке в форме пользователя.

Изучение поставщиков

Faker предлагает широкий набор методов для генерации случайных данных для вашего приложения:

  • Base: простые методы для случайных букв, чисел, обработанных строк и регулярных выражений
  • Lorem Ipsum Text: случайный текст на латыни
  • Person: имена людей
  • Address: почтовые адреса
  • Phone Number: номера телефонов
  • Company: имена компаний
  • Real Text: фактический текст, написанный людьми вместо бессмысленных латинских строк
  • Date and Time: случайные даты и время
  • Internet: электронная почта, домены и т.д.
  • User Agent: строки браузера
  • Payment: строки и номера кредитных карт и SWIFT
  • Color: случайные цвета
  • File: расширения файлов, типы файлов и имена файлов
  • Image: URL-адреса изображений-заполнителей разных видов
  • Uuid: уникальные IDs
  • Barcode: различные типы штрих-кодов, например. ISBN13
  • Miscellaneous: коды шифрования, коды стран и т.д.
  • Biased: случайные числа с уклоном

Давайте поэкспериментируем с несколькими из этих методов.

Платежная информация

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

1
$faker = Faker\Factory::create();
2
for ($i=0;$i<10;$i++) {
3
  $cc = $faker->creditCardDetails;
4
  $cc['security']=$faker->numberBetween(199,499);
5
  var_dump ($cc);spacer(2);
6
}

Вот несколько выводов из приведенного выше кода:

Using Faker Generating Payment or Credit Card detailsUsing Faker Generating Payment or Credit Card detailsUsing Faker Generating Payment or Credit Card details

Картинки

Using Faker ImagesUsing Faker ImagesUsing Faker Images

Вот простой пример создания изображения:

1
$faker = Faker\Factory::create();
2
$width=320;
3
$height=240;
4
echo '<img src="'.$faker->imageUrl($width, $height).'"/>';

 вы также можете создавать кошек:

1
echo '<img src="'.$faker->imageUrl($width, $height, 'cats', true, 'Faker', true) .'"/>';
Using Faker Images of CatsUsing Faker Images of CatsUsing Faker Images of Cats

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

Интернационализированные данные

С помощью приведенного ниже кода я создал таблицу с четырьмя столбцами имен из Франции, России, Америки и Китая:

1
echo '<table>

2
<thead>

3
<th>French</th>

4
<th>Russian</th>

5
<th>English</th>

6
<th>Chinese</th>

7
</thead>

8
<tr><td>';
9
$faker = Faker\Factory::create('fr_FR'); // create a French faker

10
for ($i=0; $i < 10; $i++) {
11
  echo $faker->name;
12
  spacer();
13
}
14
spacer(2);
15
echo '</td><td>';
16
$faker = Faker\Factory::create('Ru_RU'); // create Russian

17
for ($i=0; $i < 10; $i++) {
18
  echo $faker->name;
19
  spacer();
20
}
21
spacer(2);
22
echo '</td><td>';
23
$faker = Faker\Factory::create('En_US'); // create English

24
for ($i=0; $i < 10; $i++) {
25
  echo $faker->name;
26
  spacer();
27
}
28
spacer(2);
29
echo '</td><td>';
30
$faker = Faker\Factory::create('zh_CN'); // create Chinese

31
for ($i=0; $i < 10; $i++) {
32
  echo $faker->name;
33
  spacer();
34
}
35
echo '</td></tr></table>';

Вот результат:

Using Faker International Capability - Tables of names from four countriesUsing Faker International Capability - Tables of names from four countriesUsing Faker International Capability - Tables of names from four countries

Создание поддельных адресов электронной почты

Вот пример кода для генерации 25 поддельных адресов электронной почты от бесплатных провайдеров, таких как Gmail и Yahoo:

1
$values = array();
2
for ($i=0; $i < 25; $i++) {
3
  // get a random digit, but also null sometimes

4
  $values []= $faker->freeEmail();
5
}
6
print_r($values);
7
exit;

Вот результат:

Using Faker - 25 Free Email AddressesUsing Faker - 25 Free Email AddressesUsing Faker - 25 Free Email Addresses

Создание XML-документов

Faker предлагает полезный пример генерации XML; Однако для этого требуется, чтобы вы работали с инфраструктурой и имели архитектуру представления:

1
<?php
2
require_once '/path/to/Faker/src/autoload.php';
3
$faker = Faker\Factory::create();
4
?>
5
<?xml version="1.0" encoding="UTF-8"?>
6
<contacts>
7
<?php for ($i=0; $i < 10; $i++): ?>
8
  <contact firstName="<?php echo $faker->firstName ?>" lastName="<?php echo $faker->lastName ?>" email="<?php echo $faker->email ?>"/>
9
    <phone number="<?php echo $faker->phoneNumber ?>"/>
10
<?php if ($faker->boolean(25)): ?>
11
    <birth date="<?php echo $faker->dateTimeThisCentury->format('Y-m-d') ?>" place="<?php echo $faker->city ?>"/>
12
<?php endif; ?>
13
    <address>
14
      <street><?php echo $faker->streetAddress ?></street>
15
      <city><?php echo $faker->city ?></city>
16
      <postcode><?php echo $faker->postcode ?></postcode>
17
      <state><?php echo $faker->state ?></state>
18
    </address>
19
    <company name="<?php echo $faker->company ?>" catchPhrase="<?php echo $faker->catchPhrase ?>">
20
<?php if ($faker->boolean(33)): ?>
21
      <offer><?php echo $faker->bs ?></offer>
22
<?php endif; ?>
23
<?php if ($faker->boolean(33)): ?>
24
      <director name="<?php echo $faker->name ?>" />
25
<?php endif; ?>
26
    </company>
27
<?php if ($faker->boolean(15)): ?>
28
    <details>
29
<![CDATA[
30
<?php echo $faker->text(400) ?>
31
]]>
32
    </details>
33
<?php endif; ?>
34
  </contact>
35
<?php endfor; ?>
36
</contacts>

В заключение

Надеюсь, что это послужило хорошим введением для вас в библиотеку Faker - невероятно полезную бесплатную PHP-библиотеку с открытым исходным кодом.

Если вы хотите еще что-нибудь почитать, то я рекомендую Jim Nielsen's Filler Content: Tools, Tips и Dynamic Example (Envato Tuts +), который предоставляет разработчику приложения возможность создавать данные. Он предполагает, что вы можете быть более эффективными, когда применяете поддельные данные, чтобы создать более реалистичный опыт в процессе разработки.

Если вы хотите знать, когда выйдет мой следующий учебник Envato Tuts +, следуйте за мной @reifman в Twitter или проверьте мою страницу инструктора. В настоящее время я работаю над двумя сериями, которые вы можете оценить:

  1. Программирование с помощью Yii2
  2. Создание своего стартапа на PHP о планировщике встреч; Создай расписание своей первой встречи сегодня.

Ссылки по теме