Faker для генерации тестовых данных

Тестирование является важной частью процесса написания кода. Для тестирования каждой функции нашего приложения нам нужны тестовые данные.

Обычно данные для нашего приложения наполняются когда мы запустим приложение в действие, но в процессе разработки приложения нам нужны данные для теста написанного кода, и желательно что бы данные были очень похожи на реальные данные. Библиотека Faker (подделка) даёт возможность генерировать различные данные, подходящие для широкого спектра сценариев.

Faker для генерации тестовых данных

Faker (подделка) поставляется с набором встроенных данных, которые доступны для генерации тестовых данных. Кроме того, мы можем определить тип для собственного теста приложения, что делает библиотеку гибкой. Но сначала, давайте посмотрим на простой пример, который показывает, как работает подделка:



<?php
require "vendor/autoload.php";

$faker = Faker\Factory::create();

// generate data by accessing properties
for ($i = 0; $i < 10; $i++) {
  echo "<p>" . $faker->name . "</p>";
  echo "<p>" . $faker->address . "</p>";
} 


В примере предполагается, что Faker был установлен с помощью Композитор и использует Композитор autoloader (автозагрузчик), для определения доступа к классу. Вы также можете использовать Faker путем клонирования его из GitHub репозитория с autoloader, если вы не используете Композитор.

Для использования Faker, мы сначала должны получить экземпляр с Faker\Factory. По умолчанию все поставщики данных, автоматически загружают в объект $faker . Затем мы генерируем случайные данные, просто вызвав форматированное название. В конце, выход кода будет в виде списка десяти случайных имён людей и адреса из списка доступных источников данных.

Faker поставляется со следующими встроенными поставщиками: Person, Address, PhoneNo, Company, Lorem, Internet, DateTime, Miscellaneous, и UserAgent.

Посмотрите на класс Person, чтобы понять лучшее какая структура у поставщика Faker.



<?php
namespace Faker\Provider;

class Person extends \Faker\Provider\Base
{
  protected static $formats = array(
     "{{firstName}} {{lastName}}",
  );
  protected static $firstName = array("John", "Jane");
  protected static $lastName = array("Doe");

  public function name() {
     $format = static::randomElement(static::$formats);
    return $this->generator->parse($format);
  }

  public static function firstName() {
    return static::randomElement(static::$firstName);
  }
} 


Person выступает в качестве поставщика, расширяя базовый класс поставщика Faker\Provider\Base. firstName() — formatter, которые получает случайный элемент данных непосредственно с внутреннего массива данных firstName . Документ может сочетать другие средства форматирования и возвращать данные в определенном формате name() . Все поставщики и форматирование работают на основе этой структуры.

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



<?php
namespace Faker\Provider;

class Student extends \Faker\Provider\Person
{
  protected static $formats = array(
    "{{lastName}} {{firstName}}",
    "{{firstName}} {{lastName}}"
  );
  protected static $firstName = array("Mark", "Adam");
  protected static $lastName = array("Clark", "Stewart");
  private static $prefix = array("Mr.", "Mrs.", "Ms.", "Miss", "Dr.");

  public static function prefix() {
    return static::randomElement(static::$prefix);
  }

  public static function firstName() {
    return static::prefix() . " " .
    static::randomElement(static::$firstName);
  }
} 



Поскольку Student не является поставщиком по умолчанию, мы должны вручную добавить его в генератор Faker. Если же метод определяется для более чем одного поставщика услуг, последний добавленный поставщик имеет приоритет над другими.




<?php
$faker = new Faker\Generator();
$faker->addProvider(new Faker\Provider\Student($faker));

echo $faker->firstName; // invokes Student::firstName() 


Более сложный пример Faker

Встроенный поставщик содержит основные типы данных для тестирования, но используя в реальном мире зачастую всё немного сложнее. В таких ситуациях мы должны создать наш собственный поставщик данных и пользовательские наборы данных для автоматизации процедуры тестирования. Создать поставщика Faker с нуля добавив сценарий ниже.

Предположим, мы развивающаяся служба маркетинга по электронной почте, которая рассылает тысячи писем, содержащих различные виды рекламы от клиентов. То какие поля данных будут нужны нам для тестирования? По сути, нам необходимо электронный адрес, тема, имена и содержимое для проверки электронной почты.

Давайте также предположим, существующих три типа шаблона электронной почты:

  • реклама с text/HTML-content
  • объявления с одним полно-размерным изображением
  • объявления, содержащие ссылки на другие сайты

Содержимое поля, будет одним из этих шаблонов, так что нам понадобится также текстовые поля, изображения и ссылки.

Поняв основные требования, мы можем создать поставщик следующим образом:



<?php
namespace Faker\Provider;

class EmailTemplate extends \Faker\Provider\Base
{
  protected static $formats = array(
    '<p>Hello {{name}} </p>
    <p>{{text}}</p>
    <p>Newsletter by Exmaple</p>',

    '<p>{{adImage}}</p>
    <p>Newsletter by Exmaple</p>',

    '<p>Hello {{name}} </p>
    <p>{{link}}</p>
    <p>{{link}}</p>
    <p>{{link}}</p>
    <p>Newsletter by Exmaple</p>'
  );
  protected static $toEmail = array(
    "test@example.com",
    "test1@example.com"
  );
  protected static $name = array("Mark", "Adam");
  protected static $subject = array("Subject 1", "Subject 2");
  protected static $adImage = array("img1.png", "img2.jpg");
  protected static $link = array("link1", "link2");
  protected static $text = array("text1", "text2");

  public static function toEmail() {
    return static::randomElement(static::$toEmail);
  }

  public static function name() {
    return static::randomElement(static::$name);
  }
  
  public function template() {
    $format = static::randomElement(static::$formats);
    return $this->generator->parse($format);
  }
} 


Мы определили три формата для соответствия трёх различных шаблонов, и затем мы создали наборы данных для каждого поля и мы используем генерацию тестовых данных. Все поля должны содержать методы форматирования, похожие на toEmail() и name() в приведенном выше коде. В методе template() заполняются необходимые данные с помощью средств форматирования.

Мы можем получить тестовые данные, используя приведенный ниже код и передает его на наш электронный адрес.




<?php
$faker = new Faker\Generator();
$faker->addProvider(new Faker\Provider\EmailTemplate($faker));

$email = $faker->toEmail; 
$subject =  $faker->subject;
$template = $faker->template; 


Преимущество выше метода является то, что мы можем проверить, все три формата с использованием одного поставщика с прямой функции вызова форматирования. Но что, если один из этих методов форматирования поврежден или у нас есть сценарий, где нам нужно проверить только один из форматов? Закомментировать или удалить форматы вручную, не является правильным решением.

В этом случае я бы рекомендовал создание отдельных реализаций для каждого формата. Мы можем определить базы класса EmailTemplate с одного формата и все методы форматирования, а затем создать три различных дочерний реализации. Дочерний класс будет содержать только уникальный формат и форматирование будет унаследовано от родительского класса. Затем мы можем использовать каждый электронный шаблон, по разному отдельного для генератора.

Последовательность тестовых данных

Запускать тесты придётся много раз что бы записать данные и результаты. Мы проверяем базу данных или файлы журналов, чтобы выяснить где ошибка. Как только мы исправили ошибку, важно запустить тестов с теми же данными в которых была ошибка. Faker использует отбор, чтобы мы могли повторить предыдущие данные путем отбора, это генератор случайных чисел.

Рассмотрим следующий код:



<?php
$faker = Faker\Factory::create();
$faker->seed(1000);
$faker->name; 


Мы присвоим начальное значение 1000. Теперь не важно, сколько раз мы выполнили этот сценарий, имена будут в такой же последовательности случайных значений для всех тестов.

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

В заключение

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

Вы хотите использовать Faker для автоматизации генерации тестовых данных? Дайте мне знать в комментариях.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML -теги и атрибуты: <a href= http://pixelcom.crimea.ua/"" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>