Что вы использовали для создания фикстур (тестовых данных) в предыдущих проектах на PHP?

«Что вы использовали для создания фикстур (тестовых данных) в предыдущих проектах на PHP?» — вопрос из категории Тестирование, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Symfony-проектах основным инструментом был DoctrineFixturesBundle в комбинации с Faker для генерации правдоподобных данных. Это позволяло быстро наполнять базу для разработки, тестирования и демо-стендов.

Базовый пример фикстуры для сущности Product:

// src/DataFixtures/ProductFixtures.php
namespace AppDataFixtures;

use AppEntityProduct;
use DoctrineBundleFixturesBundleFixture;
use DoctrinePersistenceObjectManager;
use FakerFactory;

class ProductFixtures extends Fixture
{
    public function load(ObjectManager $manager): void
    {
        $faker = Factory::create('ru_RU');

        for ($i = 0; $i < 50; $i++) {
            $product = new Product();
            $product->setName($faker->words(3, true));
            $product->setDescription($faker->paragraph());
            $product->setPrice($faker->randomNumber(5, false));
            $product->setCreatedAt($faker->dateTimeThisYear);

            $manager->persist($product);
            // Сохраняем ссылку для использования в других фикстурах
            $this->addReference('product_' . $i, $product);
        }
        $manager->flush();
    }
}

Для сложных связей использовали:

  • Ссылки (References): Чтобы связать, например, заказ (Order) с существующим пользователем (User) из другой фикстуры.
    // В OrderFixtures
    $user = $this->getReference('user_admin');
    $order->setCustomer($user);
  • Зависимые фикстуры: Группировка и порядок загрузки через dependencies в аннотации ORMFixture.
  • Пургатор (Purger): Для очистки базы с отключением foreign key checks (--purge-with-truncate) перед загрузкой новых данных.

В некоторых проектах также пробовали AliceBundle для описания фикстур в YAML-файлах, что было удобно для команд, где не все разработчики хотели писать PHP-код для генерации данных.