Boostez vos tests Symfony avec Zenstruck Foundry

· Silas Joisten · Temps de lecture: 3 minutes
Toy factory production line

Zenstruck Foundry a révolutionné notre manière d’écrire des tests dans Symfony. Dans cet article, vous apprendrez comment des fabriques expressives, des données de test isolées et une expérience développeur plus fluide nous ont permis d’optimiser nos flux de tests et d’améliorer la productivité.

Qu’est-ce que Zenstruck Foundry ?

Zenstruck Foundry est une bibliothèque très utile conçue pour simplifier la création de données de test dans les applications Symfony. Au cœur de Foundry, on retrouve des factories expressives et auto-complétées pour les entités Doctrine, permettant aux développeurs de générer rapidement des données avec un minimum de code répétitif (boilerplate).

Avec le support de Faker, une intégration complète avec Doctrine ORM/ODM, et des fonctionnalités comme les stories, Foundry améliore considérablement la productivité des développeurs et la fiabilité des tests.

Créer une factory pour une entité Doctrine

Imaginons que nous ayons une entité User :

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
class User
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: 'integer')]
    private ?int $id = null;

    #[ORM\Column(type: 'string')]
    private string $email;

    #[ORM\Column(type: 'string')]
    private string $name;
}

On peut alors générer une factory pour cette entité :

bin/console make:factory App\\Entity\\User

Cette commande crée la classe UserFactory suivante :

// src/Factory/UserFactory.php
namespace App\Factory;

use App\Entity\User;
use Zenstruck\Foundry\Persistence\PersistentObjectFactory;
use Zenstruck\Foundry\Proxy;

/**
 * @extends PersistentObjectFactory<User>
 */
final class UserFactory extends PersistentObjectFactory
{
    protected function defaults(): array
    {
        return [
            'email' => self::faker()->email(),
            'name' => self::faker()->name(),
        ];
    }

    protected static function class(): string
    {
        return User::class;
    }
}

Utiliser les factories dans les tests

Une fois la factory créée, vous pouvez l’utiliser dans vos tests pour générer des utilisateurs :

public function testGetEmail(): void
{
    $user = UserFactory::createOne([
        'email' => $expected = 'john@doe.com'
    ]);

    self::assertSame($expected, $user->getEmail());
}

Et si vous avez besoin de plusieurs utilisateurs, vous pouvez en créer de cette façon :

$users = UserFactory::createMany(5);

Une introduction aux Stories

Les stories sont un excellent moyen de définir des scénarios de données réutilisables. Par exemple, si vous souhaitez qu’un utilisateur administrateur existe toujours par défaut, vous pouvez le définir dans une story :

// src/Story/DefaultUsersStory.php
namespace App\Story;

use App\Factory\UserFactory;
use Zenstruck\Foundry\Story;

final class DefaultUsersStory extends Story
{
    public function build(): void
    {
        UserFactory::createOne([
            'email' => 'admin@example.com',
            'name' => 'Administrator',
        ]);
    }
}

Vous pouvez ensuite charger cette story avec les fixtures Doctrine :

bin/console doctrine:fixtures:load

Assurez-vous que le Foundry loader est bien enregistré dans la configuration de FoundryBundle si nécessaire.

Factories intégrées

Foundry propose également des factories spécialisées pour des cas d’usage avancés :

  • ArrayFactory : pour générer des tableaux de données (par exemple pour simuler des réponses API).

  • ObjectFactory : pour créer des objets sans les persister.

  • PersistentProxyObjectFactory : utile lorsque vous souhaitez que les objets soient immédiatement persistés en base et accessibles via un Proxy.

Tester des Value Objects et des Agrégats en DDD

L’une des grandes forces de Zenstruck Foundry est sa capacité à gérer des modèles de domaine complexes, y compris les Value Objects et Agrégats dans le cadre du Domain-Driven Design (DDD). Foundry facilite la création des entités et de leurs objets de valeur associés, ce qui en fait un excellent choix pour tester des architectures DDD sophistiquées.

Découvrez les bases du Domain-Driven Design dans mon blog post précédent

Par exemple, imaginons que vous souhaitiez tester un Value Object comme Price. Grâce aux factories de Foundry, vous pouvez rapidement injecter des données réalistes dans vos objets métier.

final readonly class Price
{
    public function __construct(
        public int $amount,
        public string $currency,
    ) {
    }
}
use Zenstruck\Foundry\Object\Instantiator\ObjectFactory;

final class PriceFactory extends ObjectFactory
{
    protected function defaults(): array
    {
        return [
            'amount' => self::faker()->numberBetween(100, 1000),
            'currency' => self::faker()->randomElement(['€', '$']),
        ];
    }

    protected static function getClass(): string
    {
        return Price::class;
    }
}

Cela vous permet ainsi de tester le comportement des agrégats en DDD sans vous soucier de la complexité liée à la création ou la gestion des données sous-jacentes. Foundry vous aide à simuler des modèles métiers réalistes pour garantir des interactions cohérentes entre agrégats et objets de valeur.

Conclusion

Zenstruck Foundry est devenu un outil incontournable dans notre stack Symfony. Il réduit la répétition dans le code, améliore la fiabilité des tests et booste la productivité. Les stories pour les scénarios réutilisables et les factories avancées pour des besoins complexes en font un excellent atout pour n'importe quel projet Symfony.

En plus, sa compatibilité avec les principes du DDD permet de tester facilement des Value Objects et des Aggregates, ce qui en fait un très bon choix choix pour des projets avec des modèles de domaine complexes.

Démarrez avec Foundry

Transformez votre flux de travail de test Symfony dès aujourd’hui avec Foundry. Générez facilement des données de test, automatisez les tâches répétitives et assurez-vous de compter sur des tests plus fiables.

Cela pourrait aussi vous intéresser

PHP 8.5 URI extension
Oskar Stark

La nouvelle extension URI de PHP 8.5 : Une révolution pour l'analyse des URL

PHP 8.5 introduit une nouvelle extension URI puissante qui modernise la gestion des URL. Grâce au support des standards RFC 3986 et WHATWG, la nouvelle classe Uri fournit des objets immuables, des interfaces fluides et une validation appropriée, résolvant ainsi toutes les limites de la fonction historique parse_url(). Cet articl présente des exemples pratiques avant/après et explique quand utiliser chaque standard.

En savoir plus
Two images: on the left many cars stuck in a traffic jam with the sign "All directions" above, on the right a blue car moving forward alone on the highway with the sign "Service Subscriber" and a Symfony logo above
Steven Renaux

Les Lazy Services de Symfony : Boostez votre DX en utilisant les Service Subscribers

Optimisez la performance de votre application Symfony et l'expérience développeur ! Apprenez à utiliser les Service Subscribers et les attributs de chargement différé des services afin de réduire l'instanciation rapide, de simplifier les dépendances et de créer un code modulaire et maintenable.

En savoir plus
the surface of the earth seen from the space with city lights forming networks
Imen Ezzine

Les verbes HTTP : votre Guide Complet

Apprenez les bases des verbes HTTP : GET, POST, PUT, DELETE, et plus encore. Cet article vous explique leur fonctionnement, leurs utilisations et les conséquences en matière de sécurité.

En savoir plus
Domain Driven Design practical approach
Silas Joisten

Appliquer le Domain-Driven Design à PHP et Symfony : Un Guide Pratique

Le Domain-Driven Design (DDD) s'applique à Symfony grâce à des Value Objects, des dépôts et des contextes bornés. Dans cet article, découvrez les étapes concrètes pour construire des applications PHP évolutives.

En savoir plus
type-safety-uuid
Oskar Stark

Des identifiants sécurisés par type avec Symfony et Doctrine : l'utilisation de classes d’ID dédiées

Apprenez à améliorer la sécurité des types dans Symfony et Doctrine en utilisant des classes d’ID dédiées comme BookId et UserId au lieu d’UUID bruts. Cette approche permet d'éviter la confusion des identifiants, de rendre le code plus clair et d'assurer une meilleure intégration avec Symfony Messenger et les méthodes de repository. Découvrez des exemples pratiques et les meilleures pratiques pour implémenter des identifiants sécurisés par type dans vos applications Symfony.

En savoir plus
Grey Cargo Plane with a Blue Sky
Rémi Brière

L'Agilité en entreprise - 1. Le Culte du Cargo

L'agilité ne se résume pas à des rituels et à des outils. Dans ce premier article de notre série Scrum, nous explorons le phénomène du culte du cargo et la manière dont l'imitation aveugle peut entraver la véritable transformation Agile.

En savoir plus
SemVer vs. CalVer
Silas Joisten

SemVer vs. CalVer : Quelle stratégie de versioning choisir ?

SemVer garantit la stabilité des bibliothèques, tandis que CalVer synchronise les projets avec les cycles de publication. Découvrez les principales différences et les meilleurs cas d’utilisation pour optimiser votre stratégie de versioning.

En savoir plus
DDD
Silas Joisten

Comprendre le Domain-Driven Design : Une approche pratique pour une architecture logicielle moderne

Découvrez les principes et les modèles du Domain-Driven Design (DDD) tels que le langage ubiquitaire, les agrégats et les contextes délimités. Apprenez comment le DDD s’intègre parfaitement aux projets PHP et Symfony, vous aidant à aligner les logiciels avec les besoins métier.

En savoir plus
White And Purple Modern Professional Partnership Agreement Presentation (5)
Jules Daunay

SensioLabs accueille Inetum dans son réseau de partenaires

SensioLabs et Inetum, leader européen des services et solutions digitales, ont annoncé la signature d’un nouveau partenariat. Ce partenariat permettra à Inetum d’offrir à ses clients un accompagnement renforcé sur leurs développements PHP et Symfony tout au long du cycle de vie de leurs projets.

En savoir plus
Forum-PHP-2023-1
Elise Hamimi

Forum PHP 2023 : Une édition Marvelesque pour SensioLabs

Les 12 et 13 octobre, SensioLabs était à la très attendue édition 2023 du Forum PHP. La conférence française de la communauté PHP a rassemblé plus de 600 personnes pour deux jours de talks passionnants. Cette année, l’AFUP a réitéré l’événement au célèbre hôtel New York – The Art of Marvel à Disneyland Paris ! Nous revenons pour vous sur cette édition dans cet article.

En savoir plus
Platform.sh Partner Gold
Jules Daunay

SensioLabs devient partenaire Gold de Platform.sh

SensioLabs est désormais partenaire Gold de Platform.sh, la solution de Platform as a service (PaaS) tout-en-un. Retour en quelques paragraphes sur le partenariat entre SensioLabs et Platform.sh et sur les raisons pour lesquelles nous sommes ravis de cette nouvelle.

En savoir plus
DSC01848
Elise Hamimi

[2/2] Interview : On vous décrit votre futur job chez SensioLabs

En intégrant SensioLabs, le créateur de Symfony, vous bénéficiez de plusieurs avantages pour vous simplifier la vie et développer dans les meilleures conditions. Dans cette interview, Léna Florence Ourahou et Anaïs Martin, chargées de recrutement chez SensioLabs, vous font le tour des principales informations à connaître avant de postuler.

En savoir plus
DSC06234
Elise Hamimi

[1/2] Interview : Comment se passe le recrutement chez SensioLabs ?

Vous souhaitez rejoindre l’équipe du créateur de Symfony ? Anaïs Martin et Léna Florencia Ourahou, toutes deux chargées de recrutement chez SensioLabs, vous expliquent ce que vous devez savoir avant de postuler et répondent aux questions les plus fréquemment posées.

En savoir plus
Logo SensioLabs
Elise Hamimi

SensioLabs et WeLoveDevs : La parole est aux développeurs !

Il y a quelques mois, WeLoveDevs, le job board et média conçu pour et par des développeurs, nous a rendu visite dans nos locaux à Asnières. Deux interviews vidéo ont été tournées. WeLoveDevs a publié un article de blog sur le témoignage d’un développeur et a organisé un live Twitch. Découvrez dans cet article les différents contenus.

En savoir plus
SensioLabs-Deutschland-announce
Elise Hamimi

SensioLabs se développe en Allemagne

SensioLabs, le créateur de Symfony, a lancé SensioLabs Deutschland avec creativestyle, son partenaire privilégié en Allemagne. SensioLabs Deutschland est la filiale officielle de SensioLabs pour les entreprises allemandes à la recherche d’expertise et de formation sur Symfony et PHP.

En savoir plus
Image